Servlet总结(三)

Servlet的生命周期

在Servlet为客户端提供服务的整个过程中在服务器内部只有一个对象。

生命全过程:

1)加载ClassLoader

2)实例化 new(客户端的第一次请求过来时,Tomcat调用构造方法,实例化一个Servlet,且只实例化一次)

3)初始化 init(ServletConfig) (Tomcat调用此方法,若重写此方法,可以自己设置一些初始化信息,也只调用一次

4)处理请求 service doGet doPost:

以多线程的方法处理客户端的请求(线程池)

“线程池”:提前准备若干个线程(先跑起来,闲着),当客户端的一个请求过来时,Tomcat分配一个闲的线程来处理

这个请求,当第二个请求过来时,Tomcat分配另外一个闲的线程处理这个请求,...... 。每个线程都是访问同一个Servlet对象。通过这个对象的引用调用Service()方法。

5)退出服务destroy()  (Web应用程序退出或Tomcat重新加载时调用,以关闭打开的资源)

至此Servlet的生命周期结束了。

下面用一个小程序来模拟一下一个Servlet的生命周期:

import java.io.*;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestLifeCycleServlet extends HttpServlet{
	@Override
	public void destroy() {
		System.out.println("destroy...");
	}



	@Override
	public void init() throws ServletException {
		System.out.println("init...");
	}
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		System.out.println("doGet...");
	}
	public TestLifeCycleServlet(){
		System.out.println("Constructor!");//用来观察TestLifeCycleServlet何时被创建
	}
	
}


说明:

1)当启动Tomcat时不会打印Constructor!。

2)当从浏览器输入localhost:8080/myproject/tao时,即收到客户端的一个请求时,首先实例化,打印Constructor!

然后调用init()打印init...,然后调用protected service(),转而调用doGet()打印doGet...,再次刷新网页(一共刷新4次),即多个客户端请求,可以看到,并没有实例化Servlet,而且也没有再调用init()。而是调用doGet()方法,所

以又打印了4次doGet...

3)然后我重启我把destroy()方法中的System.out.println("destroy...")改为:System.out.println("Game over!"),因为你的例的内容发生了变化,Tomcat帮你重新加载一下,这时可以看到打印了destroy...----表示当前Servlet的第一个生命周期已结束。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值