【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中定义成员变量
不得不定义成员变量时
① 不要去修改成员变量的值
② 不要根据成员变量的值做逻辑判断
分类:
Java / JavaWeb
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)