核心概念:Servlet 容器
在配置之前,首先要明白 Servlet 是运行在 Servlet 容器 中的,常见的 Servlet 容器有:

- Tomcat: 最流行、使用最广泛的容器。
- Jetty: 轻量级、高性能,常用于嵌入式系统。
- WildFly/JBoss: 全功能的 Java EE 应用服务器。
Servlet 容器负责加载和管理 Servlet,处理网络请求,并将请求分发给正确的 Servlet 来处理。
传统 web.xml 部署描述符配置 (Servlet 2.5 及之前)
这是最早、最传统的配置方式,所有的配置信息都写在 WEB-INF/web.xml 文件中。
环境要求
- Java Development Kit (JDK)
- Servlet 容器 (如 Tomcat)
- 一个支持 Servlet API 的项目结构。
项目结构
一个典型的 Java Web 项目结构如下:
my-webapp/
├── src/
│ └── com/
│ └── example/
│ └── MyFirstServlet.java
├── WEB-INF/
│ ├── web.xml <-- 核心配置文件
│ └── lib/ <-- 存放依赖的 JAR 包
└── webapp/ <-- 静态资源 (HTML, CSS, JS)
└── index.html
编写 Servlet 代码
Servlet 必须继承 HttpServlet 并重写 doGet 或 doPost 方法。

// src/com/example/MyFirstServlet.java
package com.example;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyFirstServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 设置响应内容类型为 HTML
response.setContentType("text/html;charset=UTF-8");
// 获取输出流
PrintWriter out = response.getWriter();
// 向客户端输出内容
out.println("<html>");
out.println("<head><title>Hello Servlet</title></head>");
out.println("<body>");
out.println("<h1>你好,世界!这是通过 web.xml 配置的 Servlet。</h1>");
out.println("</body>");
out.println("</html>");
}
}
配置 web.xml
这是配置的核心,你需要定义 Servlet 和 Servlet 映射。
<!-- WEB-INF/web.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_4_0.xsd"
version="4.0"> <!-- 版本号根据你的 Servlet API 版本填写 -->
<!-- 1. 定义 Servlet -->
<servlet>
<!-- Servlet 的逻辑名称,内部使用,可以任意取 -->
<servlet-name>MyFirstServlet</servlet-name>
<!-- Servlet 的全限定类名 (包名 + 类名) -->
<servlet-class>com.example.MyFirstServlet</servlet-class>
</servlet>
<!-- 2. 将 Servlet 映射到一个 URL -->
<servlet-mapping>
<!-- 必须和上面定义的 <servlet-name> 一致 -->
<servlet-name>MyFirstServlet</servlet-name>
<!-- 访问这个 Servlet 的 URL 模式 -->
<url-pattern>/hello</url-pattern>
<!-- 可以映射多个 URL 模式 -->
<!-- <url-pattern>/greet</url-pattern> -->
</servlet-mapping>
</web-app>
部署和访问
- 将项目打包成
.war文件。 - 将
.war文件放入 Tomcat 的webapps目录下。 - 启动 Tomcat。
- 在浏览器中访问
http://localhost:8080/你的项目名/hello,你就能看到 Servlet 输出的 HTML 内容。
使用注解配置 (Servlet 3.0 及之后)
从 Servlet 3.0 规范开始,引入了注解,这使得配置变得更加简洁和方便,目前这是 强烈推荐 的方式。
环境要求
- JDK
- Servlet 3.0 或更高版本 的容器 (如 Tomcat 7+)。
- 支持 Java 5+ 的 IDE。
编写 Servlet 代码
代码基本相同,只是在类声明上添加 @WebServlet 注解。
// src/com/example/MyAnnotatedServlet.java
package com.example;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet; // 导入注解
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
// @WebServlet 注解替代了 web.xml 中的 <servlet> 和 <servlet-mapping>
@WebServlet(name = "MyAnnotatedServlet", urlPatterns = {"/annotated", "/greeting"})
public class MyAnnotatedServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head><title>Annotation Servlet</title></head>");
out.println("<body>");
out.println("<h1>你好,世界!这是通过注解配置的 Servlet。</h1>");
out.println("<p>你可以通过 /annotated 或 /greeting 访问我。</p>");
out.println("</body>");
out.println("</html>");
}
}
web.xml 的变化
使用注解后,web.xml 文件就不再是必需的了,如果你的项目没有特殊的配置需求(比如欢迎页面、过滤器、监听器等),甚至可以完全删除 web.xml。

