# Servlet 生命周期

> 原文： [https://beginnersbook.com/2013/05/servlet-life-cycle/](https://beginnersbook.com/2013/05/servlet-life-cycle/)

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`文件中指定元素，如下所示：

```java
<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()`等。

![Servlet Life Cycle](img/99b6d7d7d4ee2cdf7b3dfce261d5405e.jpg)

**注意**：与只调用一次的`init()`和`destroy()`不同，在 servlet 生命周期中可以多次调用`service()`方法。只要不销毁 servlet，就会为每个客户端请求调用`service()`方法。

**在生命周期的所有 5 个步骤中，这是多次执行的唯一步骤。**

**步骤 5：调用`destroy()`方法**

当 servlet 容器关闭时（这通常在我们停止 Web 服务器时发生），它卸载所有 servlet 并为每个初始化的 servlet 调用`destroy()`方法。