Java中Servlet的生命周期详解

作者:python是最好的语言.java 时间:2023-09-10 03:57:59 

Web基础和HTTP协议

┌─────────┐
┌─────────┐            │░░░░░░░░░│
│O ░░░░░░░│            ├─────────┤
├─────────┤            │░░░░░░░░░│
│         │            ├─────────┤
│         │            │░░░░░░░░░│
└─────────┘            └─────────┘
    │      request 1       │
    │─────────────────────>│
    │      request 2       │
    │─────────────────────>│
    │      response 1      │
    │<─────────────────────│
    │      request 3       │
    │─────────────────────>│
    │      response 3      │
    │<─────────────────────│
    │      response 2      │
    │<─────────────────────│
    ▼                      ▼

我们注意到HTTP协议是一个请求-响应协议,它总是发送一个请求,然后接收一个响应。能不能一次性发送多个请求,然后再接收多个响应呢?HTTP 2.0可以支持浏览器同时发出多个请求,但每个请求需要唯一标识,服务器可以不按请求的顺序返回多个响应,由浏览器自己把收到的响应和请求对应起来。可见,HTTP 2.0进一步提高了传输效率,因为浏览器发出一个请求后,不必等待响应,就可以继续发下一个请求。

HTTP 3.0为了进一步提高速度,将抛弃TCP协议,改为使用无需创建连接的UDP协议,目前HTTP 3.0仍然处于实验推广阶段。

什么是Servlet

JavaEE平台上,处理TCP连接,解析HTTP协议这些底层工作统统扔给现成的Web服务器去做,我们只需要把自己的应用程序跑在Web服务器上。为了实现这一目的,JavaEE提供了Servlet API,我们使用Servlet API编写自己的Servlet来处理HTTP请求,Web服务器实现Servlet API接口,

实现底层功能.

// WebServlet注解表示这是一个Servlet,并映射到地址 hello.do
@WebServlet(urlPatterns = "/hello.do")
public class HelloServlet extends HttpServlet {
   protected void doGet(HttpServletRequest req, HttpServletResponse resp)
           throws ServletException, IOException {
       // 设置响应类型:

resp.setContentType("text/html");
       // 获取输出流:

PrintWriter pw = resp.getWriter();
       // 写入响应:

pw.write("<h1>Hello, world!</h1>");
       // 最后不要忘记flush强制输出:

pw.flush();
   }
}

一个Servlet总是继承自HttpServlet,然后覆写doGet()doPost()方法。注意到doGet()方法传入了HttpServletRequestHttpServletResponse两个对象,分别代表HTTP请求和响应。我们使用Servlet API时,并不直接与底层TCP交互,也不需要解析HTTP协议,因为HttpServletRequestHttpServletResponse就已经封装好了请求和响应。以发送响应为例,我们只需要设置正确的响应类型,然后获取PrintWriter,写入响应即可。

而这样的一个项目最终会打包成一个*.war文件,运行这个文件,需要使用支持ServletAPI的Web容器(Web服务器)。

因此,我们首先要找一个支持Servlet API的Web服务器。

常用的服务器有:

  • Tomcat:由Apache开发的开源免费服务器;

  • Jetty:由Eclipse开发的开源免费服务器;

  • GlassFish:一个开源的全功能JavaEE服务器。

Servlet的生命周期

在通过一个URL路径发起对一个Servlet请求的过程中,其本质是在调用执行Servlet实例的doXXX()方法。该Servlet实例创建和使用的过程,被称为Servlet的生命周期。整个生命周期包括:实例化、初始化、服务、销毁。

  • 实例化:根据Servlet请求的路径(例如:home.do),查找该Servlet实例。如果实例不存在,则通过调用构造方法,完成Servlet实例的创建。

  • 初始化:通过该Servlet实例,调用init()方法,执行初始化的逻辑。

  • 服务:通过该Servlet实例,调用service()方法,如果子类没有重写该方法,则调用HttpServlet父类的service()方法,在父类的该方法中进行请求方式的判断,如果是GET请求,则调用doGet()方法;如果是POST请求,则调用doPost()方法;

如果子类重写doXXX()方法,则调用子类重写后的doXXX()方法;

如果子类没有重写doXXX()方法,则调用父类的doXXX()方法,在父类的方法实现中,返回一个405状态码的错误页面。

405状态码:代表请求的方式服务器不提供支持。

 4.销毁:服务器关闭或重启时,会销毁所有的Servlet实例,会调用Servlet实例的destroy()方法。

Java中Servlet的生命周期详解

package com.my.hyz.web.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//@WebServlet("/home.do")
public class HomeServlet extends HttpServlet {

public HomeServlet() {
System.out.println("实例化");
}
@Override
public void init() throws ServletException {
System.out.println("初始化");
//super.init();
}

@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("调用Service实例");
}

@Override
public void destroy() {
System.out.println("销毁咯!!!!");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("哎呦get到了"+this.hashCode());
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("哎呦post到了");
}
}

Java中Servlet的生命周期详解

来源:https://blog.csdn.net/m0_66605858/article/details/126455259

标签:Java中,Servlet,生命,周期
0
投稿

猜你喜欢

  • java实现微信扫码登录第三方网站功能(原理和代码)

    2023-08-04 00:44:11
  • Spring Boot应用监控的实战教程

    2022-03-02 18:17:09
  • Flutter持久化存储之数据库存储(sqflite)详解

    2022-11-16 04:34:30
  • C#(int)中Convert、Parse、TryParse的区别

    2023-06-25 03:19:50
  • Mybatis查询多条记录并返回List集合的方法

    2023-08-08 05:16:48
  • MyBatis传入集合 list 数组 map参数的写法

    2022-12-02 20:21:45
  • 深入了解c# 匿名类型

    2022-04-08 22:38:21
  • 简单讲解Java设计模式编程中的单一职责原则

    2022-05-02 03:09:24
  • C#判断字符串中内容是否为纯数字的详细教程

    2022-12-05 07:44:38
  • Java MAVEN 工程pom配置报错解决方案

    2023-09-25 18:29:25
  • Java比较问题详细分析

    2023-11-20 14:30:48
  • Spring中Bean扫描原理详情

    2022-05-26 04:33:14
  • Android 实现当下最流行的吸顶效果

    2021-12-30 18:46:33
  • SpringData如何通过@Query注解支持JPA语句和原生SQL语句

    2022-08-26 22:07:29
  • java web手写实现分页功能

    2022-02-04 02:23:15
  • Android实现屏幕旋转方法总结

    2023-04-01 19:37:31
  • Spring boot外部配置(配置中心化)详解

    2022-07-11 23:13:26
  • Android RecyclerView的卡顿问题的解决方法

    2023-07-01 20:01:14
  • Java内部类及其特点的讲解

    2023-06-09 19:39:41
  • Java反射机制在Spring IOC中的应用详解

    2023-11-10 14:09:32
  • asp之家 软件编程 m.aspxhome.com