如果你需要保留 web.xml,那么注解配置和 web.xml 配置可以并存,但请注意,web.xml 中的配置会覆盖注解配置,这是一种常见的陷阱。
部署和访问
部署过程和方式一完全相同,访问 http://localhost:8080/你的项目名/annotated 或 http://localhost:8080/你的项目名/greeting 即可。
在 Spring Boot 中配置 Servlet
在现代的 Spring Boot 应用中,Servlet 的配置方式又有所不同,Spring Boot 采用 “约定优于配置” 和 编程式配置 的思想。
环境要求
- Spring Boot 项目 (通常通过 Spring Initializr 创建)。
编写 Servlet 代码
Servlet 类本身没有变化,依然是标准的 Java Servlet。
// src/main/java/com/example/demo/MySpringBootServlet.java
package com.example.demo;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
// 可以保留注解,但 Spring Boot 会通过编程方式注册它
@WebServlet(name = "MySpringBootServlet", urlPatterns = {"/spring"})
public class MySpringBootServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
resp.getWriter().println("<h1>Hello from Servlet in Spring Boot!</h1>");
}
}
编程式注册 Servlet
这是 Spring Boot 的关键步骤,你需要创建一个配置类,并使用 @Bean 方法来注册你的 Servlet。
// src/main/java/com/example/demo/ServletConfig.java
package com.example.demo;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ServletConfig {
@Bean
public ServletRegistrationBean<MySpringBootServlet> myServletRegistrationBean() {
// 创建一个 ServletRegistrationBean
// 参数1: 你的 Servlet 实例
// 参数2: Servlet 的 URL 模式
ServletRegistrationBean<MySpringBootServlet> registrationBean =
new ServletRegistrationBean<>(new MySpringBootServlet(), "/spring");
// 可以设置 Servlet 的名称 (可选)
registrationBean.setName("mySpringBootServlet");
return registrationBean;
}
}
注意: 如果你使用 @WebServlet 注解,Spring Boot 默认会自动扫描并注册 它,ServletConfig 类可能不是必需的,如果你想自定义注册顺序、初始化参数等,或者使用非注解方式编写的 Servlet,那么编程式注册就是必须的。
部署和访问
Spring Boot 应用通常打包成一个可执行的 JAR 文件,运行这个 JAR 文件后,应用会内嵌一个 Servlet 容器(默认是 Tomcat)。
访问 http://localhost:8080/spring 即可。
总结与对比
| 特性 | web.xml 配置 |
注解 (@WebServlet) 配置 |
Spring Boot 编程式配置 |
|---|---|---|---|
| 出现版本 | Servlet 2.3 及之前 | Servlet 3.0 及之后 | Spring Boot 框架 |
| 配置位置 | WEB-INF/web.xml 文件 |
Java 类的注解 | Java 配置类的 @Bean 方法 |
| 可读性 | 集中管理,但 XML 较繁琐 | 代码和配置在一起,简洁 | 代码和配置在一起,非常灵活 |
| 维护性 | 修改配置需重新打包部署 | 修改代码需重新编译打包 | 修改代码需重新编译打包 |
| 灵活性 | 较低,修改 XML 即可 | 较高,与 Java 代码耦合 | 最高,可以动态注册、设置依赖等 |
| 适用场景 | 遗留系统、严格的 XML 环境管理 | 现代 Java Web 应用的首选 | Spring/Spring Boot 应用 |
| 依赖 | 任何 Servlet 容器 | Servlet 3.0+ 容器 | Spring Boot 框架 |
最佳实践建议
- 新项目一律使用注解 (
@WebServlet):这是业界标准,简洁、直观,与代码紧密结合,避免了维护web.xml的麻烦。 - Spring Boot 项目使用编程式配置:虽然 Spring Boot 会自动注册带注解的 Servlet,但为了更明确地控制和管理(配置 Servlet 的初始化参数、映射多个 URL 模式、控制加载顺序等),推荐使用
ServletRegistrationBean进行编程式注册,这种方式提供了最大的灵活性。 web.xml用于全局配置:如果你的项目中有多个 Servlet、Filter、Listener,并且它们之间有复杂的依赖关系,或者需要配置整个应用的全局属性(如会话超时、欢迎页面等),web.xml仍然是一个有用的工具,可以将它看作是应用的“中央配置中心”。
希望这份详细的指南能帮助你完全理解 Java Servlet 的各种配置方式!
