【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("正在销毁>>>>>");
    }
}

启动项目,发送请求
image

3.结论

(1)第一次接收请求时,Servlet会进行实例化(调用构造方法)、初始化(init())、调用服务service()
(2)第二次请求后就都是调用service()
(3)当容器关闭时,所有的servlet实例都会被销毁,调用destroy()方法

4.发现

Tomcat只会创建一个Servlet实例,所有的请求都是这个实例去响应。
第一次请求时,Tomcat才会进行实例化、初始化,所以第一次请求时,耗时较长。

5.设置servlet初始化时机

在web.xml配置文件中设置<load-on-startup>,此时重新启动项目,发现servlet实例和初始化直接执行了,发送请求时直接调用服务,
而不是发送请求时才进行实例化和初始化
image

6.Servlet在容器中是:单例的、线程不安全的

- 单例:所有的请求都是同一个实例去响应
- 线程不安全:线程1执行到if语句时,线程2此时修改了num的值,导致线程1执行到了else。

因此:① 尽量不要在servlet中定义成员变量
不得不定义成员变量时
① 不要去修改成员变量的值
② 不要根据成员变量的值做逻辑判断
image

posted @ 2022-07-24 17:20  植树chen  阅读(59)  评论(0编辑  收藏  举报