Servlet 生命周期可以描述为 servlet 在其生命周期中从一系列步骤开始,从加载开始直到它被破坏。
在我开始解释 Servlet 的生命周期之前,我们先讨论一下您在阅读本指南时会遇到的几个术语。了解每个术语的含义非常重要,这将有助于您更快地理解事物。
Web 服务器:它也称为 HTTP 服务器,它可以处理客户端发送的 HTTP 请求,并使用 HTTP 响应来响应请求。
Web 容器:也称为 Servlet 容器和 Servlet 引擎。它是 Web Server 的一部分,与 Servlet 交互。这是管理 Servlet 生命周期的 Web Server 的主要组件。
注意:您在本网站中找到的 servlet 教程使用 apache tomcat web 服务器。虽然我将其称为 Web 服务器,但它实际上是一个 Web 服务器和 Web 容器。 (如上所述,Web 容器是 Web 服务器的一部分)。
Servlet 的生命周期
Servlet 生命周期包含五个步骤:1)加载 Servlet,2)创建 Servlet 实例,3)调用init()
一次,4)为每个客户端请求重复调用service()
,5)调用destroy()
对于那些想知道什么是实例和调用的人来说:实例和对象是一回事。调用方法意味着调用一个方法,它只是一个奇特的词,我们在编程世界中使用而不是调用:)
让我们回到主题,以下是 servlet 生命周期的五个步骤。
步骤 1:加载 Servlet
当 Web 服务器(例如 Apache Tomcat)启动时,servlet 容器部署并加载所有 servlet。
步骤 2:创建 Servlet 实例
一旦加载了所有 Servlet 类,servlet 容器就会创建每个 servlet 类的实例。 Servlet 容器每个 servlet 类只创建一个实例,并且对 servlet 的所有请求都在同一个 servlet 实例上执行。
步骤 3:调用init()
方法
一旦实例化了所有 servlet 类,就会为每个实例化的 servlet 调用init()
方法。此方法初始化 servlet。您可以在部署描述符(web.xml
)文件中指定某些init
参数。例如,如果 servlet 的值>= 0
,则在 Web 容器启动期间立即调用其init()
方法。
您可以在web.xml
文件中指定元素,如下所示:
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.beginnersbook.MyServletDemo</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
现在,在 Web 容器启动期间将调用相应 servlet 类com.beginnersbook.MyServletDemo
的 init()
方法。
注意:init()方法在 servlet 的生命周期中只调用一次。
步骤 4:调用service()
方法
每次 Web 服务器收到 servlet 请求时,它都会产生一个调用service()
方法的新线程。如果 servlet 是GenericServlet
,那么请求由service()
方法本身提供,如果 servlet 是HttpServlet
,则service()
方法接收请求并根据请求的类型将其分派给正确的处理程序方法。
例如,如果它是Get
请求,则service()
方法会通过使用请求参数调用doGet()
方法将请求分派给doGet()
方法。类似地,诸如Post
,Head
,Put
等的请求被 servlet 的service()
方法分派给相应的处理程序doPost()
,doHead()
,doPut()
等。
注意:与只调用一次的
init()
和destroy()
不同,在 servlet 生命周期中可以多次调用service()
方法。只要不销毁 servlet,就会为每个客户端请求调用service()
方法。
在生命周期的所有 5 个步骤中,这是多次执行的唯一步骤。
步骤 5:调用destroy()
方法
当 servlet 容器关闭时(这通常在我们停止 Web 服务器时发生),它卸载所有 servlet 并为每个初始化的 servlet 调用destroy()
方法。