📅  最后修改于: 2020-11-12 05:35:44             🧑  作者: Mango
Servlet生命周期可以定义为从创建到销毁的整个过程。以下是servlet遵循的路径。
通过调用init()方法初始化servlet。
Servlet调用service()方法来处理客户端的请求。
通过调用destroy()方法来终止servlet。
最后,servlet是由JVM的垃圾收集器垃圾收集的。
现在让我们详细讨论生命周期方法。
初始化方法仅被调用一次。仅在创建servlet时调用它,此后不为任何用户请求调用。因此,它与applet的init方法一样用于一次性初始化。
通常,在用户首次调用与该servlet相对应的URL时创建servlet,但是您也可以指定在首次启动服务器时加载servlet。
当用户调用servlet时,将创建每个servlet的单个实例,每个用户请求都将产生一个新线程,并根据需要将其移交给doGet或doPost。 init()方法仅创建或加载一些将在servlet的整个生命周期内使用的数据。
初始化方法定义看起来像这样-
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()方法,并且service方法将适当地调用doGet,doPost,doPut,doDelete等方法。因此,您与service()方法无关,但可以根据从客户端收到的请求类型来覆盖doGet()或doPost()。
doGet()和doPost()是每个服务请求中最常用的方法。这是这两种方法的签名。
GET请求是由对URL的常规请求或未指定METHOD的HTML表单产生的,应由doGet()方法处理。
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Servlet code
}
POST请求是由HTML表单产生的,该表单专门将POST列为METHOD,它应该由doPost()方法处理。
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Servlet code
}
在Servlet的生命周期结束时,只会调用一次destroy()方法。该方法使您的Servlet有机会关闭数据库连接,暂停后台线程,将Cookie列表或命中计数写入磁盘,以及执行其他此类清理活动。
调用destroy()方法后,该servlet对象被标记为垃圾回收。 destroy方法的定义如下所示:
public void destroy() {
// Finalization code...
}
下图描述了典型的servlet生命周期场景。
首先,将到达服务器的HTTP请求委托给Servlet容器。
servlet容器在调用service()方法之前加载servlet。
然后,该servlet容器通过产生多个线程来处理多个请求,每个线程执行该servlet单个实例的service()方法。