您的位置:首页 > 其它

Servlet生命周期

2014-01-05 18:32 323 查看
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方法处理。

多的就不说了,上代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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

1
2
3
4
5
6
7
8
9
10
<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被选择时才加载。还有就是配置的正数值越小优先级越高。

1
2
3
4
5
6
7
8
9
10
11
<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生命周期基本就是这样子了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: