当前位置: 首页 > news >正文

HttpServletResponse 对象用来做什么? - 详解

HttpServletResponse 对象是由 Servlet 容器创建并传递给 Servlet 的 service() 方法(以及间接传递给 doGet(), doPost() 等方法)的。它的核心作用是让 Servlet 能够向客户端(通常是浏览器)发送 HTTP 响应

通过 HttpServletResponse 对象,我们可以:

  1. 设置响应状态码 (Status Code)
  2. 设置响应头 (Headers)
  3. 设置 Cookie
  4. 写入响应体 (Response Body),即发送内容回浏览器

下面我们详细看看如何进行这些操作:


1. 设置响应状态码 (Status Code)

状态码告诉浏览器请求的处理结果(例如,成功、未找到、服务器错误等)。


2. 设置响应头 (Headers)

响应头包含关于响应的元数据,例如内容类型、缓存控制、自定义信息等。


3. 设置 Cookie

Cookie 是服务器发送到用户浏览器并保存在本地的一小块数据,它们会在浏览器下次向同一服务器发起请求时被携带并发送到服务器上。


4. 将内容发送回浏览器 (写入响应体)

一旦状态码和头信息设置完毕,你就可以开始向响应体写入实际内容了。你有两种方式获取输出流:

重要: 你在一个响应中只能调用 getWriter()getOutputStream() 一次。调用其中一个后,就不能再调用另一个了,否则会抛出 IllegalStateException


完整示例 (一个简单的 Servlet):

package com.example
;
import java.io.IOException
;
import java.io.PrintWriter
;
import java.util.Date
;
import javax.servlet.ServletException
;
import javax.servlet.annotation.WebServlet
;
import javax.servlet.http.Cookie
;
import javax.servlet.http.HttpServlet
;
import javax.servlet.http.HttpServletRequest
;
import javax.servlet.http.HttpServletResponse
;
@WebServlet("/hello"
)
public
class HelloServlet
extends HttpServlet {
@Override
protected
void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException
, IOException {
// 1. 设置状态码 (默认是 200 OK,如果一切正常,可以不显式设置)
response.setStatus(HttpServletResponse.SC_OK
)
;
// 2. 设置响应头
response.setContentType("text/html; charset=UTF-8"
)
;
response.setHeader("X-Server-Time"
,
new Date(
).toString(
)
)
;
// 3. 设置 Cookie
Cookie visitCookie =
new Cookie("lastVisit"
, String.valueOf(System.currentTimeMillis(
)
)
)
;
visitCookie.setMaxAge(60 * 60 * 24 * 7
)
;
// 7 days
visitCookie.setPath(request.getContextPath(
) + "/"
)
;
visitCookie.setHttpOnly(true
)
;
response.addCookie(visitCookie)
;
// 4. 获取 PrintWriter 并写入响应体
// (注意:一旦调用 getWriter() 或 getOutputStream(),响应头就被认为是“已提交”,不能再修改状态码或头信息)
PrintWriter out = response.getWriter(
)
;
out.println("<!DOCTYPE html>");out.println("<html>");out.println("<head>");out.println("<meta charset=\"UTF-8\">");out.println("<title>Servlet Response</title>");out.println("</head>");out.println("<body>");out.println("<h1>Hello, World from Servlet!</h1>");out.println("<p>Welcome! Your request was processed successfully.</p>");out.println("<p>Check your browser's developer tools for the 'X-Server-Time' header and the 'lastVisit' cookie.</p>");out.println("</body>");
out.println("</html>"
)
;
// 通常不需要显式调用 out.close(),因为 Servlet 容器会在请求处理完成后自动关闭它。
// 但如果是在 Filter 中或有特殊资源管理需求,可能需要。
}
}

关键点总结:

  • 顺序很重要: 设置状态码、响应头和 Cookie 必须在第一次调用 response.getWriter()response.getOutputStream() 之前完成,或者在响应被提交(flushed)之前完成。一旦响应体开始写入,头信息就不能再更改了。
  • getWriter() vs getOutputStream(): 只能选择一个,不能同时使用。
  • 字符编码: 对于文本内容,务必设置正确的字符编码(通常是 UTF-8)以避免乱码问题。
  • 容器管理: Servlet 容器负责在请求处理结束后刷新和关闭输出流。

通过这些方法,HttpServletResponse 提供了全面的控制,使 Servlet 能够构建并发送各种类型的 HTTP 响应给客户端。

http://www.jsqmd.com/news/9146/

相关文章:

  • 牛客 周赛109 20250924
  • 罗技G102螺丝型号
  • 详细介绍:深入剖析C#构造函数执行:基类调用、初始化顺序与访问控制
  • [LUCKY」在Windows下使用STUN穿透实现Minecraft联机并设置SRV记录
  • 系统管理员的日常困境与幽默自嘲
  • 详细介绍:如何用 pnpm patch 给 element-plus 打补丁修复线上 bug(以 2.4.4 修复 PR#15197 为例)
  • Numericaltables1
  • Go 为何天生适合云原生? - 指南
  • ARC 207
  • 深入解析:C++:内存管理
  • 大数求余
  • vulkan游戏引擎renderer_backend实现 - 详解
  • 基于MPPT算法的光伏并网发电系统simulink建模与仿真
  • 实用指南:【系统架构设计师】2025年上半年真题论文回忆版: 论系统负载均衡设计方法(包括解题思路和参考素材)
  • 软件版悟空博弈+WAUC构筑元人文演化之路研究报告——声明Ai研究
  • QBXT2025S刷题 Day5题
  • Linux 中 m、mm、mmm 函数和 make 的区别 - 详解
  • 详细介绍:学习STC51单片机27(芯片为STC89C52RCRC)
  • [KaibaMath1001] 关于∀ε0,|a-b|ε = a=b的证明
  • 基于Web的分布式图集管理系统架构设计与实践 - 教程
  • 完整教程:Deepseek/cherry studio中的Latex公式复制到word中
  • AirSim 安装过程记录 - zzh
  • 国庆 Day2 强基物理
  • ZR 2025 十一集训 Day 6
  • LARAVEL安装报错:Illuminate\Database\QueryException could not find driver (Connection: sqlite, SQL:
  • unix/linux source 命令,其发展历程详细时间线、由来、历史背景 - 指南
  • 基于AXI模块的视频流传输(硬件连接篇)
  • 四、函数调用具备单个参数之Double类型-mmword,movsd,mulsd,addsd指令,总结汇编的数据类型
  • [GDOUCTF 2023]泄露的伪装
  • 仿射密码