目录
- Servlet 简介
- 环境准备
- JDK
- Servlet 容器 (Tomcat)
- IDE (IntelliJ IDEA 或 Eclipse)
- 构建工具 (Maven - 强烈推荐)
- 第一个 Servlet - "Hello, World!"
- 步骤 1: 创建 Maven Web 项目
- 步骤 2: 添加 Servlet 依赖
- 步骤 3: 编写 Servlet 代码
- 步骤 4: 配置
web.xml - 步骤 5: 部署与运行
- 用户登录验证
- 步骤 1: 创建 JSP 页面 (登录表单)
- 步骤 2: 编写处理登录的 Servlet
- 步骤 3: 创建登录成功/失败的 JSP 页面
- 步骤 4: 配置
web.xml - 步骤 5: 运行测试
- 现代实践:使用注解配置 Servlet (Servlet 3.0+)
Servlet 简介
Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 响应之间的中间层。

核心作用:
- 接收并解析客户端(如浏览器)发送的 HTTP 请求。
- 处理业务逻辑(查询数据库、计算数据)。
- 生成动态内容。
- 将响应发送回客户端。
生命周期: Servlet 的生命周期由容器(如 Tomcat)管理,主要包括三个阶段:
- 初始化 (
init):当 Servlet 第一次被请求时,容器会调用其init()方法,该方法在整个生命周期中只执行一次。 - 处理请求 (
service):对于每个请求,容器都会调用service()方法。service()方法会根据请求的类型(GET, POST 等)调用相应的doGet(),doPost(),doPut()等方法。 - 销毁 (
destroy):当 Web 应用被卸载或服务器关闭时,容器会调用destroy()方法,释放资源。
环境准备
在开始之前,请确保你已经安装并配置好以下软件:
- JDK (Java Development Kit): 版本 8 或更高版本。
- Servlet 容器: 我们使用 Apache Tomcat,这是最流行的 Servlet 容器之一,请下载并解压 Tomcat。
- IDE: 推荐 IntelliJ IDEA (社区版免费) 或 Eclipse IDE for Enterprise Java and Web Developers。
- 构建工具: Maven,Maven 可以帮助我们管理项目依赖(如 Servlet API)和构建流程,是现代 Java 项目的标准。
实例一:第一个 Servlet - "Hello, World!"
我们将创建一个简单的 Servlet,当访问特定 URL 时,它会在浏览器上显示 "Hello, World!"。

步骤 1: 创建 Maven Web 项目
在 IntelliJ IDEA 中:
File->New->Project。- 选择
Maven,然后勾选Create from archetype。 - 在列表中找到并选择
maven-archetype-webapp,点击Next。 - 输入
GroupId(com.example) 和ArtifactId(servlet-demo),点击Finish。
项目创建后,你会看到一个 src/main/webapp 目录,里面有一个 index.jsp 文件和一个 WEB-INF 目录。
步骤 2: 添加 Servlet 依赖
打开 pom.xml 文件,在 <dependencies> 标签内添加 Servlet API 的依赖,我们使用 provided scope,因为 Servlet API 会被 Tomcat 这样的容器在运行时提供。
<dependencies>
<!-- Servlet API 依赖 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version> <!-- 使用较新的版本 -->
<scope>provided</scope>
</dependency>
</dependencies>
点击 IDEA 右下角的 "Load Maven Changes" 或让 IDEA 自动加载。

