HttpServletRequest 和 HttpServletResponse 详解
1. HttpServletRequest(HTTP 请求对象)
HttpServletRequest 是 Java Servlet API 提供的接口,用于封装客户端的 HTTP 请求信息。它继承自 ServletRequest,并增加了 HTTP 协议相关的功能。
1.1 核心功能
(1) 获取请求参数
-
getParameter(String name)
获取单个请求参数(如表单字段、URL 查询参数)。javaString username = request.getParameter("username"); -
getParameterValues(String name)
获取多个同名参数(如复选框、多选列表)。javaString[] hobbies = request.getParameterValues("hobby"); -
getParameterMap()
返回所有请求参数的Map<String, String[]>。javaMap<String, String[]> paramMap = request.getParameterMap();
(2) 获取请求头信息
-
getHeader(String name)
获取单个请求头(如User-Agent、Cookie)。javaString userAgent = request.getHeader("User-Agent"); -
getHeaders(String name)
返回指定请求头的所有值(如多个Accept头)。javaEnumeration<String> acceptHeaders = request.getHeaders("Accept"); -
getHeaderNames()
返回所有请求头名称。javaEnumeration<String> headerNames = request.getHeaderNames();
(3) 获取客户端和服务器信息
-
getRemoteAddr()
获取客户端 IP 地址。javaString ip = request.getRemoteAddr(); -
getMethod()
获取 HTTP 方法(GET、POST、PUT、DELETE等)。javaString method = request.getMethod(); -
getRequestURL()
返回完整的请求 URL(StringBuffer类型)。javaStringBuffer url = request.getRequestURL(); -
getRequestURI()
返回请求的 URI(不包含协议、域名和端口)。javaString uri = request.getRequestURI(); // 如 "/app/login"
(4) 获取会话(Session)
-
getSession()
获取当前会话,如果不存在则创建新会话。javaHttpSession session = request.getSession(); -
getSession(boolean create)
如果create=false,仅获取现有会话,不创建新会话。javaHttpSession session = request.getSession(false);
(5) 获取请求体(Body)
-
getInputStream()
获取ServletInputStream,用于读取二进制数据(如文件上传)。javaServletInputStream inputStream = request.getInputStream(); -
getReader()
获取BufferedReader,用于读取文本数据(如 JSON、XML)。javaBufferedReader reader = request.getReader();
(6) 属性(Attribute)管理
-
setAttribute(String name, Object value)
存储请求范围内的属性(可用于 JSP 或转发)。javarequest.setAttribute("message", "Hello"); -
getAttribute(String name)
获取请求属性。javaString msg = (String) request.getAttribute("message"); -
removeAttribute(String name)
移除请求属性。javarequest.removeAttribute("message");
2. HttpServletResponse(HTTP 响应对象)
HttpServletResponse 是 Java Servlet API 提供的接口,用于封装服务器对客户端的 HTTP 响应。它继承自 ServletResponse,并增加了 HTTP 协议相关的功能。
2.1 核心功能
(1) 设置响应状态
-
setStatus(int sc)
设置 HTTP 状态码(如200、404、500)。javaresponse.setStatus(HttpServletResponse.SC_OK); // 200 -
sendError(int sc, String msg)
发送错误状态码和消息(如404 Not Found)。javaresponse.sendError(HttpServletResponse.SC_NOT_FOUND, "Page not found");
(2) 设置响应头
-
setHeader(String name, String value)
设置响应头(如Content-Type、Cache-Control)。javaresponse.setHeader("Content-Type", "text/html"); -
addHeader(String name, String value)
添加多个同名响应头(如多个Set-Cookie)。javaresponse.addHeader("Set-Cookie", "user=admin"); -
setContentType(String type)
设置内容类型(如text/html、application/json)。javaresponse.setContentType("application/json"); -
setCharacterEncoding(String charset)
设置字符编码(如UTF-8)。javaresponse.setCharacterEncoding("UTF-8");
(3) 写入响应数据
-
getOutputStream()
获取ServletOutputStream,用于写入二进制数据(如图片、文件)。javaServletOutputStream out = response.getOutputStream(); out.write(bytes); -
getWriter()
获取PrintWriter,用于写入文本数据(如 HTML、JSON)。javaPrintWriter writer = response.getWriter(); writer.println("<h1>Hello World</h1>");
(4) 重定向
-
sendRedirect(String location)
发送 302 重定向到指定 URL。javaresponse.sendRedirect("/login");
(5) Cookie 管理
-
addCookie(Cookie cookie)
向客户端添加 Cookie。javaCookie cookie = new Cookie("username", "admin"); response.addCookie(cookie);
(6) 缓存控制
-
setDateHeader(String name, long date)
设置日期型响应头(如Expires)。javaresponse.setDateHeader("Expires", System.currentTimeMillis() + 3600000);
3. 实际应用示例
示例 1:登录表单处理
java
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
if ("admin".equals(username) && "123456".equals(password)) {
// 登录成功,存储 Session
HttpSession session = request.getSession();
session.setAttribute("user", username);
// 重定向到首页
response.sendRedirect("/home");
} else {
// 登录失败,返回错误
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<h1>Login Failed</h1>");
}
}
示例 2:返回 JSON 数据
java
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException {
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
String json = "{\"name\":\"John\", \"age\":30}";
out.print(json);
}
4. 总结
| 功能 | HttpServletRequest | HttpServletResponse |
|---|---|---|
| 获取请求数据 | getParameter(), getHeader() |
- |
| 获取会话 | getSession() |
- |
| 读取请求体 | getInputStream(), getReader() |
- |
| 设置响应数据 | - | getOutputStream(), getWriter() |
| 设置状态码 | - | setStatus(), sendError() |
| 设置响应头 | - | setHeader(), addHeader() |
| 重定向 | - | sendRedirect() |
| Cookie 管理 | getCookies() |
addCookie() |
这两个对象是 Java Web 开发的核心,几乎所有 Web 框架(如 Spring MVC)底层都依赖它们进行 HTTP 请求和响应处理。