简述servlet的生命周期(面试过)
简述servlet的生命周期在Servlet产生到消亡的过程中,有三个生命周期函数,通过javax.servlet.Servlet接口中初始化方法init(),处理客户请求的方法service(),终止方法destroy()来表示。注意:创建Servlet实例、调用实例的init()和destroy()方法都只进行一次,当初始化完成后,Servlet容器会将该实例保存在内存中servlet的...
简述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的工作过程是:
- 在客户端对web服务器发出请求。
- web服务器接收到请求后将其发送给Servlet。
- Servlet容器为此产生一个实例对象并调用ServletAPI中相应的方法来对客户端HTTP请求进行处理,然后将处理的响应结果返回给web服务器。
- web服务器将从Servlet实例对象中收到的响应结构发送回客户端。
更多推荐
所有评论(0)