您的位置:首页 > 其它

servlet的生命周期

2014-05-14 23:49 375 查看

几乎每次面试都会提到这个基础的问题,servlet的生命周期的问题。

今天就自己试试

package app.one.servlet;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
* Servlet implementation class helloServlet
*/
public class helloServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static int i = 0;
private static int j = 0;
private static int counter = 0;
@Override
public void init() throws ServletException {
super.init();
System.out.println("Init()"+(++i));
}
/**
* @see HttpServlet#HttpServlet()
*/
public helloServlet() {
super();
}

/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}

/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = (String) request.getParameter("name");
String pass = request.getParameter("pass");
/*request.setAttribute("name", name);
request.setAttribute("pass", pass);*/
/*RequestDispatcher dispatcher = request.getRequestDispatcher("/success.jsp");
dispatcher.forward(request, response);*/
request.getSession().setAttribute("name", name);
request.getSession().setAttribute("pass", pass);
++counter;
System.out.println("doPost() counter = " + counter);
request.getSession().setAttribute("counter", counter);
response.sendRedirect("/servlet/success.jsp");
}

@Override
public void destroy() {
super.destroy();
System.out.println("destroy : " + (++j));
}
}

i是在init方法中使用的计数器

counter是doPost中的计数器

j是destroy中的计数器

我们在浏览器中打开多个窗口去访问这个servlet下边是服务器生成的log

2014-5-14 23:30:59 org.apache.catalina.startup.Catalina start

信息: Server startup in 220 ms

Init()1

doPost() counter = 1

doPost() counter = 2

doPost() counter = 3

2014-5-14 23:36:54 org.apache.coyote.http11.Http11Protocol pause

信息: Pausing Coyote HTTP/1.1 on http-8080

2014-5-14 23:36:55 org.apache.catalina.core.StandardService stop

信息: Stopping service Catalina

destroy : 1

2014-5-14 23:36:55 org.apache.coyote.http11.Http11Protocol destroy

信息: Stopping Coyote HTTP/1.1 on http-8080

不难看出servlet的生命周期了吧!

Init() 和destroy () 在整个生命周期中只执行一次,也正证明了servlet的单实例 doPost()/doGet()其实是多线程

servlet 从第一次被访问时初始化一个单实例,然后在调用doPost()/doGet()

当其它的页面再次访问同一个servlet时,他一直存在已经被创建的实例,直接调用doPost()/doGet()

当服务器关闭时才会调用destroy () 。到此为止servlet的生命周期结束。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: