Servlet学习指南


一、Servlet 是什么?

Servlet(Server Applet) 是运行在 Web 服务器上的 Java 程序,用于处理 HTTP 请求并生成动态响应。它是 JavaWeb 技术的核心,所有现代 JavaWeb 框架(如 Spring MVC)的基础。


二、Servlet 的核心作用

  1. 接收请求:解析客户端(浏览器)的 HTTP 请求(GET/POST/PUT/DELETE 等)。
  2. 处理业务逻辑:如用户登录验证、数据库操作、数据计算等。
  3. 生成响应:返回 HTML、JSON、XML 等格式的数据给客户端。
  4. 协作视图层:与 JSP 配合实现 MVC 模式(Servlet 作为控制器)。

三、Servlet 的生命周期

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

  1. 初始化(Init)
    • 首次被请求时调用 init() 方法(或服务器启动时,取决于配置)。
    • 通常用于加载资源(如数据库连接)。
  2. 处理请求(Service)
    • 每次请求触发 service() 方法,根据请求类型调用 doGet()doPost() 等。
  3. 销毁(Destroy)
    • 服务器关闭或 Servlet 被移除时调用 destroy() 方法,释放资源(如关闭连接)。

四、Servlet 的核心 API

类/接口 说明
HttpServlet Servlet 的抽象基类,提供 doGet()doPost() 等方法。
HttpServletRequest 封装 HTTP 请求信息(参数、请求头、Session 等)。
HttpServletResponse 封装 HTTP 响应操作(设置状态码、响应头、输出内容)。
ServletConfig 获取 Servlet 配置参数(如 web.xml 中的 <init-param>)。
ServletContext 应用全局上下文对象,共享数据(如所有用户的在线统计)。

五、开发第一个 Servlet

1. 创建 Servlet 类
1
2
3
4
5
6
7
8
9
10
11
12
@WebServlet("/hello") // 注解配置访问路径
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 设置响应内容类型
resp.setContentType("text/html;charset=UTF-8");
// 获取输出流
PrintWriter out = resp.getWriter();
out.println("<h1>Hello, Servlet!</h1>");
}
}
2. 部署到 Tomcat
  • Maven 项目:将项目打包为 WAR 文件,复制到 Tomcat 的 webapps 目录。
  • IDE 部署:在 IntelliJ/Eclipse 中配置 Tomcat,直接运行调试。
3. 访问 Servlet

浏览器输入:http://localhost:8080/你的项目名/hello


六、Servlet 的两种配置方式

1. 注解配置(推荐)
1
2
3
4
5
6
@WebServlet(
name = "HelloServlet",
urlPatterns = {"/hello", "/hi"},
initParams = {@WebInitParam(name = "encoding", value = "UTF-8")}
)
public class HelloServlet extends HttpServlet { ... }
2. web.xml 配置(传统方式)
1
2
3
4
5
6
7
8
9
10
11
12
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.example.HelloServlet</servlet-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>

七、Servlet 处理请求与响应

1. 获取请求参数
1
2
String username = request.getParameter("username");
String[] hobbies = request.getParameterValues("hobby"); // 多选框参数
2. 读取请求头
1
String userAgent = request.getHeader("User-Agent");
3. 设置响应内容
1
2
3
4
response.setContentType("text/html"); // 设置 MIME 类型
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
out.print("<h1>响应内容</h1>");
4. 重定向与请求转发
  • 重定向(Redirect):客户端行为,地址栏变化。

    1
    response.sendRedirect("/newPage.jsp");
  • 请求转发(Forward):服务器内部跳转,地址栏不变。

    1
    request.getRequestDispatcher("/result.jsp").forward(request, response);

八、Servlet 的进阶应用

1. 会话管理(Session & Cookie)
  • Session:服务端存储用户会话数据。

    1
    2
    3
    HttpSession session = request.getSession(); // 获取或创建 Session
    session.setAttribute("user", user); // 存储数据
    session.invalidate(); // 销毁 Session
  • Cookie:客户端存储数据。

    1
    2
    3
    Cookie cookie = new Cookie("theme", "dark");
    cookie.setMaxAge(3600); // 有效期(秒)
    response.addCookie(cookie); // 发送 Cookie 到客户端
2. 文件上传

使用 Apache Commons FileUpload 或 Servlet 3.0+ 的 Part 接口:

1
2
Part filePart = request.getPart("file");
filePart.write("/path/to/save/file.txt");
3. 异步处理(Servlet 3.0+)

支持非阻塞 I/O,提升并发性能:

1
2
3
4
5
6
7
8
9
10
@WebServlet(urlPatterns = "/async", asyncSupported = true)
public class AsyncServlet extends HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
AsyncContext asyncContext = req.startAsync();
asyncContext.start(() -> {
// 异步处理逻辑
asyncContext.complete();
});
}
}

九、Servlet 与 JSP 的协作(MVC 模式)

  1. Servlet(Controller):接收请求,调用业务逻辑,准备数据。
  2. JavaBean(Model):封装业务数据。
  3. JSP(View):展示数据,生成 HTML。

示例流程

1
2
3
4
5
6
// Servlet 中处理请求并转发到 JSP
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
User user = userService.findUserById(1);
request.setAttribute("user", user);
request.getRequestDispatcher("/userInfo.jsp").forward(request, response);
}
1
2
3
<!-- JSP 中显示数据 -->
<p>用户名:${user.name}</p>
<p>邮箱:${user.email}</p>

十、常见问题与调试技巧

  1. 404 错误

    • 检查 URL 路径是否正确(区分 /hello/hello/)。
    • 确认 Servlet 类已正确部署到 WEB-INF/classes
  2. 中文乱码

    • 请求乱码:在 Filter 或 Servlet 中设置 request.setCharacterEncoding("UTF-8")
    • 响应乱码:设置 response.setContentType("text/html;charset=UTF-8")
  3. 线程安全问题

    • 避免在 Servlet 类中定义成员变量(除非使用同步锁)。

十一、Servlet 的现代演进

  • Spring MVC:基于 Servlet 的 Web 框架,提供更简洁的注解和功能。
  • Jakarta EE:Servlet 规范的新归属(原 Java EE)。
  • Reactive Web:异步非阻塞的响应式编程模型(如 Spring WebFlux)。

总结

Servlet 是 JavaWeb 开发的基石,掌握其核心机制(生命周期、请求处理、会话管理)是构建动态网站的关键。建议通过实际项目练习,逐步理解过滤器、监听器、MVC 模式等进阶概念,最终过渡到 Spring 等现代框架。