准备工作:开发环境
在开始之前,请确保您已经安装并配置好以下环境:

- JDK (Java Development Kit): 版本 8 或更高。
- Servlet API: 如果您使用像 Eclipse 或 IntelliJ IDEA 这样的 IDE,通常可以自动管理,如果是手动构建,需要下载
servlet-api.jar。 - Web 服务器: 最常用的是 Apache Tomcat,版本 9.x 或 10.x 都可以。
- 构建工具 (推荐): Maven 或 Gradle,用于管理项目依赖和构建 WAR 包,这里我们以 Maven 为例。
示例 1:第一个 Servlet - "Hello, World!"
这是一个最简单的 Servlet,它只响应一个 GET 请求,并在浏览器中显示 "Hello, World!"。
项目结构 (使用 Maven)
我们使用 Maven 的标准 Web 应用结构。
hello-servlet-app/
├── pom.xml // Maven 项目配置文件
└── src/
└── main/
├── java/
│ └── com/
│ └── example/
│ └── servlet/
│ └── HelloServlet.java // 我们的 Servlet 类
├── resources/
└── webapp/
├── WEB-INF/
│ └── web.xml // Servlet 部署描述符 (传统方式)
└── index.html // 一个简单的首页
pom.xml 文件
这个文件定义了项目的依赖和构建配置。
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>hello-servlet-app</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging> <!-- 打包成 WAR 文件 -->
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- Servlet API 依赖 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope> <!-- 由服务器提供,编译时需要,运行时不需要 -->
</dependency>
</dependencies>
<build>
<finalName>hello-servlet-app</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.2</version>
</plugin>
</plugins>
</build>
</project>
HelloServlet.java 源代码
这是核心的 Servlet 类。

package com.example.servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
// 1. 继承 HttpServlet
public class HelloServlet extends HttpServlet {
// 2. 重写 doGet 方法来处理 GET 请求
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 3. 设置响应内容类型为 HTML
response.setContentType("text/html;charset=UTF-8");
// 4. 获取 PrintWriter 对象,用于向客户端发送响应
PrintWriter out = response.getWriter();
// 5. 写入 HTML 内容
out.println("<html>");
out.println("<head><title>第一个 Servlet</title></head>");
out.println("<body>");
out.println("<h1>你好,世界!</h1>");
out.println("<p>这是一个由 Java Servlet 生成的页面。</p>");
out.println("</body>");
out.println("</html>");
}
// 同样,可以重写 doPost 方法来处理 POST 请求
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response); // 通常让 doPost 调用 doGet
}
}
web.xml 部署描述符
这个文件告诉 Web 服务器我们的 HelloServlet 类是什么,以及它应该处理哪个 URL。
<?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 声明 -->
<servlet>
<servlet-name>HelloWorld</servlet-name> <!-- Servlet 的内部名称 -->
<servlet-class>com.example.servlet.HelloServlet</servlet-class> <!-- Servlet 类的全限定名 -->
</servlet>
<!-- Servlet 映射 -->
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name> <!-- 引用上面声明的 servlet-name -->
<url-pattern>/hello</url-pattern> <!-- 浏览器访问的 URL 路径 -->
</servlet-mapping>
</web-app>
运行和测试
- 构建项目: 在项目根目录下运行
mvn clean package,这会在target目录下生成一个hello-servlet-app.war文件。 - 部署到 Tomcat:
- 找到 Tomcat 的
webapps目录。 - 将生成的
hello-servlet-app.war文件复制到webapps目录下。 - 启动 Tomcat 服务器。
- 找到 Tomcat 的
- 访问: 打开浏览器,访问
http://localhost:8080/hello-servlet-app/hello。
预期结果: 您会看到一个标题为 "第一个 Servlet",内容为 "你好,世界!"的网页。
示例 2:处理表单数据
这个例子将创建一个 HTML 表单,用户可以在其中输入姓名,提交后由 Servlet 处理并显示一个个性化的欢迎消息。
修改 webapp/index.html
<!DOCTYPE html>
<html>
<head>表单提交示例</title>
</head>
<body>
<h1>请输入您的姓名</h1>
<form action="welcome" method="post">
姓名: <input type="text" name="username">
<input type="submit" value="提交">
</form>
</body>
</html>
action="welcome": 指定表单提交到的 URL。method="post": 使用 POST 方法提交数据。name="username": 输入框的名称,Servlet 将通过这个名称获取数据。
创建 WelcomeServlet.java
package com.example.servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
public class WelcomeServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 1. 设置响应内容类型
response.setContentType("text/html;charset=UTF-8");
// 2. 获取表单数据
// request.getParameter() 的参数 name 必须与 HTML input 的 name 属性一致
String username = request.getParameter("username");
// 3. 获取 PrintWriter 对象
PrintWriter out = response.getWriter();
// 4. 生成响应
out.println("<html>");
out.println("<head><title>欢迎页面</title></head>");
out.println("<body>");
if (username != null && !username.trim().isEmpty()) {
out.println("<h1>欢迎您, " + username + "!</h1>");
} else {
out.println("<h1>您没有输入姓名。</h1>");
}
out.println("<a href='index.html'>返回</a>");
out.println("</body>");
out.println("</html>");
}
}
修改 web.xml
添加 WelcomeServlet 的映射。

