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 请求和响应处理。