Servlet的生命周期

时间:2022-12-23 07:51:05

## (1)什么是Servlet的生命周期?
Servlet容器如何创建Servlet对象、如何对其进行初始化、如何调用其方法
来处理请求,以及如何销毁该对象的整个过程。
也就是说,容器是如何管理Servlet的。
 
![](life.png)
 
## (2)分成哪几个阶段?
 
### 1)实例化
a.什么是实例化?
 
    容器调用Servlet的构造器,创建Servlet实例(对象)。
 
b.什么时候实例化?
 
    情况1: 容器收到请求之后创建。
    情况2: 容器启动之后,立即创建(需要配置)。
 
        <!--  
          配置启动加载。
          容器启动之后,会立即创建该servlet对象。
          值是一个大于等于零的整数,值越小,优先
          级越高(即优先被创建)
           -->
          <load-on-startup>1</load-on-startup>
    注:
        容器只会创建一个实例!
 
### 2)初始化
a.什么是初始化?
 
    容器在创建servlet实例之后,会立即调用该实例的init方法。
    注:
        init方法只会执行一次!
 
b.GenericServlet已经提供了init方法的简单的实现。
 
    将容器传递过来的ServletConfig对象保存下来了,并且提供了一个
    方法(getServletConfig)来获得该对象。
 
![](init.png)
 
c.初始化参数(局部初始化,只在对应的<servlet><servlet>里面有效,在哪个<servlet><servlet>里面就哪个有效)
 
    step1.配置初始化参数
          <init-param>
              <param-name>company</param-name>
              <param-value>IBM</param-value>
          </init-param>
 
    step2.读取
        String company =  
                config.getInitParameter(
                        "company");
    
 
 
### 3)就绪(调用)
a.什么是就绪?
 
    容器收到请求之后,会调用servlet的service方法来处理。
 
b.HttpServlet已经提供了service方法的实现。
 
    该方法依据请求类型调用对应的doXXX方法。
        比如,get请求会调用doGet方法,post请求会调用doPost方法。
        doXXX方法只是抛出了一个异常。
    作为开发人员,只需要override doXXX方法即可。
    注:
        也可以直接override HttpServlet的service方法。

        
 
### 4)销毁
a.什么是销毁?
 
    容器在删除servlet实例之前,会调用该实例的destroy方法。
    注:
        该方法只会执行一次!
 
b.GenericServlet已经提供了destroy方法的实现。
 
    可以override GenericServlet的destroy方法,来实现
    自己的销毁处理逻辑。
    注:
        在init方法里如果我们获得了一些资源,比如数据库
        Connection等,就需要在destroy方法当中释放这些
        资源。
 
 
## (3)相关的接口与类(了解)
a.Servlet接口
 
    init(ServletConfig config);
    service(ServletRequest req,ServletResponse res);
    destroy();
 
b.GenericServlet抽象类
 
    实现了Servlet接口中的部分方法(init,destroy)
 
c.HttpServlet抽象类
    
    继承了GenericServlet,实现了service方法。