【JavaWeb】Servlet生命周期
1.生命周期
从出生到死亡的过程就是生命周期。
对应Servlet中的三个方法:init(),service(),destroy()
2.实验
public class Demo02Servlet extends HttpServlet {
public Demo02Servlet(){
System.out.println("正在实例化>>>>>");
}
@Override
public void init() throws ServletException {
System.out.println("正在初始化>>>>");
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("正在服务>>>>");
}
@Override
public void destroy() {
System.out.println("正在销毁>>>>>");
}
}
启动项目,发送请求
3.结论
(1)第一次接收请求时,Servlet会进行实例化(调用构造方法)、初始化(init())、调用服务service()
(2)第二次请求后就都是调用service()
(3)当容器关闭时,所有的servlet实例都会被销毁,调用destroy()方法
4.发现
Tomcat只会创建一个Servlet实例,所有的请求都是这个实例去响应。
第一次请求时,Tomcat才会进行实例化、初始化,所以第一次请求时,耗时较长。
5.设置servlet初始化时机
在web.xml配置文件中设置<load-on-startup>
,此时重新启动项目,发现servlet实例和初始化直接执行了,发送请求时直接调用服务,
而不是发送请求时才进行实例化和初始化
6.Servlet在容器中是:单例的、线程不安全的
- 单例:所有的请求都是同一个实例去响应
- 线程不安全:线程1执行到if语句时,线程2此时修改了num的值,导致线程1执行到了else。
因此:① 尽量不要在servlet中定义成员变量
不得不定义成员变量时
① 不要去修改成员变量的值
② 不要根据成员变量的值做逻辑判断