首页 理论教育JavaWeb应用开发:Servlet生命周期

JavaWeb应用开发:Servlet生命周期

【摘要】:Servlet 作为一种在Servlet 容器中运行的组件,必然有一个从创建到销毁的过程,这个过程通常被称为Servlet 的生命周期。Servlet 的生命周期包括加载、实例化、初始化、服务和销毁几个阶段。下面是具体的Servlet 生命周期,如图2.9 所示。图2.9Servlet 生命周期Servlet 容器装载Servlet 类,并实例化一个Servlet 实例对象。初始化的过程主要是读取永久的配置信息、读取初始化参数、连接数据库等,通常这些都是在Servlet 的整个生命周期仅仅需要执行一次的操作。

Servlet 作为一种在Servlet 容器中运行的组件,必然有一个从创建到销毁的过程,这个过程通常被称为Servlet 的生命周期。Servlet 的生命周期包括加载、实例化、初始化、服务和销毁几个阶段。这个生命周期由javax.servlet.Servlet 接口的init()、service()和destroy()方法所定义。

下面是具体的Servlet 生命周期,如图2.9 所示。

图2.9 Servlet 生命周期

(1)Servlet 容器装载Servlet 类,并实例化一个Servlet 实例对象。

(2)Servlet 容器调用该实例对象的init()方法进行初始化。

(3)如果Servlet 容器收到对该Servlet 的请求,则调用此实例对象的service()方法处理请求并返回响应结果。

(4)Servlet 容器在销毁该Servlet 实例前调用它的destroy()方法。

1.加载和实例化

Servlet 容器负责加载和实例化Servlet,这个过程可以在Servlet 容器启动时执行,或者在Servlet 容器收到对某个Servlet 的请求时才执行,也可以在两者之间的任何时候执行。

2.初始化

在Servlet 加载并实例化后,Servlet 容器必须进一步初始化Servlet,初始化成功后它才能够开始处理客户端请求。初始化的过程主要是读取永久的配置信息、读取初始化参数、连接数据库等,通常这些都是在Servlet 的整个生命周期仅仅需要执行一次的操作。

Servlet 容器通过调用Servlet 的init()方法来完成Servlet 的初始化。init()方法是在Servlet 接口中定义的,但在GenericServlet 中提供了默认实现,因此如果需要在Servlet 的初始化中加入自己特定的处理,就需要重写这个方法。

在init()方法中,Servlet 创建和被初始化它在处理请求时需要用到的资源。在javax.servlet.Servlet 接口中,init()方法的定义如下:

(www.chuimin.cn)

当Servlet 容器调用init()方法时,需要传递参数servletConfig 对象。在重写init()方法时,可通过ServletConfig 对象来获取初始化参数。一般采用如下的方式重写init()方法:

为了简化init()方法的重写方式,可以使用javax.servlet.GenericServlet 类中定义的一个不需要参数的init()方法。当Servlet 容器调用init(ServletConfig config)方法时,该方法会自动调用重写的不带参数的init()方法。一般采用如下方式定义一个不带参数的init()方法:

如果想在该方法中使用ServletConfig 对象,可以通过直接调用getServletConfig()方法来实现。需要注意的是,init()方法不能反复调用,一旦调用就会重载Servlet,所以直到调用destroy()方法卸载Servlet 后才能再次调用。

3.服务

Servlet 被初始化之后,就可以开始处理来自客户端的请求。当Servlet 容器接收到客户端的一个请求时,Servlet 容器就会创建一个ServletRequest 请求对象和一个ServletResponse 响应对象,然后将这两个对象作为参数传递给对应Servlet 对象的service()方法。

service()方法是Servlet 的核心。每当一个客户请求一个HttpServlet 对象,该对象的service()方法就要被调用,而且传递给这个方法一个“ 请求”(ServletRequest)对象和一个“响应”(ServletResponse)对象作为参数。在HttpServlet 中已存在service()方法。缺省的服务功能是调用与HTTP 请求的方法相应的do 功能。例如,如果HTTP 请求方法为GET,则缺省情况下就调用doGet()。Servlet 应该为 Servlet 支持的 HTTP 方法覆盖 do 功能。 因为HttpServlet.service()方法会检查请求方法是否调用了适当的处理方法,不必要覆盖service()方法。只需覆盖相应的doXXX 方法就可以了。

当一个客户通过HTML 表单发出一个HTTP POST 请求时,doPost()方法被调用。与POST 请求相关的参数作为一个单独的HTTP 请求从浏览器发送到服务器。当需要修改服务器端的数据时,应该使用doPost()方法。

当一个客户通过HTML 表单发出一个HTTP GET 请求或直接请求一个URL 时,doGet()方法被调用。与GET 请求相关的参数添加到URL 的后面,并与这个请求一起发送。当不会修改服务器端的数据时,应该使用doGet()方法。

4.销毁

当容器检测到一个Servlet 实例应该从服务中移除的时候,容器就会调用实例的destroy()方法,以便让该实例可以释放它所使用的资源,保存数据到持久存储设备中。当需要内存或者容器关闭时,容器就会调用Servlet 实例的destroy()方法。在destroy()方法调用之后,容器会释放这个Servlet 实例,该实例随后会被Java 的垃圾收集器所回收。如果再次需要这个Servlet 处理请求,Servlet 容器会创建一个新的Servlet 实例。

在整个Servlet 的生命周期过程中,创建Servlet 实例、调用实例的init()和destroy()方法都只进行一次,当初始化完成后,Servlet 容器会将实例保存到内存中,通过调用它的service()方法为接收的请求服务。