Appearance
Request 与 Response 核心 API 及转发与重定向对比
本文全面梳理 HttpServletRequest 和 HttpServletResponse 的核心方法、表单参数提取、中文乱码解决方案,以及面试高频考点:请求转发与重定向的深度区别。
1. HttpServletRequest 核心 API
HttpServletRequest 代表客户端发起的 HTTP 请求。每当客户端访问服务器时,Tomcat 都会将 HTTP 请求报文封包为 request 对象。
1.1 参数获取 API(表单与 URL)
java
// 1. 获取单个参数(文本框、密码框、单选框)
String username = request.getParameter("username");
// 2. 获取多个同名参数(复选框 checkbox)
String[] hobbies = request.getParameterValues("hobby");
// 3. 获取所有参数的 Map 集合(常用于 BeanUtils 自动封装)
Map<String, String[]> parameterMap = request.getParameterMap();1.2 中文乱码处理
- POST 提交乱码:在读取任何参数之前,调用编码设置方法:java
request.setCharacterEncoding("UTF-8"); - GET 提交乱码(Servlet 3.0 或旧版本 Tomcat):java
String name = new String(rawName.getBytes("ISO-8859-1"), "UTF-8");
1.3 常用路径与客户端信息获取 API
假设访问地址为:http://localhost:8080/my-app/user/login?id=100
| 方法名 | 返回值 / 示例 | 说明 |
|---|---|---|
getContextPath() | /my-app | 获取 Web 应用的项目虚拟路径(最常用) |
getServletPath() | /user/login | 获取当前 Servlet 映射路径 |
getQueryString() | id=100 | 获取问号后的纯参数字符串 |
getRequestURI() | /my-app/user/login | 获取 URI(项目路径 + Servlet 路径) |
getRequestURL() | http://localhost:8080/my-app/user/login | 获取完整 URL(不含参数部分) |
getHeader("User-Agent") | 浏览器内核信息 | 获取指定的请求头信息 |
2. HttpServletResponse 核心 API
HttpServletResponse 代表服务器对客户端的 HTTP 响应,用以向浏览器输出数据或设置响应头。
2.1 响应输出与解决乱码
java
// 必须在调用 getWriter() 之前设置!
// 同时设置服务器响应缓冲区的编码与浏览器打开的编码格式:
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.print("<h1>登录成功!</h1>");2.2 核心响应头控制
java
// 1. 3秒后自动定时跳转到百度
response.setHeader("Refresh", "3;url=https://www.baidu.com");
// 2. 触发浏览器弹出文件下载框
response.setHeader("Content-Disposition", "attachment;filename=report.pdf");3. 面试高频:请求转发 vs 请求重定向
在 Servlet 中,页面或请求跳转有两种核心机制:
3.1 请求转发 (Forward)
java
// 属于服务器内部跳转:获取 RequestDispatcher 并调用 forward
request.getRequestDispatcher("/targetServlet").forward(request, response);3.2 请求重定向 (Redirect)
java
// 属于客户端重定向:通知浏览器重新发起请求
response.sendRedirect(request.getContextPath() + "/targetServlet");3.3 深度对比总结表
| 维度 | 请求转发 (Forward) | 请求重定向 (Redirect) |
|---|---|---|
| 请求次数 | 1 次请求与 1 次响应 | 2 次请求与 2 次响应 |
| 浏览器地址栏 | 地址栏保持不变 | 地址栏变为新目标的 URL |
| 数据共享 (Request 域) | 可以在 request 域中共享存取数据 | 不能共享 request 域中的数据 |
| 跳转范围 | 只能在当前 Web 应用内部资源间跳转 | 可以跳转到外部任何网址(如百度) |
| 目标路径写法 | 服务器端路径(不带项目名 contextPath) | 客户端路径(必须带项目名 contextPath) |
| 执行效率 | 效率较高(服务器内部直接转交) | 效率相对较低(经过浏览器二次请求) |
【请求转发 Forward 图解】
浏览器 ── Request ──> [ Servlet A ──(服务器内部转交)──> Servlet B ] ── Response ──> 浏览器
【请求重定向 Redirect 图解】
浏览器 ── Request 1 ──> Servlet A ── 302 & Location ──> 浏览器 ── Request 2 ──> Servlet B ──> 浏览器