Servlet的生命周期由Servlet容器管理,包含如下几个步骤:
1. 装载Servlet类;
2. 创建Servlet的实例;
3. 调用Servlet的init()方法;
4. 调用Servlet的service()方法;
5. 调用Servlet的destroy()方法;
第1, 2, 3步属于servlet初始化过程,在Servlet的生命周期中,只会执行一次。
在哪些情形下Servlet会被初始化呢?
1). 在web.xml里配置了<load-on-startup>时,会在容器启动时初始化Servlet;
test com.code.servlets.TestServlet 1
2). 在第一次请求到Servlet时;
3). 服务器管理员可以直接向容器发出初始化Servlet的请求。
第4步会在每次HTTP请求到Servlet时执行。
第5步在容器卸载Servlet时执行。
下图说明了这5个步骤:
装载Servlet类
在调用一个Servlet前,容器必须先装载Servlet的类定义。这个过程和装载其它的类一样。
创建Servlet的实例
装载Servlet类定义后,容器会创建Servlet实例。
通常,Servlet类只有一个实例,并发地处理请求。但如果在web.xml里这样配置,会有多个类的实例:
test com.code.servlets.TestServlet test1 com.code.servlets.TestServlet
调用Servlet的init()方法
创建Servlet实例后,容器会调用实例的init()方法进行初始化。init()方法允许Servlet实例在处理请求前先初始化自身。
可以在web.xml里给Servlet指定初始化参数。
调用Servlet的service()方法
每次Servlet接收到请求时,会调用service() 方法。对于 HttpServlet 的子类来说,通常调用doGet(), doPost() 方法。
Servlet一旦被初始化后, service() 在Servlet的生命周期中会被多次调用。
调用Servlet的destroy()方法
当容器关闭或者重新装载整个web application 时,容器会卸载Servlet,调用它的destroy()方法。这一步骤只执行一次。
destroy()方法一般用于释放不能被垃圾回收机制回收的资源,如数据库的连接。
see also :