servlet的生命周期

1 篇文章 0 订阅
1 篇文章 0 订阅

几乎每次面试都会提到这个基础的问题,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的生命周期结束。


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值