servlet有良好的生存期的定义,包括如何加载、实例化、初始化、处理客户端请求以及如何被移除。这个生存期由javax.servlet.Servlet接口的init,service和destroy方法表达。那么Servlet是何时被加载和实例化的呢?很多人认为是在容器启动的时候。这个观点是在一定条件下才成立的。我们来看一个例子:
//TestServlet.java
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestServlet extends javax.servlet.http.HttpServlet {
static final long serialVersionUID = 1L;
public TestServlet() {
super();
System.out.println("实例化Servlet.");
}
public void destroy() {
// TODO Auto-generated method stub
super.destroy();
System.out.println("销毁Servlet.");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("正在处理请求.");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
public void init() throws ServletException {
// TODO Auto-generated method stub
super.init();
System.out.println("初始化Servlet.");
}
}
<!--web.xml-->
<servlet>
<display-name>TestServlet</display-name>
<servlet-name>TestServlet</servlet-name>
<servlet-class>TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/TestServlet</url-pattern>
</servlet-mapping>
我们启动Tomcat服务器,在控制台中我们并没有看到“实例化Servlet.初始化Servlet.”的打印信息;我们在浏览器中输入此Servlet的URL来请求此Servlet,控制台中打印出“实例化Servlet.初始化Servlet.正在处理请求.”的信息。这说明,Servlet的加载和实例化是发生在第一次请求Servlet之前发生的。接下来我们在web.xml文件中的Servlet下面加上“1”这一句配置,重复上面的过程。发现在启动Tomcat服务器时就看到了“实例化Servlet.初始化Servlet.”的打印信息;请求的时候只打印了“正在处理请求”信息。这说明,Servlet的加载和实例化是发生在容器启动的时候发生的。当我们把配置改为“-1”,结果和第一种相同。
如此说来,什么时候加载和实例化Servlet是由“1”配置来决定的。同意初始化发生在实例化Servlet之后。
//TestServlet.java
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestServlet extends javax.servlet.http.HttpServlet {
static final long serialVersionUID = 1L;
public TestServlet() {
super();
System.out.println("实例化Servlet.");
}
public void destroy() {
// TODO Auto-generated method stub
super.destroy();
System.out.println("销毁Servlet.");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("正在处理请求.");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
public void init() throws ServletException {
// TODO Auto-generated method stub
super.init();
System.out.println("初始化Servlet.");
}
}
<!--web.xml-->
<servlet>
<display-name>TestServlet</display-name>
<servlet-name>TestServlet</servlet-name>
<servlet-class>TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/TestServlet</url-pattern>
</servlet-mapping>
我们启动Tomcat服务器,在控制台中我们并没有看到“实例化Servlet.初始化Servlet.”的打印信息;我们在浏览器中输入此Servlet的URL来请求此Servlet,控制台中打印出“实例化Servlet.初始化Servlet.正在处理请求.”的信息。这说明,Servlet的加载和实例化是发生在第一次请求Servlet之前发生的。接下来我们在web.xml文件中的Servlet下面加上“1”这一句配置,重复上面的过程。发现在启动Tomcat服务器时就看到了“实例化Servlet.初始化Servlet.”的打印信息;请求的时候只打印了“正在处理请求”信息。这说明,Servlet的加载和实例化是发生在容器启动的时候发生的。当我们把配置改为“-1”,结果和第一种相同。
如此说来,什么时候加载和实例化Servlet是由“1”配置来决定的。同意初始化发生在实例化Servlet之后。