Servlet是运行在Web容器(指Tomcat)的,其生命周期由Web容器控制。
Servlet生命周期
Servlet生命周期解析
以下,一个Servlet特指一个实现了Servlet接口的类
-
构造
-
Tomcat会使用反射实例化一个Servlet
-
而实例化类必先会调用某类的构造方法
-
-
初始化:init()
-
当一个Servlet被实例化后,Tomcat会调用init()方法初始化这个对象
-
初始化的目的是为了处理请求前,完成某些工作
-
-
服务:service()
- 处理请求时,Tomcat会调用service()方法进行处理。
-
销毁: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
容器启动时栗子
当注解中设置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但不请求任何资源
也正确进入了构造阶段,初始化阶段会随着构造阶段完成进入