Appearance
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 次)- 创建与初始化 (Initialization):默认情况下,当第一次有请求访问该 Servlet 时,容器会实例化该 Servlet 对象并调用
init(ServletConfig)方法。(单例模式,常驻内存)。 - 处理请求服务 (Service):每次有 HTTP 请求到达时,容器会创建一个新的线程,并调用
service(ServletRequest, ServletResponse)方法处理业务逻辑。 - 销毁 (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)方法,内部首先将请求与响应强转为HttpServletRequest和HttpServletResponse;随后调用重载的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")注解更加简洁地完成映射注册。