10. Servlet入门 - Servlet的生命周期

Servlet 生命周期概述

一个Servlet 对象从创建到销毁的过程

Servlet 生命周期方法

1、执行 Servlet 构造器方法

2、执行 init 初始化方法

第一、二步,是在第一次访问,的时候创建 Servlet 程序会调用。

3、执行 service 方法

第三步,每次访问都会调用。

4、执行 destroy 销毁方法

第四步,在 web 工程停止的时候调用。

代码演示

1.创建Servlet的构造方法


10. Servlet入门 - Servlet的生命周期_spring


2.在 init 初始化方法,设置打印信息

10. Servlet入门 - Servlet的生命周期_多线程_02


3.在 service 方法,设置打印信息

10. Servlet入门 - Servlet的生命周期_servlet_03


4.在destory 销毁方法,设置打印信息

10. Servlet入门 - Servlet的生命周期_java_04


6.启动 tomcat 服务,访问 servlet

  • 第一次访问 Servlet 将会执行 构造器方法、init 方法、service 方法

10. Servlet入门 - Servlet的生命周期_多线程_05


  • 第二次访问只会执行 service 方法

10. Servlet入门 - Servlet的生命周期_多线程_06


7.停止 tomcat 服务,触发 destory 方法

10. Servlet入门 - Servlet的生命周期_java_07


Servlet生命周期描述

  1. 常规【重点】
    默认情况下, 来了第一次请求, 会调用init()方法进行初始化【调用一次】
    任何一次请求 都会调用service()方法处理这个请求
    服务器正常关闭或者项目从服务器移除, 调用destory()方法进行销毁【调用一次】
  2. 扩展
    servlet是单例多线程的, 尽量不要在servlet里面使用全局(成员)变量,可能会导致线程不安全
    单例: 只有一个对象(init()调用一次, 创建一次)
    多线程: 服务器会针对每次请求, 开启一个线程调用service()方法处理这个请求

load-on-startup 启动项

在上面的示例中,我们通过Servlet的构造器打印信息得知,Servlet是在第一次请求的时候创建的。

那么下面带来一个需求问题。

如果我想在创建 Tomcat 服务的时候,在请求来之前,同时创建 Servlet,那么该怎么配置呢?

这个需求在后续  在SpringMVC里面会遇到。

这个时候,我们就需要依赖 ​​load-on-startup​​ 启动项参数来配置了。

这个参数有两种配置方式,如下:

web.xml 配置 load-on-startup 的方式

10. Servlet入门 - Servlet的生命周期_多线程_08


1555981767256

WebServlet 注解配置  load-on-startup 的方式

  • 默认情况下,没有配置 loadOnStartup, Servlet 在 tomcat 服务启动后,不会立即创建,只会在第一次请求到来,才会创建
    10. Servlet入门 - Servlet的生命周期_spring_09
  • 当设置了 loadOnStartup 参数,则启动 tomcat 服务的时候,立即创建 Servlet 对象
    10. Servlet入门 - Servlet的生命周期_多线程_10
@WebServlet(value = "/demo3", loadOnStartup = 1) // loadOnStartup 配置的值越小,优先级越高

小结

  1. Servlet生命周期方法
  • init() 初始化
  • service() 服务
  • distory() 销毁

Servlet生命周期描述

默认情况下, 第一次请求的时候, 调用init()方法进行初始化【调用一次】

任何一次请求, 都会调用service()方法进行处理这个请求

服务器正常关闭/项目从服务器移除, 调用destory()方法进行销毁【调用一次】

Servlet是单例多线程的