java HttpServletRequest 和 HttpServletResponse

HttpServletRequest 和 HttpServletResponse 详解

1. HttpServletRequest(HTTP 请求对象)

HttpServletRequest 是 Java Servlet API 提供的接口,用于封装客户端的 HTTP 请求信息。它继承自 ServletRequest,并增加了 HTTP 协议相关的功能。

1.1 核心功能

(1) 获取请求参数
  • getParameter(String name)
    获取单个请求参数(如表单字段、URL 查询参数)。

    java 复制代码
    String username = request.getParameter("username");
  • getParameterValues(String name)
    获取多个同名参数(如复选框、多选列表)。

    java 复制代码
    String[] hobbies = request.getParameterValues("hobby");
  • getParameterMap()
    返回所有请求参数的 Map<String, String[]>

    java 复制代码
    Map<String, String[]> paramMap = request.getParameterMap();
(2) 获取请求头信息
  • getHeader(String name)
    获取单个请求头(如 User-AgentCookie)。

    java 复制代码
    String userAgent = request.getHeader("User-Agent");
  • getHeaders(String name)
    返回指定请求头的所有值(如多个 Accept 头)。

    java 复制代码
    Enumeration<String> acceptHeaders = request.getHeaders("Accept");
  • getHeaderNames()
    返回所有请求头名称。

    java 复制代码
    Enumeration<String> headerNames = request.getHeaderNames();
(3) 获取客户端和服务器信息
  • getRemoteAddr()
    获取客户端 IP 地址。

    java 复制代码
    String ip = request.getRemoteAddr();
  • getMethod()
    获取 HTTP 方法(GETPOSTPUTDELETE 等)。

    java 复制代码
    String method = request.getMethod();
  • getRequestURL()
    返回完整的请求 URL(StringBuffer 类型)。

    java 复制代码
    StringBuffer url = request.getRequestURL();
  • getRequestURI()
    返回请求的 URI(不包含协议、域名和端口)。

    java 复制代码
    String uri = request.getRequestURI(); // 如 "/app/login"
(4) 获取会话(Session)
  • getSession()
    获取当前会话,如果不存在则创建新会话。

    java 复制代码
    HttpSession session = request.getSession();
  • getSession(boolean create)
    如果 create=false,仅获取现有会话,不创建新会话。

    java 复制代码
    HttpSession session = request.getSession(false);
(5) 获取请求体(Body)
  • getInputStream()
    获取 ServletInputStream,用于读取二进制数据(如文件上传)。

    java 复制代码
    ServletInputStream inputStream = request.getInputStream();
  • getReader()
    获取 BufferedReader,用于读取文本数据(如 JSON、XML)。

    java 复制代码
    BufferedReader reader = request.getReader();
(6) 属性(Attribute)管理
  • setAttribute(String name, Object value)
    存储请求范围内的属性(可用于 JSP 或转发)。

    java 复制代码
    request.setAttribute("message", "Hello");
  • getAttribute(String name)
    获取请求属性。

    java 复制代码
    String msg = (String) request.getAttribute("message");
  • removeAttribute(String name)
    移除请求属性。

    java 复制代码
    request.removeAttribute("message");

2. HttpServletResponse(HTTP 响应对象)

HttpServletResponse 是 Java Servlet API 提供的接口,用于封装服务器对客户端的 HTTP 响应。它继承自 ServletResponse,并增加了 HTTP 协议相关的功能。

2.1 核心功能

(1) 设置响应状态
  • setStatus(int sc)
    设置 HTTP 状态码(如 200404500)。

    java 复制代码
    response.setStatus(HttpServletResponse.SC_OK); // 200
  • sendError(int sc, String msg)
    发送错误状态码和消息(如 404 Not Found)。

    java 复制代码
    response.sendError(HttpServletResponse.SC_NOT_FOUND, "Page not found");
(2) 设置响应头
  • setHeader(String name, String value)
    设置响应头(如 Content-TypeCache-Control)。

    java 复制代码
    response.setHeader("Content-Type", "text/html");
  • addHeader(String name, String value)
    添加多个同名响应头(如多个 Set-Cookie)。

    java 复制代码
    response.addHeader("Set-Cookie", "user=admin");
  • setContentType(String type)
    设置内容类型(如 text/htmlapplication/json)。

    java 复制代码
    response.setContentType("application/json");
  • setCharacterEncoding(String charset)
    设置字符编码(如 UTF-8)。

    java 复制代码
    response.setCharacterEncoding("UTF-8");
(3) 写入响应数据
  • getOutputStream()
    获取 ServletOutputStream,用于写入二进制数据(如图片、文件)。

    java 复制代码
    ServletOutputStream out = response.getOutputStream();
    out.write(bytes);
  • getWriter()
    获取 PrintWriter,用于写入文本数据(如 HTML、JSON)。

    java 复制代码
    PrintWriter writer = response.getWriter();
    writer.println("<h1>Hello World</h1>");
(4) 重定向
  • sendRedirect(String location)
    发送 302 重定向到指定 URL。

    java 复制代码
    response.sendRedirect("/login");
  • addCookie(Cookie cookie)
    向客户端添加 Cookie。

    java 复制代码
    Cookie cookie = new Cookie("username", "admin");
    response.addCookie(cookie);
(6) 缓存控制
  • setDateHeader(String name, long date)
    设置日期型响应头(如 Expires)。

    java 复制代码
    response.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 请求和响应处理。

相关推荐
Java中文社群2 分钟前
SpringAI版本更新:向量数据库不可用的解决方案!
java·人工智能·后端
珊瑚里的鱼3 分钟前
【双指针】专题:LeetCode 202题解——快乐数
开发语言·c++·笔记·算法·leetcode·职场和发展
王磊鑫15 分钟前
重返JAVA之路——图书管理系统
java·开发语言
听闻风很好吃18 分钟前
Java设计模式之观察者模式:从入门到架构级实践
java·观察者模式·设计模式
艺杯羹20 分钟前
JDBC 初认识、速了解
java·数据库·jdbc
xx155802862xx21 分钟前
matlab中进行海浪模型仿真
开发语言·matlab
陵易居士21 分钟前
Spring如何解决项目中的循环依赖问题?
java·后端·spring
铁弹神侯29 分钟前
Maven相关名词及相关配置
java·maven
会飞的皮卡丘EI42 分钟前
关于Blade框架对数字类型的null值转为-1问题
java·spring boot
2401_8582861142 分钟前
CD27.【C++ Dev】类和对象(18)友元和内部类
开发语言·c++·类和对象