在 Java 中,对象的生命周期被定义为该对象从创建直到销毁的整个过程。任何对象都有生命周期,Servlet 也不例外。在学习 Servlet 生命周期之前,我们先来看一下 Servlet 的一些常见方法,这些方法非常重要,它们贯穿着 Servlet 整个生命周期!
与 Servlet 生命周期有关的方法一般有以下三个:
init() 方法是在创建 Servlet 对象时被调用,而且只能被调用一次,用于 Servlet 对象在整个生命周期内的唯一一次初始化。只有在 init() 方法调用成功后,Servlet 才会处于服务状态,才能够去处理客户端的请求。
service() 方法是 Servlet 工作的核心方法。当客户端请求访问 Servlet 时,Servlet 容器就会调用 service() 方法去处理来自客户端的请求,并把处理后的响应返回给客户端。
destory() 方法是 Servlet 容器回收 Servlet 对象之前调用的,且只会调用一次,而此时的服务器处于停止状态或者访问资源已经被移除。
介绍完以上几个方法,咱们再来讲 Servlet 的生命周期,大概流程可以用下图来诠释。
图1描述了 Servlet 的完整生命周期,按照功能的不同,大致可以将 Servlet 的生命周期分为三个阶段,分别是初始化阶段、运行阶段和销毁阶段。
当用户第一次向 Servlet 容器发出 HTTP 请求要求访问某个 Servlet 时,Servlet 容器会在整个容器中搜索该 Servlet 对象,发现这个 Servlet 对象没有被实例化,于是创建这个 Servlet 对象,然后调用该对象的 init() 方法完成初始化。
当用户第二次访问这个 Servlet 时,Servlet 容器仍然在容器中搜索该 Servlet 对象,结果找到了该对象的实例,则不去创建而直接使用该对象。
找到了对应的 Servlet 对象,随后 Servlet 进入到运行阶段。
需要注意的是,在 Servlet 的整个生命周期内,它的 init() 方法只被调用一次。
这是 Servlet 生命周期中最核心的阶段。在该阶段中,Servlet 容器会为当前的请求创建一个 ServletRequest 对象和一个 ServletResponse 对象(它们分别代表 HTTP 请求和 HTTP 响应),并将这两个对象作为参数传递给 Servlet 的 service() 方法。
service() 方法从 ServletRequest 对象中获得用户的详细请求信息并处理该请求,通过 ServletResponse 对象生成响应结果。
需要强调的是,在 Servlet 的整个生命周期内,用户每次请求访问 Servlet 时,Servlet 容器都会调用一次 Servlet 的 service() 方法,并且创建新的 ServletRequest 和 ServletResponse 对象。
当服务器停止时,Servlet 容器需要回收 Servlet 对象所占用的内存,在回收之前,会自动调用该对象的 destroy() 方法做好回收内存前的准备,辟如关闭后台线程。
和 init() 方法类似,destroy() 方法也只会被调用一次。
注意:Servlet 对象一旦创建就会驻留在内存中一直等待客户端的访问,直到服务器关闭或项目被移除出容器时,Servlet 对象才会被销毁。
对 Servlet 声明周期的几点汇总:
Servlet 对象的创建、对象提供服务、对象的销毁等操作皆由 Servlet 容器来管理,Java 程序员的任务只是负责编写 Servlet 类,无法干涉 Servlet 对象的生命周期。