admin 管理员组

文章数量: 1184232


2024年3月7日发(作者:网页设计工程师)

JSP Servlet生命周期

Servlet与Servlet容器的关系有点像枪和子弹的关系,枪是为子弹而生,而子弹又让枪有了杀伤力。虽然它们是彼此依存的,但是又相互独立发展。从技术角度来说是为了解耦,通过标准化接口来相互协作。

Servlet运行在Servlet容器中,其生命周期由容器来管理。Servlet的生命周期通过t接口中的init()、service()和destroy()方法来表示。Servlet的生命周期包含了下面4个阶段:

1.加载Servlet

Servlet容器负责加载和实例化Servlet。当Servlet容器启动时,或者在容器检测到需要这个Servlet来响应第一个请求时,创建Servlet实例。主要是解析文件,这个文件描述了一个Web应用的关键信息,也是一个Web应用的入口。

Servlet容器可以从本地文件系统、远程文件系统或者网络服务中,通过类加载器加载Servlet类,成功加载后,容器创建Servlet的实例。因为容器是通过Java的反射API来创建Servlet实例,调用的是Servlet的默认构造方法(即不带参数的构造方法),所以在编写Servlet类的时候,不应该提供带参数的构造方法。

2.初始化

在Servlet被实例化之后,Servlet容器将调用Servlet的init()方法初始化这个对象。初始化的目的是为了让Servlet对象在处理客户端请求前完成一些初始化的工作,如建立数据库的连接,获取配置信息等。

在初始化期间,Servlet实例可以通过容器的ServletConfig对象从Web应用程序的配置信息(中)中获取初始化的参数信息。

事实上,Servlet从被中解析到完成初始化,这个过程非常复杂,中间有很多过程,包括各种容器状态的转化引起的监听事件的触发、各种访问权限的控制和一些不可预料的错误发生的判断行为等等。

如果发生错误,Servlet实例可以抛出ServletException异常或者UnavailableException异常来通知容器。ServletException异常用于指明一般的初始化失败,如没有找到初始化参数;而UnavailableException异常用于通知容器该Servlet实例不可用。

3.请求处理

Servlet被初始化之后,就可以处理来自客户端的请求,每一个来自客户端的请求都被描述成一个ServletRequest对象,Servlet的响应被描述成一个ServletResponse对象。

当客户端发出请求时,Servlet引擎传递给Servlet一个ServletRequest对象和一个ServletResponse对象,这两个对象作为参数传递到service()方法中。

在service()方法调用之前,init()方法必须成功执行。在service()方法中,Servlet

实例通过ServletRequest对象得到客户端的相关信息和请求信息,在对请求进行处理后,调用ServletResponse对象的方法设置响应信息。在service()方法执行期间,如果发生错误,Servlet实例也会抛出异常处理。

在多线程的环境下,Servlet必须能处理许多同时发生的请求。但是,如果Servlet执行SingleThreadModel接口,则Servlet只能同时处理一个请求。

Servlet依照Servlet引擎的映射来响应客户端的请求,一个映射对包括一个Servlet实例,以及一个Servlet返回数据的地址。

如果一个映射由多个Servlet实例组成,如一个分布式的Servlet引擎可能运行在不止一个的服务器中,则每一个服务器中都可能有一个Servlet实例,以平衡进程的加载。

4.服务终止

当Servlet容器检测到一个Servlet实例从服务中被移除时,Servlet容器会调用实例的destroy()方法,以便让该实例可以释放它所使用的资源,保存数据到持久存储设备中。

当需要释放内存或者容器关闭时,Servlet容器会调用Servlet实例的destroy()方法。在destroy()方法调用之后,容器会释放这个Servlet实例,该实例随后会被Java的垃圾收集器所回收。如果再次需要这个Servlet处理请求,Servlet容器会创建一个新的Servlet实例。

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


本文标签: 容器 实例 请求 对象 信息