Java登陆第二十八天——Servlet生命周期

发布时间 2023-12-22 17:42:31作者: ocraft

Servlet是运行在Web容器(指Tomcat)的,其生命周期由Web容器控制。

Servlet生命周期

image

Servlet生命周期解析

以下,一个Servlet特指一个实现了Servlet接口的类

  1. 构造

    • Tomcat会使用反射实例化一个Servlet

    • 而实例化类必先会调用某类的构造方法

  2. 初始化:init()

    • 当一个Servlet被实例化后,Tomcat会调用init()方法初始化这个对象

    • 初始化的目的是为了处理请求前,完成某些工作

  3. 服务:service()

    • 处理请求时,Tomcat会调用service()方法进行处理。
  4. 销毁:destroy()

    • 当一个Servlet要从Tomcat中删除时,会调用destroy()方法,从而释放资源。

    • Tomcat关闭时,也会调用destroy()方法

Servlet都要删除了其实也就是Tomcat关闭了。

Servlet生命周期特点

生命周期 执行的时机 执行次数
构造(构造方法) 客户端第一次请求容器启动时 1
初始化(init()) 构造阶段完成后 1
服务(service()) 每次客户端请求 多次
销毁(destroy()) 容器关闭 1

客户端请求的栗子

TestServlet2

@WebServlet("/Test2")
public class TestServlet2 extends HttpServlet {
    public TestServlet2() {
        System.out.println("构造:TestServlet2类被Tomcat反射初始化");
    }

    @Override
    public void init() throws ServletException {
        System.out.println("初始化:Tomcat要做一些服务之前的准备工作");
    }

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("服务:这里是请求报文与响应报文被处理的地方");
    }

    @Override
    public void destroy() {
        System.out.println("销毁:关闭Tomcat时,Servlet会被删除,也就莫得了");
    }
}

客户端请求URL:http://localhost:8080/JavaWeb_war_exploded/Test2

//控制台输出
构造:TestServlet2类被Tomcat反射初始化
初始化:Tomcat要做一些服务之前的准备工作
服务:这里是请求报文与响应报文被处理的地方

客户端再请求URL:http://localhost:8080/JavaWeb_war_exploded/Test2

//控制台输出
服务:这里是请求报文与响应报文被处理的地方

关闭客户端再请求URL:http://localhost:8080/JavaWeb_war_exploded/Test2

//控制台输出
服务:这里是请求报文与响应报文被处理的地方

关闭Tomcat
image

容器启动时栗子

当注解中设置loadOnStartup的值为正整数时(1-5被Tomcat其他服务占了),就会在容器启动时进入构造阶段

TestServlet2

@WebServlet(value = "/Test2",loadOnStartup = 6)
public class TestServlet2 extends HttpServlet {
    public TestServlet2() {
        System.out.println("构造:TestServlet2类被Tomcat反射初始化");
    }

    @Override
    public void init() throws ServletException {
        System.out.println("初始化:Tomcat要做一些服务之前的准备工作");
    }

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("服务:这里是请求报文与响应报文被处理的地方");
    }

    @Override
    public void destroy() {
        System.out.println("销毁:关闭Tomcat时,Servlet会被删除,也就莫得了");
    }
}

启动Tomcat但不请求任何资源
image
也正确进入了构造阶段,初始化阶段会随着构造阶段完成进入