Servlet 请求与响应机制详解
2025/9/17大约 4 分钟
Servlet 请求与响应机制详解
前置知识
建议你已了解 Servlet 基础与开发环境搭建,掌握基本 Java 语法。
目录
请求与响应流程概述
Servlet 通过 HttpServletRequest
和 HttpServletResponse
两大对象,实现对 HTTP 请求的读取与响应。
- 客户端(浏览器)发起 HTTP 请求
- Servlet 容器解析请求,封装为
HttpServletRequest
- Servlet 处理请求,生成响应内容
- 通过
HttpServletResponse
返回数据给客户端
请求-响应流程图
graph TD;
A[浏览器发起请求] --> B[Servlet 容器接收请求];
B --> C[封装为 HttpServletRequest];
C --> D[Servlet 业务处理];
D --> E[生成响应内容];
E --> F[HttpServletResponse 返回数据];
F --> G[浏览器接收响应];
HttpServletRequest 常用方法
HttpServletRequest
用于获取请求相关信息,如参数、头、路径等。
常用方法一览
String getParameter(String name); // 获取单个参数
String[] getParameterValues(String name); // 获取同名参数数组
String getHeader(String name); // 获取请求头
String getMethod(); // 获取请求方法(GET/POST)
String getRequestURI(); // 获取请求 URI
String getContextPath(); // 获取上下文路径
String getRemoteAddr(); // 获取客户端 IP
示例:获取请求参数与头信息
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String userAgent = req.getHeader("User-Agent");
// ...
}
HttpServletResponse 常用方法
HttpServletResponse
用于设置响应内容、类型、状态码、重定向等。
常用方法一览
void setContentType(String type); // 设置响应类型
PrintWriter getWriter(); // 获取字符输出流
void setStatus(int sc); // 设置状态码
void sendRedirect(String location); // 重定向
void addHeader(String name, String value); // 添加响应头
示例:输出内容与设置类型
resp.setContentType("text/html;charset=UTF-8");
resp.getWriter().write("<h3>欢迎访问 Servlet!</h3>");
表单与参数获取
1. GET/POST 表单参数
- GET:参数在 URL 查询字符串中
- POST:参数在请求体中
表单 HTML 示例
<form action="/login" method="post">
用户名:<input name="username" />
密码:<input name="password" type="password" />
<button type="submit">登录</button>
</form>
2. Servlet 端获取参数
String username = req.getParameter("username");
String password = req.getParameter("password");
3. 处理中文乱码
- GET 请求:需配置服务器编码
- POST 请求:需在读取参数前设置编码
req.setCharacterEncoding("UTF-8"); // 仅对POST有效
响应输出与重定向
1. 输出文本/HTML
resp.setContentType("text/html;charset=UTF-8");
resp.getWriter().write("<h2>登录成功!</h2>");
2. 输出 JSON 数据
输出 JSON 示例
resp.setContentType("application/json;charset=UTF-8");
resp.getWriter().write("{\"code\":0,\"msg\":\"ok\"}");
3. 重定向与转发
- 重定向:客户端跳转,地址栏变化
- 转发:服务器内部跳转,地址栏不变
重定向与转发代码
// 重定向到首页
resp.sendRedirect("/index.html");
// 请求转发到 JSP
req.getRequestDispatcher("/WEB-INF/page.jsp").forward(req, resp);
代码实战:登录处理 Servlet
LoginServlet.java
package com.example.servlet;
import lombok.extern.slf4j.Slf4j;
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;
/**
* 简单登录处理示例
*/
@Slf4j
@WebServlet(name = "LoginServlet", urlPatterns = "/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8"); // 处理POST中文
String username = req.getParameter("username");
String password = req.getParameter("password");
if ("admin".equals(username) && "123456".equals(password)) {
log.info("用户登录成功: {}", username);
resp.sendRedirect("/welcome.html");
} else {
log.warn("登录失败: {}", username);
resp.setContentType("text/html;charset=UTF-8");
resp.getWriter().write("<span style='color:red'>用户名或密码错误</span>");
}
}
}
常见问题与小结
常见问题
- 参数获取为 null:检查表单 name 属性、请求方式、编码设置
- 中文乱码:POST 用 req.setCharacterEncoding("UTF-8"),GET 需服务器配置
- 重定向路径错误:注意路径是否以 / 开头,是否为绝对路径
- 响应未输出内容:确认 setContentType、getWriter 调用顺序
- HttpServletRequest/Response 是 Servlet 编程的核心
- 参数获取、响应输出、重定向是常用操作
- 推荐多用日志(@Slf4j)便于调试
- 后续可深入学习生命周期、过滤器、监听器等
本文为 Servlet 系列教程第二篇,下一篇将介绍生命周期、配置与部署等内容,敬请期待!