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

相关推荐
我很好我还能学4 分钟前
【面试篇 9】c++生成可执行文件的四个步骤、悬挂指针、define和const区别、c++定义和声明、将引用作为返回值的好处、类的四个缺省函数
开发语言·c++
程序员JerrySUN17 分钟前
[特殊字符] 深入理解 Linux 内核进程管理:架构、核心函数与调度机制
java·linux·架构
2302_8097983220 分钟前
【JavaWeb】Docker项目部署
java·运维·后端·青少年编程·docker·容器
蓝婷儿25 分钟前
6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础
开发语言·python·学习
渣渣盟41 分钟前
基于Scala实现Flink的三种基本时间窗口操作
开发语言·flink·scala
网安INF44 分钟前
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
java·web安全·网络安全·flink·漏洞
一叶知秋哈44 分钟前
Java应用Flink CDC监听MySQL数据变动内容输出到控制台
java·mysql·flink
jackson凌1 小时前
【Java学习笔记】SringBuffer类(重点)
java·笔记·学习
sclibingqing1 小时前
SpringBoot项目接口集中测试方法及实现
java·spring boot·后端
程序员JerrySUN1 小时前
全面理解 Linux 内核性能问题:分类、实战与调优策略
java·linux·运维·服务器·单片机