Servlet的生命周期就是servlet对象从创建到销毁的全过程。具体分为以下两种情况:
一般情况下其生命周期从第一次收到请求开始,到服务器关闭结束
例:用eclipse新建一个Web2.5项目“nimei”,在该项目中新建一个包“com.jpc.one”,在其中新建一个servlet文件“TestServlet.java”:
package com.jpc.one;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
//构造方法方法只执行一次,默认情况下第一-次请求该Servlet时执行;<load- on-startup>1</load-on-startup>则随项目发布而执行
public TestServlet() {
System.out.println("创建TestServlet对象");
}
//init方法只执行一次,默认情况下第一-次请求该Servlet时执行;<load- on-startup>1</load-on-startup>则随项目发布而执行
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("初始化TestServlet对象");
super.init(config);
}
//servlet中如果写了service方法,则一定会执行该方法,如果调用了父类的service方法,则判断是post还是get请求,区分执行doPost还是doGet方法
@Override
protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
System.out.println("接收请求一定执行service");
super.service(arg0, arg1);
}
//处理get请求
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("接收请求选择执行doGet");
}
//处理post请求
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("接收请求选择执行doPost");
}
//服务器关闭时销毁该servlet之前执行该方法
@Override
public void destroy() {
System.out.println("销毁TestServlet对象");
}
}
将该servlet文件添加进tomcat服务器,然后启动服务,我们看到启动服务后tomcat根目录下webapps文件夹下的“nimei”文件夹中立刻出现了class文件,但是左边eclipse的控制台并没有打印任何内容,此时仅仅是tomcat将DataServlet文件进行了编译然后放在了其工作目录中等待浏览器客户端的请求:
这时在浏览器地址栏输入“127.0.0.1/nimei/TestServlet”然后回车,我们看到eclipse控制台依次打印出了也打印出了如下内容,此时该servlet的生命周期正式开启!
此后再次请求该servlet,eclipse控制台只会打印出service和doGet方法的输出语句,因为其创建对象(执行构造方法)以及初始化(执行init方法)已经在第一次请求时完成!
- 这时如果将tomcat工作目录下的“TestServlet.class”文件删除,再次请求该servlet,浏览器将出现“500”错误提示,并且eclipse控制台也会出现“ClassNotFoundException”的异常提示
- 此时如果将“TestServlet.class”做一下修改(哪怕加个空格都行),再次保存,重启tomcat,会将该文件再次编译,将class文件放进其工作目录中,再次请求该servlet就会重新得到响应(执行构造方法–>执行init方法–>执行service–>执行doPost/doGet方法)
当我们将tomcat服务关闭,将在eclipse控制台打印“销毁TestServlet对象”,此时该servlet的生命周期正式结束!
如果在web.xml 中配置了load-on-startup则该servlet的生命周期是从服务器开启到服务器关闭
<load-on-startup>标签中的数字的意义是加载的顺序,因为一个Web项目中通常不只有一个servlet文件,因此用该标签来控制每个servlet文件的加载顺序:
<servlet>
<servlet-name>TestServlet</servlet-name>
<servlet-class>com.jpc.one.TestServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
此时一经开启服务,在eclipse控制台就会打印如下内容,此时该servlet的生命周期正式开启!
当发送第一次请求给该servlet时,在eclipse控制台就会打印如下内容:
将tomcat服务关闭,将在eclipse控制台打印“销毁TestServlet对象”,此时该servlet的生命周期正式结束!