JavaWeb核心:HttpServletRequest与HttpServletResponse详解
Web开发本质:客户端发出请求,服务器返回响应。在JavaWeb中,这两个过程被抽象为
HttpServletRequest
和HttpServletResponse
对象。
一、请求对象:HttpServletRequest
核心作用:封装客户端请求数据,提供访问接口。
1. 核心功能概览
📌 获取请求头数据
📌 读取请求参数(GET/POST)
📌 作为请求域存储数据(类似Map)
📌 实现请求转发
2. 关键API使用
// 获取请求头
String value = request.getHeader("User-Agent");// 获取所有请求头名称
Enumeration<String> headers = request.getHeaderNames();
while(headers.hasMoreElements()) {String name = headers.nextElement();System.out.println(name + ": " + request.getHeader(name));
}// 获取请求元信息
System.out.println("Method: " + request.getMethod()); // GET/POST
System.out.println("URL: " + request.getRequestURL());
System.out.println("Client IP: " + request.getRemoteAddr());
3. 参数获取(重点!)
// 单值参数(文本框/隐藏域)
String username = request.getParameter("user");// 多值参数(复选框)
String[] hobbies = request.getParameterValues("hobby");// 获取所有参数名
Enumeration<String> params = request.getParameterNames();// 参数Map(自动处理单/多值)
Map<String, String[]> paramMap = request.getParameterMap();
4. 中文乱码解决方案
POST请求:
request.setCharacterEncoding("UTF-8"); // 必须放在首行!
GET请求:
// 方法1:手动解码(通用)
String name = new String(request.getParameter("name").getBytes("ISO-8859-1"), "UTF-8"
);// 方法2:Tomcat配置(conf/server.xml)
<Connector ... URIEncoding="UTF-8"/>
注意:Tomcat 8.5+ 默认已支持URL中文
5. 请求域与转发
// 数据存入请求域
request.setAttribute("msg", "操作成功!");// 请求转发(服务器内部跳转)
request.getRequestDispatcher("/success.jsp").forward(request, response);
二、响应对象:HttpServletResponse
核心作用:控制服务器返回客户端的响应内容。
1. 核心能力
🔧 设置响应头(缓存/重定向等)
🔧 发送状态码(404/500等)
🔧 写入响应正文
🔧 实现重定向
2. 关键操作
// 设置内容类型与编码
response.setContentType("text/html;charset=utf-8");// 设置响应头(5秒后跳转)
response.setHeader("Refresh", "5;URL=home.html");// 发送错误状态
response.sendError(404, "资源不存在");// 写入响应体
PrintWriter out = response.getWriter();
out.print("<h1>Hello World!</h1>");
3. 中文响应乱码解决
// 双保险方案
response.setContentType("text/html;charset=utf-8");
response.setCharacterEncoding("UTF-8");
response.getWriter().write("中文内容");
4. 重定向实现
// 客户端URL跳变(两次请求)
response.sendRedirect("/newPath/login.html");
三、核心对比:转发 vs 重定向
特性 | 请求转发 (forward() ) | 重定向 (sendRedirect() ) |
---|---|---|
请求次数 | 1次(服务器内部) | 2次(客户端重新请求) |
地址栏变化 | 不变 | 变为新URL |
数据共享 | 通过request 域共享 | 需使用session |
路径写法 | /servletPath (项目内) | /projectName/servletPath |
跨域能力 | 不支持 | 支持 |
性能 | 更高 | 较低(多一次请求) |
开发建议:优先使用请求转发保持数据,需跨域或强制刷新时用重定向。
四、避坑指南
路径问题:
转发:
/
代表当前Web应用根目录重定向:
/
代表Tomcat根目录,需包含项目名
乱码处理铁律:
// POST请求:首行设置编码 request.setCharacterEncoding("UTF-8");// 响应输出:双保险设置 response.setContentType("text/html;charset=utf-8");
参数获取原则:
单值用
getParameter()
多值用
getParameterValues()
遍历用
getParameterMap()
敏感数据传递:
避免GET传中文或敏感信息
重定向时数据需存session
掌握请求响应对象的核心操作,是构建健壮Web应用的基石。理解数据流向(客户端→request→业务处理→response→客户端),能有效避免典型开发陷阱。