在 Java Web 开发中,HttpServletRequest 和 HttpServletResponse 是两个至关重要的对象。每当客户端发送一个 HTTP 请求,Web 服务器(如 Tomcat)就会为这次请求创建一个 request 对象和一个 response 对象。
-
request对象:用于封装客户端发送的请求信息,如表单数据、请求头、URL 参数等。 -
response对象:用于向客户端输出响应数据,如 HTML 内容、状态码、响应头等。
掌握这两个对象的使用,是进入 Java Web 开发的基础。
一、HttpServletRequest 详解
HttpServletRequest 是 service() 方法的重要参数之一,它提供了大量方法来获取客户端请求信息。
1. 获取请求头信息
通过 request 可以获取 HTTP 请求头中的各种信息:
java
String value = request.getHeader("User-Agent");
Enumeration<String> names = request.getHeaderNames();
while (names.hasMoreElements()) {
String name = names.nextElement();
String value = request.getHeader(name);
System.out.println(name + ": " + value);
}
2. 获取请求相关其他信息
| 方法 | 说明 |
|---|---|
getMethod() | 获取请求方式,如 GET、POST |
getRequestURI() | 获取请求的 URI 路径 |
getRequestURL() | 获取完整的请求 URL |
getQueryString() | 获取 URL 中的参数字符串 |
getRemoteAddr() | 获取客户端 IP 地址 |
getContextPath() | 获取项目上下文路径 |
示例代码:
java
System.out.println("Method: " + request.getMethod());
System.out.println("URI: " + request.getRequestURI());
System.out.println("URL: " + request.getRequestURL());
System.out.println("Client IP: " + request.getRemoteAddr());
3. 获取请求参数
3.1 单值参数
适用于文本输入框、单选按钮、下拉框等:
java
String username = request.getParameter("username");
String gender = request.getParameter("gender");
3.2 多值参数
适用于复选框(checkbox)或多个同名字段:
java
String[] hobbies = request.getParameterValues("hobby");
for (String hobby : hobbies) {
System.out.println(hobby);
}
3.3 获取所有参数
java
Enumeration<String> paramNames = request.getParameterNames();
Map<String, String[]> paramMap = request.getParameterMap();
4. 中文乱码处理
POST 请求乱码
在获取参数前设置编码:
java
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
GET 请求乱码
Tomcat 8.5 及以上版本已支持 URL 中文参数,无需额外处理。
若需手动处理:
java
String name = request.getParameter("name");
name = new String(name.getBytes("ISO-8859-1"), "UTF-8");
或修改 Tomcat 的 server.xml:
xml
<Connector port="8080" URIEncoding="UTF-8" />
5. 请求转发与 Request 域对象
请求转发是服务器内部跳转,浏览器地址栏不变,属于同一次请求。
java
// 设置域属性
request.setAttribute("msg", "登录成功");
// 转发到另一个资源
request.getRequestDispatcher("/success.jsp").forward(request, response);
在转发的目标页面中,可以通过 request.getAttribute("msg") 获取数据。
二、HttpServletResponse 详解
HttpServletResponse 用于向客户端发送响应数据。
1. 设置响应类型与编码
为避免中文乱码,通常在输出前设置:
java
response.setContentType("text/html;charset=UTF-8");
// 或分别设置
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html");
2. 输出响应内容
java
PrintWriter out = response.getWriter();
out.write("Hello, 世界!");
3. 设置响应头与状态码
java
// 设置状态码
response.setStatus(200);
// 发送错误页面
response.sendError(404, "资源未找到");
// 定时跳转
response.setHeader("Refresh", "5; URL=http://www.baidu.com");
4. 重定向
重定向是客户端跳转,浏览器地址栏会变化,属于两次请求:
java
response.sendRedirect("/项目名/success.html");
三、请求转发与重定向的区别
| 对比项 | 请求转发(forward) | 重定向(sendRedirect) |
|---|---|---|
| 发生位置 | 服务器内部 | 客户端 |
| 请求次数 | 一次请求 | 两次请求 |
| 浏览器地址栏 | 不变 | 改变 |
| 数据共享 | 可使用 request 域 | 无法使用 request 域 |
| 跨域访问 | 不支持 | 支持 |
| 性能 | 更高 | 稍低 |
| 方法来源 | HttpServletRequest | HttpServletResponse |
四、路径问题总结
转发路径
-
以
/开头表示当前 Web 应用的根目录 -
示例:
/WEB-INF/page.jsp
重定向路径
-
以
/开头表示 Tomcat 的根目录,需包含项目名 -
示例:
/项目名/page.jsp
984



被折叠的 条评论
为什么被折叠?



