简述servlet的生命周期

在Servlet产生到消亡的过程中,有三个生命周期函数,通过javax.servlet.Servlet接口中初始化方法init(),处理客户请求的方法service(),终止方法destroy()来表示。

注意:创建Servlet实例、调用实例的init()和destroy()方法都只进行一次,当初始化完成后,Servlet容器会将该实例保存在内存中

servlet的生命周期包含以下4个阶段:

(1)加载和实例化

Servlet容器负责加载和实例化Servlet。当Servlet容器启动或客户端发送一个请求时,Servlet容器会查找内存中是否存在该Servlet实例,若存在,则直接读取该实例响应请求;如果不存在,就创建一个Servlet实例。

(2) 初始化

实例化后,Servlet容器将调用Servlet的init()方法进行初始化,初始化的目的是为了让Servlet对象在处理客户端请求前完成一些初始化的工作,
对于每一个Servlet实例,init()方法只被调用一次。(该方法执行在单线程的环境下,因此开发者不用考虑线程安全的问题。)在初始化期间,Servlet实例可以使用容器为它准备的ServletConfig对象从Web应用程序的配置信息(在web.xml中配置)中获取初始化的参数信息。在初始化期间,如果发生错误,Servlet实例可以抛出
ServletException异常或者UnavailableException异常来通知容器。

ServletException异常用于指明一般的初始化失败,例如没有找到初始化参数;而

UnavailableException异常用于通知容器该Servlet实例不可用。例如,数据库服务器没有启动,数据库连接无法建立,Servlet就可以抛出

UnavailableException异常向容器指出它暂时或永久不可用。。

(3)服务

初始化后,Servlet处于能响应请求的就绪状态。在service()方法中,

Servlet实例通过ServletRequest对象得到客户端的相关信息和请求信息,在对请求进行处理后(根据不同的请求 转调不同的doXxx()方法),调用ServletResponse对象的方法设置响应信息。在service()方法执行期间,如果发生错误,Servlet实例可以抛出ServletException异常或者UnavailableException异常。如果UnavailableException异常指示了该实

例永久不可用,Servlet容器将调用实例的destroy()方法,释放该实例。此后对该实例的任何请求,都将收到容器发送的HTTP 404(请求的资源不可用)响应

。如果UnavailableException异常指示了该实例暂时不可用,那么在暂时不可用的时间段内,对该实例的任何请求,都将收到容器发送的HTTP 503(服务器暂

时忙,不能处理请求)响应。

注意:为了提高效率,Servlet规范要求一个Servlet实例必须能够同时服务于多个客户端请求,即service()方法运行在多线程的环境下,开发者必须保证该方法的线程安全性。

(4)销毁

当Servlet容器关闭时,Servlet实例也随时销毁。其间,Servlet容器会调用Servlet 的destroy()方法去判断该Servlet是否应当被释放(或回收资源)。

Web服务器在与客户端交互时Servlet的工作过程是:

  1. 在客户端对web服务器发出请求。
  2. web服务器接收到请求后将其发送给Servlet。
  3. Servlet容器为此产生一个实例对象并调用ServletAPI中相应的方法来对客户端HTTP请求进行处理,然后将处理的响应结果返回给web服务器。
  4. web服务器将从Servlet实例对象中收到的响应结构发送回客户端。
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