生命周期,就是一个java对象从最初被创建到最终被销毁经历的所有过程。
一、实例化:Servlet容器创建Servlet的实例
Servlet对象是单例,因为不符合单例测试,所以只能称为伪单例。真单例的构造方法是私有化的,Tomcat服务器是支持多线程的。所以Servlet对象在单实例多线程的环境下运行的。如果Servelet对象中有实例变量,并且实例变量涉及到修改操作,那么这个Servlet对象一定会存在线程安全问题,不建议在Servlet对象中使用实例变量,尽量使用局部变量。
PS:Servlet类的构造方法只执行一次
二、初始化:该容器调用init(ServletConfig)方法
init()方法是Servlet生命的起点,用于创建或打开任何与Servlet相关的资源以及执行初始化工作。
通过调用Servlet的init() 方法来完成初始化工作,这个方法是在Servlet已被创建但向客户端提供服务之前调用的。
当用户调用一个 Servlet 时,就会创建一个 Servlet 实例,每一个用户请求都会产生一个新的线程,适当的时候移交给 doGet 或 doPost 方法。init() 方法简单地创建或加载一些数据,这些数据将被用于 Servlet 的整个生命周期。
init 方法的定义:
public void init() throws ServletException{
// 初始化代码
}
PS:init()方法只会被调用一次。
三、服务:如果请求Servlet,该容器调用service()方法
service()方法是Servlet中真正处理客户端传过来的请求的方法,它根据HTTP 请求方法(GET/POST/PUT/DELETE等)将请求分发到doGet()、doPost()、doPut()、doDelete() 等方法。
当用户到达Servlet的请求,Servlet容器会创建一个特定于这个请求的ServletRequest对象与ServletResponse对象,并调用Servlet的service方法。service方法会从ServletRequest对象获得客户请求信息,然后处理这个请求,并通过ServletResponse对象向客户返回响应的信息。
service()方法的定义:
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException{
}
PS:service方法,只要用户请求一次,则执行一次。
doGet()方法的定义:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
doPost()方法的定义:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
四、销毁:销毁实例之前调用destory()方法
destroy()方法释放任何在init()方法中打开的与Servlet相关的资源。
容器在销毁Servlet之前需要调用destroy()方法,让Servlet自己释放其占用的系统资源,一旦destroy方法被调用,容器就不会再向这个Servlet发送任何请求消息了。如果容器需要这个Servlet,那么就必须重新创建并初始化一个实例。
destroy()方法的定义:
public void destroy(){
// 终止化代码...
}
PS:destroy()方法只会被调用一次。
总结:
Servlet的生命周期分为:实例化、初始化、服务和销毁四个阶段:
- 实例化:伪单例的Servlet对象
- 初始化:servlet实例一旦创建,就开始初始化一些参数配置,我们可以做一些参数配置,比如编码,可以在web.xml或注解中配置
- 服务:当发送对应的servlet请求时,会调用service()方法,这时不会重新创建servlet实例,也不会调用init()方法
- 销毁:调用了destroy()方法后,当前servlet实例将会被标记为回收垃圾,会对servlet实例进行清除处理