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