容器与Servlet生命周期

1)容器大致功能有如下:

一、通信支持
无需自己建立监听端口、流、Socket等,容器知道与Web服务器的协议,所以不必担心自己的代码如何与服务器进行通信,交给容器就好
二、生命周期管理
容器可以自动加载类、实例化和初始化servlet、调用Servlet方法,并是得Servlet被回收
三、多线程支持
容器会自动给接收到的每一个Servlet创建一个线程并管理这些线程
四、声明方式实现安全
利用容器可以使用XML来配置修改安全性
五、JSP支持
容器负责把JSP翻译成java。JSP在容器中被编译和运行

2)容器如何处理请求:

一、容器生成两个请求响应对象:HttpServletRequest和HttpServletResponse。HttpServletRequest和HttpServletResponse不是单独存在还要继承自ServletRequest和ServletResponse的接口原因是万一使用别的协议可以继承ServletRequest和ServletResponse。

二、容器根据根据请求中的URL找到正确的servlet并为请求和响应对象创建或者分配一个线程。**注
意每个客户请求都在一个单独的线程中进行处理,即容器运行多个线程来处理对一个servlet的多个
请求(容器通过调度线程从线程池分配工作线程执行请求)。**此时多个servlet线程会去争夺一个
servlet资源,会有同步问题产生。

三、线程调用servlet的service(request,response)方法,service(request,response)会根据类型调用
doGet(request,response)或者doPost(request,response) 方法。此外,线程有自己的方法栈,
service(request,response)方法总是在线程自己的栈中调用。

四、doGet(request,response)生成动态页面,把页面送入HttpServletResponse对象。

五、结束线程(撤销或者放回线程池),容器将HttpServletResponse转换为HTTP响应传给客户端,然后
删除请求响应对象。

3)servlet生命周期:
一、寻找类
容器启动时。它会自动寻找已部署的Web应用,并搜索servlet文件。

二、加载类
客户端发送请求到服务器容器启动时加载servlet类。servlet在没有完全初始化之前绝对不能运行service()方法。

三、执行servlet的无参构造函数,生成一个servlet对象

四、执行init(ServletConfig)方法进行初始化(init()被init(ServletConfig)调用)
注意init()在一个servlet的生命周期里**只执行一次!**而且必须在调用service()方法前执行完毕。init()内含初始化代码,如得到一个数据库连接等。那么可不可以将init()的代码全部放在构造函数中呢?**答案是否定的。**因为在调用构造函数的时候servlet并没有被建立,但是一些初始化参数可能需要servlet对象。这时就会导致初始化失败。所以不能再servlet的构造函数中放任何东西!

public void init(ServletConfig config) throws ServletException {
	this.config = config;
	this.init();
}

可以看出init()是被init(ServletConfig)调用。容器为servlet对象建立一个ServletConfig对象,然后调用init()。两者分开的原因是因为以前有人复写init(ServletConfig)时会忘记调用super.init(ServletConfig),这就导致Override的方法中没有ServletConfig对象。分开后只需要Override init()方法即可,无需关系ServletConfig的获取。
五、执行service()方法
servlet开始处理客户请求(doGet()、doPost() 等)。servlet的一生主要从这里度过

六、执行destroy()方法清理资源
注意destroy()方法不是回收servlet对象,而是在servlet对象被回收之前清理资源。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章