步骤 3: 编写 Servlet 代码
- 在
src/main/java目录下创建包,com.example.servlet。 - 在该包下创建一个 Java 类
HelloServlet。
package com.example.servlet;
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;
import java.io.PrintWriter;
// 使用注解配置 (现代方式,后面会详细介绍)
@WebServlet(name = "HelloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
// 处理 GET 请求
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 设置响应内容类型为 HTML
resp.setContentType("text/html;charset=UTF-8");
// 获取 PrintWriter 对象,用于向客户端输出响应
PrintWriter out = resp.getWriter();
// 构造 HTML 响应
out.println("<html>");
out.println("<head><title>Hello Servlet</title></head>");
out.println("<body>");
out.println("<h1>Hello, World! from Servlet!</h1>");
out.println("</body>");
out.println("</html>");
}
}
代码解释:
@WebServlet: 这是一个注解,用于将当前类声明为一个 Servlet。name是 Servlet 的名称,urlPatterns是一个 URL 模式数组,用于映射访问路径,访问http://yourdomain/yourapp/hello时就会触发这个 Servlet。HttpServlet: 我们继承HttpServlet,因为它提供了处理 HTTP 请求的基础功能。doGet: 当 Servlet 收到 GET 请求时,这个方法会被调用。resp.setContentType: 设置响应的 MIME 类型为text/html,并指定字符集为UTF-8,防止中文乱码。resp.getWriter(): 获取一个PrintWriter对象,我们可以用它来向浏览器写入文本内容。
步骤 4: 配置 web.xml (传统方式)
虽然我们上面用了注解,但了解一下传统的 web.xml 配置方式也很重要,如果你的项目是 Servlet 3.0 之前版本,或者团队有规范要求,就需要在 src/main/webapp/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 定义 -->
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.example.servlet.HelloServlet</servlet-class>
</servlet>
<!-- Servlet 映射 -->
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
注意:如果你使用了 @WebServlet 注解,并且你的 Tomcat 版本支持(3.0+),web.xml 中的这部分配置就可以省略,注解方式是更现代和推荐的做法。
步骤 5: 部署与运行
-
配置 Tomcat:
- 在 IntelliJ IDEA 中,点击右上角的 "Add Configuration"。
- 点击 号,选择
Tomcat Server->Local。 - 在 "Deployment" 标签页,点击 号,选择
Artifact,然后选择你的servlet-demo:war exploded。 - 在 "Server" 标签页,配置 Tomcat 的路径(如果你之前下载并解压了 Tomcat,可以点击
Configure添加)。 - 点击
OK保存配置。
-
运行:
- 点击绿色的 "Run" 按钮。
- IDEA 会启动 Tomcat 并部署你的应用,浏览器会自动打开
http://localhost:8080/servlet-demo/(这是默认的index.jsp)。
-
测试:
- 在浏览器地址栏输入:
http://localhost:8080/servlet-demo/hello - 你应该能看到页面显示 "Hello, World! from Servlet!"。
- 在浏览器地址栏输入:
实例二:用户登录验证
这个例子将展示 Servlet 如何处理表单数据、进行逻辑判断,并转发到不同的页面。
步骤 1: 创建 JSP 页面 (登录表单)
在 src/main/webapp 目录下创建 login.jsp。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>登录页面</title>
</head>
<body>
<h2>用户登录</h2>
<%-- 如果有错误信息,显示出来 --%>
<% if (request.getAttribute("error") != null) { %>
<p style="color: red;"><%= request.getAttribute("error") %></p>
<% } %>
<form action="login" method="post">
用户名: <input type="text" name="username"><br>
密码: <input type="password" name="password"><br>
<input type="submit" value="登录">
</form>
</body>
</html>
步骤 2: 编写处理登录的 Servlet
在 com.example.servlet 包下创建 LoginServlet。
package com.example.servlet;
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;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1. 获取表单提交的参数
String username = req.getParameter("username");
String password = req.getParameter("password");
// 2. 简单的验证逻辑 (实际项目中应该查询数据库)
if ("admin".equals(username) && "password123".equals(password)) {
// 登录成功,将用户名存入 session
req.getSession().setAttribute("user", username);
// 转发到欢迎页面
req.getRequestDispatcher("welcome.jsp").forward(req, resp);
} else {
// 登录失败,设置错误信息并转发回登录页面
req.setAttribute("error", "用户名或密码错误!");
req.getRequestDispatcher("login.jsp").forward(req, resp);
}
}
}
代码解释:
doPost: 处理 POST 请求(通常由表单提交触发)。req.getParameter(): 获取表单中name属性为username或password的输入值。req.getRequestDispatcher().forward(): 请求转发,服务器端的行为,将请求从一个组件(Servlet)传递到另一个组件(JSP),客户端的 URL 不会改变。req.getSession().setAttribute(): 将用户信息存入HttpSession对象,这样用户在整个会话期间都可以访问,实现登录状态保持。
步骤 3: 创建登录成功/失败的 JSP 页面
在 src/main/webapp 下创建 welcome.jsp。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page session="true" %>
<html>
<head>欢迎页面</title>
</head>
<body>
<h2>欢迎, <%= session.getAttribute("user") %>!</h2>
<p>您已成功登录。</p>
<a href="logout">退出登录</a>
</body>
</html>
为了完善功能,我们再创建一个简单的退出 Servlet。
LogoutServlet.java:
package com.example.servlet;
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 javax.servlet.http.HttpSession;
import java.io.IOException;
@WebServlet("/logout")
public class LogoutServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession(false); // false表示如果不存在session则不创建
if (session != null) {
session.invalidate(); // 销毁session
}
resp.sendRedirect("login.jsp"); // 重定向到登录页
}
}
步骤 4: 配置 web.xml (如果需要)
在这个例子中,我们全部使用了注解 @WebServlet,所以不需要修改 web.xml。login.jsp 作为首页,通常可以在 Tomcat 配置或 web.xml 中设置欢迎列表。
<!-- 在 web.xml 中添加欢迎列表 -->
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
这样,当访问 http://localhost:8080/servlet-demo/ 时,会自动跳转到 login.jsp。
步骤 5: 运行测试
- 确保你的 Tomcat 配置中部署了项目。
- 启动 Tomcat。
- 访问
http://localhost:8080/servlet-demo/,会看到登录页面。 - 输入错误的用户名/密码,会看到错误提示。
- 输入正确的用户名
admin和密码password123,会跳转到欢迎页面。 - 点击 "退出登录",会销毁 session 并返回登录页面。
现代实践:使用注解配置 Servlet (Servlet 3.0+)
从 Servlet 3.0 规范开始,引入了注解来简化配置,我们已经在前面的例子中大量使用了 @WebServlet。
主要注解:
-
@WebServlet: 用于声明一个 Servlet。name: Servlet 名称。urlPatterns: URL 映射模式数组。value:urlPatterns的简写,但不能同时使用value和urlPatterns。loadOnStartup: Servlet 的加载顺序(整数),值越小越先加载,负数表示在第一次请求时加载。
-
@WebListener: 用于声明一个监听器(如ServletContextListener,HttpSessionListener)。 -
@WebFilter: 用于声明一个过滤器。
优点:
- 配置简化: 无需在
web.xml中进行繁琐的 XML 配置。 - 类型安全: 编译器可以检查注解的正确性。
- 内聚性: Servlet 的类信息和其配置信息在同一个文件中,更易于维护。
通过这两个实例,你应该已经掌握了 Java Servlet 的核心概念和基本用法:
- 创建 Servlet: 继承
HttpServlet并重写doGet或doPost方法。 - 配置映射: 使用
@WebServlet注解或web.xml将 URL 映射到 Servlet。 - 处理请求: 使用
HttpServletRequest获取请求参数、请求头等信息。 - 生成响应: 使用
HttpServletResponse设置响应类型、状态码,并输出响应体。 - 数据共享: 使用
request(一次请求内)、session(一次会话内) 和ServletContext(整个应用生命周期内) 对象在不同组件间共享数据。 - 导航: 使用
forward(请求转发) 和sendRedirect(重定向) 将用户引导到不同的页面。
虽然现代 Web 开发中,Spring MVC 等框架因其更强大的功能(如 IoC, AOP, RESTful 支持)已成为主流,但 Servlet 依然是 Java Web 技术的基石,理解 Servlet 的工作原理对于学习任何 Java Web 框架都至关重要。
