Servlet生命分为四个阶段:
1.加载
这个阶段由Servlet容器完成。例如tomcat,jetty等。当容器加载一个Servlet后不会立刻实例化它。通常是在用户第一次请求是完成实例化操作。
2.实例化和初始化
在Servlet实例化之后它会调用它的init()方法,在这个方法里可以写上所需的初始化参数,并且该方法只会被调用一次。
*需要注意的是容器创建Servlet实例是通过java反射机制创建的,调用的是默认构造函数,所以编写Servlet类时通常不应提供带参数的构造方法。
3.请求处理
所有的请求都会走service()方法,无论是get请求还是post请求。但是通常情况下你不必关心service方法,你只需要重写HttpServlet类的doGet方法或者doPost方法处理对应的请求。在HttpServlet类中它实现了判断用户请求类型并交给对应的方法进一步处理。
4.服务终止
当容器检测到Servlet实例被销毁时,就会调用destroy()方法。
图 1 Servlet生命周期示意图
*注意:上图中的第2和第3步都是处理用户请求,其实可算做一步。每个request请求都会调用service方法,service方法再解析报头,将请求交给doGet或doPost方法处理。
多的就不说了,上代码
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public TestServlet() {
super();
System.out.println("构造方法运行");
}
public void init(ServletConfig config) throws ServletException {
System.out.println("初始化方法运行");
}
public void destroy() {
System.out.println("Servlet销毁");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doGet方法调用");
response.getWriter().write("Success!");
}
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("Service方法调用");
super.service(request, response);
}
}
配置好web.xml
<servlet> <description></description> <display-name>TestServlet</display-name> <servlet-name>TestServlet</servlet-name> <servlet-class>org.test.TestServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>TestServlet</servlet-name> <url-pattern>/test</url-pattern> </servlet-mapping>
启动tomcat,在浏览器中输入http:localhost:8080/testweb/test
控制台输出为
================================
构造方法运行
初始化方法运行
Service方法调用
doGet方法调用
================================
我的eclipse是设置的热部署,当修改Testservlet时,保存就会重新部署,就会看到destory方法被调用了。
Servlet可以设置在web容器启动是就加载并初始化,只要在web.xml里加上<
load-on-startup
>1</
load-on-startup
>
这个配置,当值为0或者大于0时,表示容器在应用启动时就加载这个servlet,当是一个负数时或者没有指定时,则只是容器在该servlet被选择时才加载。还有就是配置的正数值越小优先级越高。
<servlet> <description></description> <display-name>TestServlet</display-name> <servlet-name>TestServlet</servlet-name> <servlet-class>org.test.TestServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>TestServlet</servlet-name> <url-pattern>/test</url-pattern> </servlet-mapping>
servlet生命周期基本就是这样子了。嘿嘿
转载于:https://blog.51cto.com/5181028/1243443