JavaWeb ——HttpServletResponse 响应对象全解析(附代码)

JavaWeb ——HttpServletResponse 响应对象全解析(附代码) HttpServletResponse 是 JavaWeb 三大对象之一与 HttpServletRequest 相辅相成前者封装客户端的所有请求数据后者封装服务器对客户端的所有响应数据。作为服务器向客户端传递结果的 “桥梁”HttpServletResponse 负责设置响应头、输出响应内容、控制响应状态、实现重定向等功能是 JavaWeb 开发中处理响应逻辑的必备工具。一、HttpServletResponse 概述1. 作用当服务器处理完客户端的请求后需要通过 HttpServletResponse 对象将处理结果如页面内容、数据、状态码、跳转指令等返回给客户端其作用包括设置响应头信息如 Content-Type、Refresh、Cookie 等输出响应正文如 HTML 内容、字符串数据、JSON 数据等设置响应状态码如 200 成功、404 资源不存在、500 服务器错误等实现请求重定向客户端跳转解决响应中文乱码问题2. 特性每一次请求对应一个独立的 HttpServletResponse 对象与 request 一一对应响应数据的发送顺序响应头 → 响应正文一旦调用response.getWriter()或response.getOutputStream()获取输出流后就不能再修改响应头否则会抛出异常响应完成后服务器会自动关闭输出流无需手动关闭3. API 分类HttpServletResponse 的方法按功能可分为 4 大类覆盖响应处理的全场景功能分类方法作用响应头操作setHeader(String name, String value)设置自定义响应头setContentType(String type)设置响应内容类型 编码便捷方法setCharacterEncoding(String charset)设置响应正文编码setHeader(Refresh, 秒数;URL目标路径)定时刷新 / 重定向响应状态码setStatus(int sc)设置响应状态码如 200、302sendError(int sc, String msg)发送错误状态码 自定义提示信息响应正文输出getWriter()获取字符输出流输出文本、HTML、JSON 等getOutputStream()获取字节输出流输出图片、文件等二进制数据重定向sendRedirect(String location)实现客户端跳转应用二、功能实战1. 实战 1输出响应正文 解决中文乱码基础向客户端输出文本或 HTML 内容是响应对象最常用的功能难点是解决中文乱码问题需保证响应编码与浏览器解码一致推荐 UTF-8。1 ServletResponseDataServlet.java包名cn.tx.servlet实现输出普通文本、HTML 标签、中文内容package cn.tx.servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; public class ResponseDataServlet extends HttpServlet { Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 解决响应中文乱码必须在获取输出流之前设置 // 方式1推荐一步到位同时设置响应类型和编码 response.setContentType(text/html;charsetUTF-8); // 方式2分步设置与方式1等效便于理解 // response.setCharacterEncoding(UTF-8); // 设置响应正文编码 // response.setHeader(Content-Type, text/html;charsetUTF-8); // 设置响应头 // 1. 获取字符输出流输出文本、HTML等字符数据 PrintWriter out response.getWriter(); // 2. 输出普通文本 out.write(Hello HttpServletResponsebr/); // 3. 输出中文验证无乱码 out.write(响应对象中文输出测试br/); // 4. 输出HTML标签浏览器会自动解析 out.write(h3这是响应输出的H3标题/h3); out.write(p stylecolor: red;这是红色的段落文本/p); // 5. 输出变量模拟动态数据 String username 张三; int age 25; out.write(p用户名 username 年龄 age /p); // 注意输出流无需手动关闭服务器响应完成后会自动关闭 } }2 配置 web.xml!-- 注册响应数据Servlet -- servlet servlet-nameResponseDataServlet/servlet-name servlet-classcn.tx.servlet.ResponseDataServlet/servlet-class /servlet servlet-mapping servlet-nameResponseDataServlet/servlet-name url-pattern/response/data/url-pattern /servlet-mapping3 运行验证访问地址http://localhost:8080/javaweb0315/response/data页面正确显示普通文本、中文内容、HTML 格式化标签中文无乱码证明编码设置生效规律响应编码设置必须在获取输出流getWriter ()之前否则编码设置无效2. 实战 2设置响应头定时刷新 / 重定向响应头是服务器向客户端传递额外信息的载体常用场景包括定时刷新、定时跳转、设置缓存策略等文档重点强调Refresh响应头的使用。1 ServletResponseHeaderServlet.javapackage cn.tx.servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; public class ResponseHeaderServlet extends HttpServlet { Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType(text/html;charsetUTF-8); PrintWriter out response.getWriter(); // 测试1设置自定义响应头可在浏览器F12→网络→响应头中查看 response.setHeader(My-Custom-Header, JavaWeb-Response-Demo); out.write(已设置自定义响应头可通过浏览器开发者工具查看br/); // 测试2定时刷新5秒后刷新当前页面 // response.setHeader(Refresh, 5); // out.write(5秒后自动刷新当前页面...br/); // 测试3定时重定向5秒后跳转到百度文档重点案例 response.setHeader(Refresh, 5; URLhttps://www.baidu.com); out.write(5秒后自动跳转到百度首页...br/); out.write(如果不想等待可点击a hrefhttps://www.baidu.com立即跳转/a); } }2 配置 web.xml!-- 注册响应头Servlet -- servlet servlet-nameResponseHeaderServlet/servlet-name servlet-classcn.tx.servlet.ResponseHeaderServlet/servlet-class /servlet servlet-mapping servlet-nameResponseHeaderServlet/servlet-name url-pattern/response/header/url-pattern /servlet-mapping3 运行验证访问地址http://localhost:8080/javaweb0315/response/header页面显示提示语5 秒后自动跳转到百度打开浏览器 F12→网络→找到当前请求→查看 “响应头”可看到自定义响应头My-Custom-Header: JavaWeb-Response-Demo注释掉定时重定向代码可测试定时刷新功能5 秒后页面重新加载3. 实战 3设置响应状态码错误处理响应状态码是服务器向客户端返回的 “请求处理结果标识”常用状态码包括 200成功、302重定向、404资源不存在、500服务器错误等文档要求掌握sendError()方法的使用。1 ServletResponseStatusServlet.javapackage cn.tx.servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; public class ResponseStatusServlet extends HttpServlet { Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType(text/html;charsetUTF-8); PrintWriter out response.getWriter(); // 方式1直接设置状态码仅设置不跳转错误页面 response.setStatus(200); // 200表示请求处理成功默认就是200可省略 out.write(状态码设置为200请求处理成功br/); // 方式2发送错误状态码自定义提示信息重点 // 场景模拟资源不存在返回404错误 // response.sendError(404, 您访问的资源不存在请检查URL是否正确); // 场景模拟服务器内部错误返回500错误 // response.sendError(500, 服务器内部错误请联系管理员); } }2 配置 web.xml!-- 注册响应状态码Servlet -- servlet servlet-nameResponseStatusServlet/servlet-name servlet-classcn.tx.servlet.ResponseStatusServlet/servlet-class /servlet servlet-mapping servlet-nameResponseStatusServlet/servlet-name url-pattern/response/status/url-pattern /servlet-mapping3 运行验证访问地址http://localhost:8080/javaweb0315/response/status页面显示 “状态码设置为 200请求处理成功”注释掉方式 1 代码解开方式 2 中 404 错误的注释重新访问页面显示 Tomcat 默认 404 错误页面同时显示自定义提示信息 “您访问的资源不存在请检查 URL 是否正确”同理解开 500 错误注释可测试服务器内部错误的响应效果4. 实战 4应用 —— 重定向sendRedirect ()重定向是 Response 最核心的应用之一属于客户端跳转服务器通过发送 302 状态码和目标路径让客户端重新发起请求文档要求熟练掌握并与请求转发区分。1 重定向原理客户端发起请求到 Servlet1Servlet1 调用response.sendRedirect(目标路径)服务器返回 302 状态码 目标路径客户端收到响应后自动重新发起请求到目标路径服务器处理新请求并返回结果整个过程属于两次请求2 编写 ServletResponseRedirectServlet.javapackage cn.tx.servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class ResponseRedirectServlet extends HttpServlet { Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1. 尝试向request域设置数据验证重定向无法共享request域数据 request.setAttribute(msg, 重定向测试的域数据); // 2.重定向重点方法response.sendRedirect() // 注意重定向是客户端跳转路径必须加【项目名】与请求转发的区别 String contextPath request.getContextPath(); // 动态获取项目名/javaweb0315 // 方式1重定向到项目内部资源推荐动态路径避免硬编码 response.sendRedirect(contextPath /response/data); // 方式2重定向到外部网站跨域跳转请求转发无法实现 // response.sendRedirect(https://www.baidu.com); // 方式3硬编码项目名不推荐项目名修改后需手动修改 // response.sendRedirect(/javaweb0315/response/data); } }3 配置 web.xml!-- 注册重定向Servlet -- servlet servlet-nameResponseRedirectServlet/servlet-name servlet-classcn.tx.servlet.ResponseRedirectServlet/servlet-class /servlet servlet-mapping servlet-nameResponseRedirectServlet/servlet-name url-pattern/response/redirect/url-pattern /servlet-mapping4 运行验证访问地址http://localhost:8080/javaweb0315/response/redirect效果 1地址栏从/response/redirect变为/response/data客户端跳转地址栏改变效果 2跳转到ResponseDataServlet的页面但无法获取request 域中设置的msg数据重定向是两次请求request 域失效效果 3注释掉内部跳转测试跨域重定向到百度请求转发无法实现跨域重定向可以5. 实战 5输出二进制数据拓展应用除了文本和 HTMLResponse 还可通过字节输出流getOutputStream()输出二进制数据如图片、文件下载等属于企业开发常用场景。1 编写 ServletResponseBinaryServlet.java以输出本地图片为例需在项目WebContent下放置一张图片test.jpgpackage cn.tx.servlet; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; public class ResponseBinaryServlet extends HttpServlet { Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1. 设置响应内容类型图片类型 response.setContentType(image/jpeg); // 2. 获取图片路径项目WebContent目录下的test.jpg String realPath getServletContext().getRealPath(/test.jpg); System.out.println(图片路径 realPath); // 3. 读取图片文件字节输入流 FileInputStream fis new FileInputStream(realPath); // 4. 获取响应字节输出流输出二进制数据 OutputStream os response.getOutputStream(); // 5. 字节流复制将图片数据写入响应流 byte[] buffer new byte[1024]; int len; while ((len fis.read(buffer)) ! -1) { os.write(buffer, 0, len); } // 6. 关闭输入流输出流无需手动关闭 fis.close(); } }2 配置 web.xml!-- 注册二进制响应Servlet -- servlet servlet-nameResponseBinaryServlet/servlet-name servlet-classcn.tx.servlet.ResponseBinaryServlet/servlet-class /servlet servlet-mapping servlet-nameResponseBinaryServlet/servlet-name url-pattern/response/binary/url-pattern /servlet-mapping3 运行验证在项目WebContent目录下放置一张名为test.jpg的图片访问地址http://localhost:8080/javaweb0315/response/binary页面正确显示图片证明字节输出流生效三、要点总结1. 知识点总结1响应中文乱码解决本质服务器响应编码与浏览器解码不一致默认 ISO-8859-1 不支持中文解决方案response.setContentType(text/html;charsetUTF-8)一步到位推荐关键编码设置必须在getWriter()或getOutputStream()之前调用否则无效2重定向与请求转发对比对比维度重定向response.sendRedirect ()请求转发request.getRequestDispatcher ()请求次数两次请求客户端重新发起一次请求服务器内部跳转地址栏改变显示目标路径不变显示原请求路径路径规则需加项目名客户端路径不加项目名服务器内部路径request 域无效两次请求新 request 对象有效一次请求共享 request 对象跨域支持支持可跳转到外部网站不支持仅能跳转项目内部资源执行效率低两次网络请求高服务器内部操作调用对象Response 对象的方法Request 对象的方法3字符输出流 vs 字节输出流输出流类型方法适用场景注意事项字符输出流getWriter()输出文本、HTML、JSON 等字符数据需设置编码避免中文乱码字节输出流getOutputStream()输出图片、文件、视频等二进制数据无需设置编码直接输出字节数组注意同一响应中不能同时使用两种输出流否则会抛出IllegalStateException异常2. 重点问题1重定向和请求转发的区别见上述对比表记住重定向是两次请求、地址栏变、跨域支持转发是一次请求、地址栏不变、跨域不支持。2为什么重定向无法获取 request 域中的数据重定向是客户端跳转整个过程包含两次独立的 HTTP 请求第一次请求的 request 对象在响应完成后会被销毁第二次请求会创建新的 request 对象两个 request 对象相互独立因此无法共享数据若需共享数据需使用 Session 域3响应中文乱码的原因及解决方案原因服务器默认使用 ISO-8859-1 编码响应正文该编码不支持中文导致中文被解析为乱码解决方案通过response.setContentType(text/html;charsetUTF-8)统一设置响应类型和编码保证服务器编码与浏览器解码一致4response.setContentType()和response.setCharacterEncoding()的区别setCharacterEncoding(String charset)仅设置响应正文的编码如 UTF-8不影响响应类型setContentType(String type)同时设置响应类型和编码如text/html;charsetUTF-8是便捷方法等效于response.setCharacterEncoding(UTF-8); response.setHeader(Content-Type, text/html;charsetUTF-8);开发中优先使用setContentType()一步到位避免遗漏。四、地址汇总输出响应正文 中文http://localhost:8080/javaweb0315/response/data设置响应头 定时跳转http://localhost:8080/javaweb0315/response/header设置响应状态码http://localhost:8080/javaweb0315/response/status重定向测试http://localhost:8080/javaweb0315/response/redirect输出二进制图片http://localhost:8080/javaweb0315/response/binary如果觉得本文对你有帮助欢迎点赞 收藏 关注、