servlet学习笔记之servlet的生命周期

俗话说人有生老病死,月有阴晴圆缺,servlet也不例外,其生命周期被划分四个阶段:加载、初始化、执行、销毁。

加载
Servlet的加载指的是容器将Servlet类别加载JVM并实例化,这个时候Servlet对象还不算具备Servlet该有的功能,只能说是一个纯綷的Java对象,加载Servlet的时机有三种可能:
(1)服务器启动时;
(2)浏览器第一次接收请求时;
(3)管理者要求时。

servlet只需web服务器加载一次就可以在不同的请求之间保持服务。加载阶段完全由web服务器控制,我们无法进行任何干预,而剩下的三个阶段则分别通过servlet的三个方法暴露给我们三个可以操作的接口,通过这三个接口,我们可以为servlet添加自定义功能。

初始化(init())
当一个访问servlet的请求被servlet引擎收到后,它检查servlet是否被载入。如果未载入,servlet引擎使用类装载器得到所需的特定的servlet类,然后调用其构造器取得servlet的一个实例。servlet被装载后,但在其服务于任何请求之前,servlet引擎以下列形式调用一个初始化方法:


public void init() throws ServletException {
// Put your code here
}

通过MyEclipse5.1的默认模板创建servlet时,init方法的形式即为如此。init方法只能够被调用一次。在init()方法中,servlet可以执行任意必须的启动任务,如如建立数据库连接。如发生servlet不能处理请求的任意错误,应该产生溢出UnavailableException,这将防止将请求导入servlet。

除此之外,从servlet2.1之后,我们还可以使用含参数的init方法,声明如下:


public void init(ServletConfig config)throws ServletException

通过config对象,我们可以对servlet上下文和servlet任意初始化参数代码进行访问。比如在web.xml文件中有如下配置:



say hello world by servlet
my hello world servlet
HelloWorldServlet
myName darkmi
com.darkmi.servlet.HelloWorldServlet

那么在init方法中,我们可以按如下方式获取该初始化参数:


String myName = config.getInitParameter(“myName”);

在调用含参数的init方法时,我们一般在方法最后加上:


super.init(config);

其目的是为了兼容Servlet 2.1之前的版本,确保父类别GenericServlet会调用无参数的init()方法:


public class GenericServlet
implements Servlet, ServletConfig {
ServletConfig _config = null;

public void init(ServletConfig) throws ServletException {
_config = config;
log(“init classed”);
init();
}
….
}

执行(service())
init()方法成功完成用后,servlet就开始准备接受请求。缺省只有一个servlet实例被创建。servlet引擎在一单独线程中向实例发送每一请求。被调用的servlet方法声明如下:


public void service(ServletRequest request, ServletResponse response) throws ServletException IOException

ServletRequest对象被servlet引擎创建,充作客户端和请求信息的包容器,可以从中获取客户端浏览器提交的表单信息等等。

类似地,servletResponse对象则作为返回给客户端浏览器信息的包容器。

尽管service()方法很重要,但却很少被使用。原因是大部分servlet设计为在HTTP环境下进行操作,再此环境下,有一个专用的javax.servlet.http包。大部分servlet并不直接扩展javax.servlet.GenericServlet,而是扩展其子类javax.servlet.http.HttpServlet。该子类提供与每一HTTP请求方法对应的处理方法:GET请求由doGet()处理,POST请求由doPost()处理等等。

doGet方法的声明如下:


public void doGet(ServletRequest request, ServletResponse response) throws ServletException IOException

doPost方法的声明如下:


public void doPost(ServletRequest request, ServletResponse response) throws ServletException IOException

HttpServlet中的service(Request, Response)方法把请求和响应对象置入其指定HTTP副本,然后调用service(ServletRequest request, ServletResponse response),检验请求,并调用适当的doGet(),doPost()或其他方法。一个典型的HTTP servlet会跳过这些补充方法中的一个或多个.而不是跳过service()方法。

销毁(destroy())
servlet规范允许servlet引擎在任意时刻卸载servlet。servlet引擎在卸载servlet时会调用其destroy()方法。通过调用destroy()方法,可以释放在init()期间分配的任意资源。需要注意的是,用户调用desboy()实际上不会卸载servlet,只有servlet引擎可以实现此功能。

参考文档:http://caterpillar.onlyfun.net/Gossip/JSPServlet/JSPServlet.htm

此条目发表在java/j2ee分类目录,贴了标签。将固定链接加入收藏夹。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据