ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

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

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 响应给客户端。

返回列表