📜  Servlet-生命周期

📅  最后修改于: 2020-11-12 05:35:44             🧑  作者: Mango


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

  • 通过调用init()方法初始化servlet。

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

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

  • 最后,servlet是由JVM的垃圾收集器垃圾收集的。

现在让我们详细讨论生命周期方法。

init()方法

初始化方法仅被调用一次。仅在创建servlet时调用它,此后不为任何用户请求调用。因此,它与applet的init方法一样用于一次性初始化。

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

当用户调用servlet时,将创建每个servlet的单个实例,每个用户请求都将产生一个新线程,并根据需要将其移交给doGet或doPost。 init()方法仅创建或加载一些将在servlet的整个生命周期内使用的数据。

初始化方法定义看起来像这样-

public void init() throws ServletException {
   // Initialization code...
}

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()方法,并且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生命周期