<?xml version="1.0" encoding="UTF-8"?>
<web-app ...>
<!-- HelloServlet 的映射保持不变 -->
<servlet>
<servlet-name>HelloWorld</servlet-name>
<servlet-class>com.example.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<!-- 新增 WelcomeServlet 的声明和映射 -->
<servlet>
<servlet-name>WelcomeServlet</servlet-name>
<servlet-class>com.example.servlet.WelcomeServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>WelcomeServlet</servlet-name>
<url-pattern>/welcome</url-pattern>
</servlet-mapping>
</web-app>
重新部署和测试
- 重新构建并替换
webapps目录下的 WAR 文件。 - 访问
http://localhost:8080/hello-servlet-app/index.html。 - 在输入框中输入您的名字,点击 "提交"。
- 您将被带到
/welcome页面,并看到个性化的欢迎消息。
示例 3:使用 HttpSession 进行会话管理
这个例子将记录用户访问网站的次数,每次刷新页面,访问次数都会增加,直到关闭浏览器。
创建 SessionServlet.java
package com.example.servlet;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;
public class SessionServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
// 1. 获取或创建 HttpSession 对象
// 如果请求中已有 session,则返回它;否则,创建一个新的。
HttpSession session = request.getSession();
// 2. 从 session 中获取访问计数
//getAttribute 返回 Object,需要类型转换
Integer visitCount = (Integer) session.getAttribute("visitCount");
// 3. 如果是第一次访问,visitCount 为 null
if (visitCount == null) {
visitCount = 1;
} else {
visitCount++;
}
// 4. 将新的访问计数存回 session
session.setAttribute("visitCount", visitCount);
// 5. 生成响应
out.println("<html>");
out.println("<head><title>会话示例</title></head>");
out.println("<body>");
out.println("<h1>欢迎回来!</h1>");
out.println("<p>您是第 <strong>" + visitCount + "</strong> 次访问本页面。</p>");
out.println("<p>Session ID: " + session.getId() + "</p>");
out.println("<p>Session 创建时间: " + new java.util.Date(session.getCreationTime()) + "</p>");
out.println("<p>Session 最后访问时间: " + new java.util.Date(session.getLastAccessedTime()) + "</p>");
out.println("</body>");
out.println("</html>");
}
}
修改 web.xml
添加 SessionServlet 的映射。
<?xml version="1.0" encoding="UTF-8"?>
<web-app ...>
<!-- ... 其他 servlet ... -->
<!-- 新增 SessionServlet 的声明和映射 -->
<servlet>
<servlet-name>SessionServlet</servlet-name>
<servlet-class>com.example.servlet.SessionServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>SessionServlet</servlet-name>
<url-pattern>/session</url-pattern>
</servlet-mapping>
</web-app>
测试
- 重新部署应用。
- 访问
http://localhost:8080/hello-servlet-app/session。 - 您会看到 "您是第 1 次访问本页面"。
- 刷新页面,计数会变成 2, 3, 4 ...
- 关闭浏览器,然后重新打开访问
/session,计数会重新从 1 开始,因为HttpSession默认依赖于浏览器的 Cookie,关闭浏览器后 Cookie 失效,Session 也就失效了。
现代 Servlet 开发 (注解方式)
从 Servlet 3.0 开始,推荐使用注解来代替 web.xml,使配置更简洁。
如何转换示例 1
- 删除
web.xml(可选,如果所有配置都使用注解)。 - 修改
HelloServlet.java:
package com.example.servlet;
import javax.servlet.*;
import javax.servlet.annotation.*;
import javax.servlet.http.*;
import java.io.IOException;
// 使用 @WebServlet 注解来替代 web.xml 中的 <servlet> 和 <servlet-mapping>
// urlPatterns 是一个数组,可以映射多个 URL
@WebServlet(urlPatterns = {"/hello", "/hello-world"})
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
try (PrintWriter out = response.getWriter()) {
out.println("<html><head><title>注解方式</title></head>");
out.println("<body><h1>你好,世界!(注解版)</h1></body></html>");
}
}
}
您只需要将这个类部署到 Tomcat,就可以通过 /hello 或 /hello-world 访问到它了,无需 web.xml。
- Servlet 生命周期:
init()->service()->destroy()。 - 核心方法:
doGet(): 处理 GET 请求。doPost(): 处理 POST 请求。
- 核心对象:
HttpServletRequest: 代表客户端的请求,包含请求头、请求参数、Cookie 等。HttpServletResponse: 代表服务器的响应,用于设置响应状态码、响应头、向客户端输出内容。HttpSession: 用于在多个请求之间保存用户的状态信息。
- 配置方式:
- 传统方式: 在
web.xml中进行声明和映射。 - 现代方式: 使用
@WebServlet,@WebServlet等注解,更简洁。
- 传统方式: 在
希望这些例子能帮助您理解 Java Servlet 的基本概念和用法!
