可以定义一个servlet的生命周期,从创建,直到毁灭的全过程。以下是通过servlet遵循的过程:
servlet通过调用init () 方法进行初始化。
servlet调用service()方法来处理客户端的请求。
该servlet通过调用destroy()方法终止(结束)。
最后,servlet是由垃圾收集器的JVM的垃圾收集。
现在让我们讨论生命周期方法的细节。
init方法被设计成只被调用一次。这是第一次被创建时调用这个servlet,而不是再次调用每个用户请求。因此,它是用于一次性初始化,一样的Applet的init方法。
当用户创建该servlet通常首先调用相应的servlet的URL,但您也可以指定这个servlet的服务器第一次启动时被加载。
当用户调用一个servlet,每个servlet的单个实例被创建,每一个用户请求产生一个新的线程,被移交给doGet,doPost方法。简单的init()方法创建或加载一些数据将被用于整个生命周期的servlet。
init方法定义看起来像这样:
public void init() throws ServletException { // Initialization code... }
service()方法是主要的方法来执行实际的任务。 servlet容器(如Web服务器)调用service()方法来处理来自客户端(浏览器)的请求,并写格式化响应返回给客户端。
每次服务器接收到一个servlet请求时,服务器产生一个新的线程并调用服务。 service()方法检查HTTP请求类型(GET,POST,PUT,DELETE等),并调用doGet,doPost方法,doPut,doDelete,等适当的方法。
下面是这种方法的签名:
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException{ }
由容器和服务方法service()方法被调用时调用doGet,doPost方法,doPut,doDelete等适当的方法。所以,service()方法什么都不用做,但你只需要重写doGet()或doPost()方法,但取决于你是什么类型的请求从客户端接收。
doGet()和doPost()方法是最常用的方法,在每一个服务请求。下面是这两种方式中的签名。
从一个正常的请求的URL或HTML的形式,有没有指定的方法,它应该被处理的doGet()方法的GET请求的结果。
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Servlet code }
从一个HTML表单,具体列出POST的方法和doPost()方法,应当由POST请求的结果。
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Servlet code }
一个servlet的生命周期结束时,destroy()方法只会被调用一次。这种方法可以让你的servlet关闭数据库连接,停止后台线程,写入Cookie列表,或打计数到磁盘,并执行其他类似的清理活动的机会。
Servlet对象的destroy()方法被调用后,被标记为垃圾回收。 destroy方法定义看起来像这样:
public void destroy() { // Finalization code... }
下图显示了一个典型的servlet的生命周期的情况。
第一个到服务器的HTTP请求被委派到servlet容器。
servlet容器装载,然后再调用这个servlet的service()方法。
然后servlet容器产生多个线程,每个线程执行一个单一的servlet实例的service()方法的处理多个请求。