HttpServletRequest与HttpServletResponse的区别

HttpServletRequest and HttpServletResponse

Posted by Marlin on November 4, 2025

HttpServletRequest 与 HttpServletResponse 的区别

一、HttpServletRequest —— 封装客户端请求

📌 核心作用

获取客户端发来的所有信息:参数、请求头、会话、协议、路径等。

✅ 常用方法分类总结

类别 方法 说明 示例
获取请求参数 String getParameter(String name) 获取单个参数值(表单、URL) request.getParameter("username")
  String[] getParameterValues(String name) 获取多个同名参数(如 checkbox) request.getParameterValues("hobby")
  Map<String, String[]> getParameterMap() 获取所有参数(键值对) 用于日志或统一处理
获取请求属性(服务器端设置) Object getAttribute(String name) 获取 request 作用域的数据 request.getAttribute("user")
  void setAttribute(String name, Object o) 设置属性(Servlet → JSP 传值) request.setAttribute("msg", "OK")
  void removeAttribute(String name) 移除属性
获取请求路径/URL 信息 String getRequestURI() 请求路径(不含协议/主机) /exp01/hello
  String getContextPath() 应用上下文路径 /exp01
  String getServletPath() Servlet 路径 /hello
  String getQueryString() URL 中 ? 后的参数 name=marlin&age=20
获取请求头 String getHeader(String name) 获取某个请求头 request.getHeader("User-Agent")
  Enumeration<String> getHeaderNames() 获取所有请求头名
获取会话(Session) HttpSession getSession() 获取或创建 session request.getSession().setAttribute("loginUser", user)
  HttpSession getSession(boolean create) false 表示不自动创建 用于判断是否登录
获取客户端信息 String getRemoteAddr() 客户端 IP 地址 192.168.1.100
  String getMethod() 请求方法(GET/POST) "GET"
  String getProtocol() HTTP 协议版本 "HTTP/1.1"

⚠️ 注意:

  • getParameter() 只能获取客户端提交的数据(表单、URL 参数)
  • getAttribute() 只能获取服务器端 set 的数据(仅当前请求有效,常用于 forward)

二、HttpServletResponse —— 封装服务器响应

📌 核心作用

向客户端发送响应:设置状态码、响应头、重定向、输出内容等。

✅ 常用方法分类总结

类别 方法 说明 示例
发送重定向 void sendRedirect(String location) 302 重定向(客户端跳转) response.sendRedirect("login.html")
设置响应头 void setHeader(String name, String value) 设置普通响应头 response.setHeader("Cache-Control", "no-cache")
  void setContentType(String type) 设置响应内容类型(MIME) response.setContentType("text/html;charset=UTF-8")
  void setCharacterEncoding(String enc) 设置字符编码 response.setCharacterEncoding("UTF-8")
获取输出流 PrintWriter getWriter() 获取字符输出流(写文本) 用于输出 HTML、JSON
  ServletOutputStream getOutputStream() 获取字节输出流(写二进制) 用于下载文件、图片
  ⚠️ 两者不能同时用
设置状态码 void setStatus(int sc) 设置 HTTP 状态码 response.setStatus(404)
Cookie 操作 void addCookie(Cookie cookie) 向客户端添加 Cookie response.addCookie(new Cookie("theme", "dark"))

💡 典型使用场景:

1
2
3
4
// 输出简单 HTML
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<h1>你好</h1>");

三、对比记忆表(重点!)

功能 HttpServletRequest HttpServletResponse
方向 客户端 → 服务器 服务器 → 客户端
拿数据 getParameter()(用户输入)
getAttribute()(服务器存的)
❌ 不能拿客户端数据
发数据 ❌ 不能直接发 getWriter() / getOutputStream()
跳转 RequestDispatcher.forward()(服务器内部转发) sendRedirect()(客户端重定向)
作用域 可获取 request/session/application 属性 不能直接操作作用域

四、转发(forward) vs 重定向(redirect)速记

  转发(forward) 重定向(redirect)
谁做的? 服务器内部 浏览器重新请求
URL 变吗? ❌ 不变 ✅ 变成新地址
能传 request 属性吗? ✅ 能(getAttribute 可用) ❌ 不能(新请求)
用哪个对象? request.getRequestDispatcher().forward() response.sendRedirect()