Servlets - 生命周期

servlet生命周期可以定义为从创建到销毁的整个过程.以下是servlet遵循的路径.

  • 通过调用 init()

  • servlet调用 service()方法来处理客户端的请求.

  • 通过调用 destroy()方法终止servlet.

  • 最后,servlet被JVM的垃圾收集器垃圾收集.

现在让我们讨论一下生命周期方法详细信息.

init()方法

init方法只调用一次.只有在创建servlet时才会调用它,之后不会调用任何用户请求.因此,它用于一次性初始化,就像applet的init方法一样.

通常在用户首次调用与servlet对应的URL时创建servlet,但是也可以指定在首次启动服务器时加载servlet.

当用户调用servlet时,会创建每个servlet的单个实例,每个用户请求都会产生一个新的根据需要传递给doGet或doPost的线程. init()方法只是创建或加载一些将在servlet的整个生命周期中使用的数据.

init方法定义看起来像这样 :

 
 public void init()throws ServletException {
//初始化代码... 
}

service()方法

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()是每个服务请求中最常用的方法.以下是这两种方法的签名.

doGet()方法

GET请求来自对URL的正常请求或来自没有指定METHOD的HTML表单,它应该由doGet()方法处理.

public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
   // Servlet code
}

doPost()方法

POST请求来自HTML表单,该表单专门将POST列为METHOD,它应该由doPost()方法处理.

public void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
   // Servlet code
}

destroy()方法

在servlet的生命周期结束时,只调用一次destroy()方法.此方法使您的servlet有机会关闭数据库连接,暂停后台线程,写入cookie列表或命中磁盘计数,以及执行其他此类清理活动.

在destroy()方法之后在调用时,servlet对象被标记为垃圾回收. destroy方法定义看起来像这样 :

public void destroy() {
   // Finalization code...
}

架构图

下图描绘了典型的servlet生命周期场景.

  • 首先,将发送到服务器的HTTP请求委托给servlet容器.

  • servlet容器在调用service()方法之前加载servlet.

  • 然后servlet容器通过生成多个线程来处理多个请求,每个线程执行servlet的单个实例的service()方法.

Servlet生命周期