当前位置: 首页 > 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.gsyq.cn/news/16481.html

相关文章:

  • [LUCKY」在Windows下使用STUN穿透实现Minecraft联机并设置SRV记录
  • 详细介绍:如何用 pnpm patch 给 element-plus 打补丁修复线上 bug(以 2.4.4 修复 PR#15197 为例)
  • Go 为何天生适合云原生? - 指南
  • ARC 207
  • 深入解析:C++:内存管理
  • [KaibaMath1001] 关于∀ε0,|a-b|ε = a=b的证明
  • 基于Web的分布式图集管理系统架构设计与实践 - 教程
  • 国庆 Day2 强基物理
  • unix/linux source 命令,其发展历程详细时间线、由来、历史背景 - 指南
  • AtCoder Regular Contest 207 (Div.1) 游记
  • 详细介绍:云原生时代 Kafka 深度实践:05性能调优与场景实战
  • 从零开始学Flink:数据输出的终极指南
  • 自然语言处理(NLP)的系统学习路径规划 - 实践
  • 【JNI】JNI基础语法
  • 从Chrome渲染器代码执行到内核:MSG_OOB漏洞分析与利用
  • US$78.85 KEYDIY KD ZB42-4 Universal Smart Remote Key 3+1 Buttons for Lexus Type 5pcs/lot
  • Python中小整数对象池、intern机制和大整数对象池
  • ctf逆向常见算法----base64
  • 02020409 EF Core基础09-一对一、多对多、EF Core基于关系的复杂查询
  • 02020503 EF Core高级03-分页查询、IQuerable底层的实现形式、DataReader、DataTable、EF Core中的异步方法
  • P2831 [NOIP 2016 提高组] 愤怒的小鸟 题解
  • MariaDB收购SkySQL增强AI与无服务器能力
  • 阿里云为何,一个邮箱绑定了两个账号 - 教程
  • 深入解析:【设计模式-3.5】结构型——装饰器模式
  • 阿爸阿爸
  • Python 数据分析与可视化实战:从数据清洗到图表呈现 - 指南
  • 【深度学习优化算法】02:凸性 - 详解
  • 调了很久的代码总结
  • 在Windows上搭建 EasyTier 公共服务器
  • ARC 207 (Div.1)