HttpServletRequest 与 HttpServletResponse 总结
1. HttpServletRequest 功能详解
-
核心功能
- 获取请求头数据:
getHeader(name)
、getHeaderNames()
。 - 获取请求参数:
getParameter(name)
(单值)、getParameterValues(name)
(多值如复选框)、getParameterMap()
。 - 获取请求元数据:
request.getMethod(); // 请求方法(GET/POST) request.getRequestURI(); // 请求URI(如 /api/login) request.getRemoteAddr(); // 客户端IP地址 request.getContextPath(); // 项目根路径(如 /myapp)
- 请求转发:
request.getRequestDispatcher("目标路径").forward(request, response);
- 服务器内部跳转,地址栏不变,共享同一请求作用域(
request.setAttribute()
)。
- 服务器内部跳转,地址栏不变,共享同一请求作用域(
- 作用域:仅在当前请求内有效,适合临时传递数据。
- 获取请求头数据:
-
中文乱码处理
- POST请求:
request.setCharacterEncoding("UTF-8"); // 必须在获取参数前调用 String name = request.getParameter("name");
- GET请求:
- Tomcat 8.5+ 默认支持URL中文,低版本需配置
server.xml
的<Connector URIEncoding="UTF-8">
。 - 手动转码:
String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "UTF-8");
- Tomcat 8.5+ 默认支持URL中文,低版本需配置
- POST请求:
2. HttpServletResponse 功能详解
-
核心功能
- 设置响应头:
response.setHeader("Refresh", "5;URL=/newpage"); // 5秒后跳转 response.setContentType("text/html;charset=UTF-8"); // 设置响应类型和编码
- 设置状态码:
response.setStatus(200); // 正常状态 response.sendError(404, "资源不存在"); // 跳转到错误页
- 输出响应正文:
PrintWriter writer = response.getWriter(); writer.write("Hello, 世界!");
- 重定向:
response.sendRedirect("/newpath"); // 客户端重新发起请求,地址栏变化
- 设置响应头:
-
中文乱码处理
确保响应编码与内容类型一致:response.setContentType("text/html;charset=UTF-8"); // 必须设置 response.setCharacterEncoding("UTF-8"); // 可选但建议同步
3. 请求转发 vs 重定向(面试重点)
特性 | 请求转发(Forward) | 重定向(Redirect) |
---|---|---|
地址栏变化 | 不变 | 改变 |
请求次数 | 1次 | 2次 |
数据共享 | 共享 request 作用域 | 不共享,需用 session |
路径写法 | 服务器内部路径(如 /success.jsp ) | 客户端路径(如 /app/success.jsp ) |
跨域支持 | 仅限当前应用内 | 支持跨域(如跳转到外部网站) |
性能 | 高效(服务器内部处理) | 较低(客户端二次请求) |
4. 关键代码示例
-
请求转发与数据传递
// 转发到目标页面并传递数据 request.setAttribute("message", "登录成功"); request.getRequestDispatcher("/result.jsp").forward(request, response);
-
重定向
// 重定向到新地址 response.sendRedirect(request.getContextPath() + "/login.jsp");
-
处理多值参数(如复选框)
String[] hobbies = request.getParameterValues("hobby"); Arrays.stream(hobbies).forEach(System.out::println);
5. 常见问题与解决方案
- 404错误:检查路径是否包含上下文根(如
/myapp/resource
)。 - 中文乱码:确保
request.setCharacterEncoding("UTF-8")
(POST)或配置Tomcat(GET)。 - 数据丢失:重定向时使用
session
替代request
作用域。
总结:
HttpServletRequest
是处理客户端请求的核心对象,关注参数、头信息及请求流转。HttpServletResponse
负责构建响应,需注意编码设置和跳转方式。- 转发与重定向的选择直接影响用户体验和系统性能,需根据场景权衡。