Servlet的生命周期定义了一个Servlet如何被加载、初始化,以及它怎样接收请求、响应请求、提供服务。
在代码中,Servlet生命周期由接口javax.servlet.Servlet定义。所有的Java Servlet
必须直接或间接地实现javax.servlet.Servlet接口,这样才能在Servlet Engine上运行。Servlet Engine提供network
Service,响应MIME request,运行Servlet Container。
javax.servlet.Servlet接口定义了一些方法,在Servlet
的生命周期中,这些方法会在特定时间按照一定的顺序被调用。如下图所示。
Servlet的生命周期
Servlet
如何被加载(Load)、被实例化(Instantiated)
Servlet
Engine负责实例化和加载Servlet,这个过程可以在Servlet Engine 加载时执行,可以在Servlet
响应请求时执行,也可以在两者之间的任何时候执行(配置为load on start up的
servlet是在容器启动时被加载的)。
Servlet如何被初始化(Initialized)
Servlet Engine 加载好Servlet
后,必须要初始化它。初始化时Servlet可以从数据库里读取初始数据,建立JDBC
Connection,或者建立对其他有价值的资源的引用。
在初始化阶段,Init(
)方法被调用。这个方法在javax.servlet.Serlet接口中定义。Init( )方法以一个Servlet配置文件(ServletConfig
型)为参数。Servlet configuration 对象由Servlet Engine实现,可以让Servlet
从中读取一些name-value对的参数值。ServletConfig对象还可以让Servlet接受一个Servlet
Context对象。
Servlet
如何处理请求
Servlet
被初始化以后,就处于能响应请求的就绪状态。每个对Servlet 的请求由一个Servlet Request 对象代表。Servlet
给客户端的响应由一个Servlet Response对象代表。当客户端有一个请求时,Servlet Engine将ServletRequest
和ServletResponse对象都转发给Servlet,这两个对象以参数的形式传给Service方法。这个方法由javax.servlet.Servlet定义并由具体的Servlet
实现。
Servlet还可以实现
ServletRequest 和ServletResponse接口。ServletRequest接口可以让Servlet获取客户端请求中的参数,如form
data、request信息、协议类型,等等。Servlet可以从ServletInputStream流中读取request
数据。ServletResponse接口允许Servlet设置response headers和status
codes。实现这个接口可以使Servlet能访问ServletOutputStream流用来向客户端返回数据。
Servlet如何被释放
Servlet Engine
没有必要在Servlet生命周期的每一段时间内都保持Servlet的状态。Servlet
Engine可以随时随意使用或释放Servlet。因此,你不能依赖Servlet class或其成员存储信息。当Servlet
Engine判断一个Servlet应当被释放时(比如说Engine准备Shut down或需要回收资源),Engine必须让Servlet
能释放其正在使用的任何资源,并保存持续性的状态信息。这些可以通过调用Servlet的destroy方法实现。 在Servlet Engine
释放一个Servlet以前,必须让其完成当前实例的service方法或是等到timeout(如果Engine定义了timeout)。当Engine释放一个
Servlet以后,Engine将不能再将请求转发给它,Engine必须彻底释放该Servlet并将其标明为可回收的(给garbage
collection)。
在Servlet
API中最重要的是Servlet
interface。所有的Servlets执行这个interface的方式有很多种:或者是直接的,或者通过extending这个class执行它,如
HttpServlet。这个Servlet interface 提供并安排Servlet与客户端联系的方法。Servlet
编写者可以在他们开发Servlet程序时提供更多一些或所有这样的方法。
当一个Servlet接收来自客户端的调用请求时,它接收两个对象:一个是ServletRequest,另外一个是ServletResponse。这个ServletRequest
class 概括从客户端到服务器之间的联系,而 ServletResponse class
概括从Servlet返回客户端的联系。
ServletRequest
interface
可以获取到这样一些信息,如由客户端传送的参数名称,客户端正在使用的协议,产生请求并且接收请求的服务器远端主机名。它也提供获取数据流的Servlet、ServletInputStream,这些数据是客户端引用中使用HTTP
POST和PUT方法递交的。一个ServletRequest的子类可以让Servlet获取更多的协议特性数据。
例如,HttpServletRequest
包含获取HTTP-specific头部信息的方法。ServletResponse interface
给出相应客户端的Servlet方法。它允许Servlet设置内容长度和回应的MIME类型,并且提供输出流ServletOutputStream,
通过编写者可以发回相应数据。ServletResponse子类可以给出更多protocol-specific容量的信息。例
如,HttpServletResponse包含允许Servlet操作HTTP-specific头部信息的方法。
Servlet的定义及生命周期,布布扣,bubuko.com
原文:http://www.cnblogs.com/showking/p/3597180.html