在 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