Skip to content

Servlet 核心规范与生命周期

Servlet 是 Java Web 动态资源开发的核心规范。本文详解 Servlet 的基本概念、5 大核心方法、完整生命周期、类继承体系结构及 XML 映射配置。

1. Servlet 概述

Servlet (Server Applet) 是运行在 Web 服务器(如 Apache Tomcat)中的小型 Java 程序。 它作为 Web 客户端请求(HTTP)与数据库或后台业务逻辑之间的中间层,负责接收请求、处理业务并生成动态响应数据输出给客户端。


2. Servlet 的 5 大核心接口方法

所有的 Servlet 都直接或间接实现 jakarta.servlet.Servlet (或 javax.servlet.Servlet) 接口,该接口规定了 5 个生命周期与配置方法:

java
public interface Servlet {
    // 1. 初始化方法:Servlet 实例创建后由容器调用,用于初始化资源
    void init(ServletConfig config) throws ServletException;

    // 2. 获取 Servlet 配置对象
    ServletConfig getServletConfig();

    // 3. 核心服务方法:每次接收到客户端请求时由容器调用
    void service(ServletRequest req, ServletResponse res) 
         throws ServletException, IOException;

    // 4. 获取 Servlet 相关信息(作者、版本等)
    String getServletInfo();

    // 5. 销毁方法:服务器关闭或应用卸载时调用,释放资源
    void destroy();
}

3. Servlet 的生命周期 (Lifecycle)

Servlet 的完整生命周期由 Web 容器 (Tomcat) 全权管理,分为三个阶段:

[ 客户端发起请求 ]

[ 1. 实例化 & 初始化 ] ──→ 容器第一次加载 Servlet 时,调用 init() 方法(仅执行 1 次)

[ 2. 响应服务 ]         ──→ 每次请求到达时,容器开辟新线程调用 service() 方法(执行 N 次)

[ 3. 销毁卸载 ]         ──→ 服务器关闭或应用重新加载时,调用 destroy() 方法(仅执行 1 次)
  1. 创建与初始化 (Initialization):默认情况下,当第一次有请求访问该 Servlet 时,容器会实例化该 Servlet 对象并调用 init(ServletConfig) 方法。(单例模式,常驻内存)。
  2. 处理请求服务 (Service):每次有 HTTP 请求到达时,容器会创建一个新的线程,并调用 service(ServletRequest, ServletResponse) 方法处理业务逻辑。
  3. 销毁 (Destruction):当服务器正常关闭或 Web 应用卸载时,容器会调用 destroy() 方法释放占用的资源,随后 GC 回收 Servlet 实例。

4. Servlet 的类继承体系结构

在实际开发中,通常不需要直接实现 Servlet 接口,而是通过继承现有的抽象类:

┌───────────────────────────────────────┐
│           Servlet (接口)              │
└───────────────────┬───────────────────┘
                    │ 实现 (实现 4 个通用方法)

┌───────────────────────────────────────┐
│        GenericServlet (抽象类)        │
└───────────────────┬───────────────────┘
                    │ 继承 (协议无关 -> HTTP 专门扩展)

┌───────────────────────────────────────┐
│          HttpServlet (抽象类)         │
└───────────────────────────────────────┘

4.1 GenericServlet

  • 实现了 Servlet 接口中的 4 个通用方法(除 service 之外)。
  • 提供了重写的无参 init() 方法,方便开发者重写初始化逻辑而无需显式保存 ServletConfig 对象。

4.2 HttpServlet(最常用开发基类)

  • 专门针对 HTTP 协议 进行了扩展。
  • 重写 service 方法机制HttpServlet 重写了 service(ServletRequest, ServletResponse) 方法,内部首先将请求与响应强转为 HttpServletRequestHttpServletResponse;随后调用重载的 service(HttpServletRequest, HttpServletResponse),根据 HTTP 请求的提交类型(GET / POST / PUT / DELETE)分发调用对应的 doGet()doPost() 方法。
  • 开发范式:自定义 Servlet 只需继承 HttpServlet,并根据需要选择重写 doGet()doPost() 方法。

5. Servlet 的 XML 映射配置

要在 Tomcat 中发布并访问 Servlet,需要在 WEB-INF/web.xml 中进行声明与路由映射配置:

xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
                             http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <!-- 1. 声明 Servlet 类与其别名 -->
    <servlet>
        <servlet-name>userServlet</servlet-name>
        <servlet-class>net.wanho.demo.UserServlet</servlet-class>
    </servlet>

    <!-- 2. 配置别名与访问 URL 路径 (url-pattern) 的映射 -->
    <servlet-mapping>
        <servlet-name>userServlet</servlet-name>
        <!-- 访问路径必须以斜杠 / 开头 -->
        <url-pattern>/user/login</url-pattern>
    </servlet-mapping>

</web-app>

提示:在 Servlet 3.0 及以上规范中,除了 web.xml 配置外,还可以使用 @WebServlet("/user/login") 注解更加简洁地完成映射注册。

基于 VitePress 构建 | 技术知识库