Servlet生命周期
Servlet程序是运行在服务器端的一段Java程序,其生命周期受到Web容器的控制,生命周期包括:加载程序、初始化、服务、销毁、卸载五个部分。
QQ截图20140806191343.png
** 1. 加载Servlet**
Web容器负责加载Servlet,当Web容器启动时或者是在第一次使用这个Servlet时,容器会负责创建Servlet实例,但是用户必须通过部署描述符(web.xml)指定Servlet的位置(Servlet所在的包、类名称),成功加载后,Web容器会通过反射的方式对Servlet进行实例化。
** 2. 初始化**
当一个Servlet被实例化后,容器将调用init()方法初始化这个对象,初始化的目的是为了让Servlet对象在处理客户端请求前完成一些初始化的工作,如建立数据库连接、读取资源文件信息等,如果初始化失败,则此Servlet将被直接卸载。
** 3. 处理服务**
当有请求提交时,Servlet将调用service()方法(常用的是doGet()或doPost())进行处理。在service()方法中,Servlet可以通过ServletRequest接受客户端的请求,也可以通过ServletResponse设置响应信息。
** 4. 销毁**
当Web容器关闭或者检测到一个Servlet要从容器中被删除时,会自动调用destroy()方法,以便让该实例释放掉所占用的资源。
** 5. 卸载**
当一个Servlet调用完destroy()方法后,该实例将被等待被垃圾收集器所回收,如果需要再次使用此Servlet时,会重新调用init()方法初始化。
需要提醒读者的是,在正常情况下,Servlet只会初始化一次,而处理服务会调用多次,销毁也只会调用一次。但是如果一个Servlet长时间不使用的话,也会被容器自动销毁,而如果需要再次使用时会重新进行初始化的操作。即在特殊情况下初始化可能会进行多次,销毁也可能进行多次。
LifeCycleServlet.java
package im.weitang;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LifeCycleServlet extends HttpServlet {
@Override
public void init() throws ServletException {
System.out.println("1、Servlet初始化 ---> init()");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("2、Servlet服务 ---> doGet()、doPost()");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
@Override
public void destroy() {
System.out.println("3、Servlet销毁 ---> destroy()");
}
}
修改web.xml,添加如下代码
<servlet>
<servlet-name>life</servlet-name>
<servlet-class>im.weitang.LifeCycleServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>life</servlet-name>
<url-pattern>/life</url-pattern>
</servlet-mapping>
在默认情况下,初始化方法是在第一次使用时调用,实际上也可以通过配置web.xml文件,在容器启动时就自动为Servlet初始化,只需要直接配置启动选项即可。
<servlet>
<servlet-name>life</servlet-name>
<servlet-class>im.weitang.LifeCycleServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>life</servlet-name>
<url-pattern>/life</url-pattern>
</servlet-mapping>
以上配置完成后,当Web容器启动时,Servlet会自动进行初始化的操作。