阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

response对象

392次阅读
没有评论

共计 6827 个字符,预计需要花费 18 分钟才能阅读完成。

一、response 概述

response 是 Servlet.service 方法的一个参数,类型为 javax.servlet.http.HttpServletResponse。

在客户端发出每个请求时,服务器都会创建一个 response 对象,并传入给 Servlet.service()方法。response 对象是用来对客户端进行响应的,这说明在 service()方法中使用 response 对象可以完成对客户端的响应工作。

response 对象的功能分为以下四种:

  • 设置响应头信息;
  • 发送状态码;
  • 设置响应正文;
  • 重定向;

二、response 响应正文

response 是响应对象,向客户端输出响应正文(响应体)可以使用 response 的响应流,repsonse 一共提供了两个响应流对象:

  • PrintWriter out = response.getWriter():获取字符流;
  • ServletOutputStream out = response.getOutputStream():获取字节流;

当然,如果响应正文内容为字符,那么使用 response.getWriter(),如果响应内容是字节,例如下载时,那么可以使用 response.getOutputStream()。

注意:在一个请求中,不能同时使用这两个流!

不然会抛出 IllegalStateException 异常。

2.1、字符响应流

字符编码

在使用 response.getWriter()时需要注意默认字符编码为 ISO-8859-1,如果希望设置字符流的字符编码为 utf-8,可以使用 response.setCharaceterEncoding(“utf-8”)来设置。这样可以保证输出给客户端的字符都是使用 UTF- 8 编码的!

但客户端浏览器并不知道响应数据是什么编码的!如果希望通知客户端使用 UTF- 8 来解读响应数据,那么还是使用 response.setContentType(“text/html;charset=utf-8”)方法比较好,因为这个方法不只会调用 response.setCharaceterEncoding(“utf-8”),还会设置 content-type 响应头,客户端浏览器会使用 content-type 头来解读响应数据。

说明:

​Tomcat 响应数据默认使用 ISO-8859-1

​通常浏览器默认使用 GBK 编码

​response.setCharacterEncoding(“utf-8”);// 设置 response.getWriter()的字符编码

例子:

a)
response.getWriter().print(“大家好”);
因为 Tomcat 默认使用的是 ISO-8859- 1 编码,不支持中文。所以一定编码!

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.getWriter().print("大家好"); }

response 对象

b)
response.setCharacterEncoding(“utf-8”);
response.getWriter().print(“大家好”);
因为已经设置了字符流编码为 utf-8,所以响应给客户端的数据为 utf- 8 编码!
但因为浏览器默认使用的是 gbk 来解析响应数据,所以乱码!如果浏览器使用 utf- 8 编码,那么就不会乱码了。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setCharacterEncoding("utf-8"); response.getWriter().print("大家好"); }

response 对象
c)
response.setCharacterEncoding(“gbk”);
response.getWriter().print(“大家好”);
因为设置了字符流编码为 gbk,所以响应给客户端的数据为 gbk 编码!
因为浏览器默认使用 gbk 来解析数据,所以不会出现乱码!如果浏览器使用 utf- 8 编码,那么就会出现乱码!

把响应编码设置为 gbk

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setCharacterEncoding("gbk"); response.getWriter().print("大家好"); }

response 对象

说明:以前浏览器的编码是可以更改的,但现在大多数浏览器的编码不好更改!

d)
response.setContentType(“text/html;charset=utf-8”);
response.getWriter().print(“大家好”);
setContentType()方法有两个作用:

  • 设置字符流编码。等同与调用了 response.setCharacterEncoding(“utf-8”);
  • 设置 Content-type 响应头,即通知浏览器响应数据的编码为 utf-8。
    因为设置字符流的编码为 utf-8,所以响应给客户端数据为 utf- 8 编码
    因为设置了 Content-type 头为 utf-8,所以浏览器会使用 utf- 8 来解析响应数据
    没有乱码!

简单来说:setContentType(“text/html;charset=utf-8”)干了两件事:

​ 1、把响应的内容设置为 utf- 8 编码

​ 2、通知浏览器用 utf- 8 来解析数据

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");// 通知浏览器用 utf- 8 解码,自己响应的内容用 utf- 8 编码 response.getWriter().print("大家好"); }

e)
response.setHeader(“Content-type”,“text/html;charset=utf-8”)
等同于
repsonse.setContentType(“text/html;charset=utf-8”)

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");// 通知浏览器用 utf- 8 解码,自己响应的内容用 utf- 8 编码 // response.setHeader("Content-type", "text/html;charset=utf-8"); response.getWriter().print("大家好"); }

f)
response.getOutputStream().write(“大家好”.getBytes(“gbk”));
响应的数据是 gbk 编码
客户端浏览器默认使用 gbk 编码
所以没有乱码

缓冲区

response.getWriter()是 PrintWriter 类型,所以它有缓冲区,缓冲区的默认大小为 8KB。也就是说,在响应数据没有输出 8KB 之前,数据都是存放在缓冲区中,而不会立刻发送到客户端。当 Servlet 执行结束后,服务器才会去刷新流,使缓冲区中的数据发送到客户端。

如果希望响应数据马上发送给客户端:

​ 向流中写入大于 8KB 的数据;

​ 调用 response.flushBuffer()方法来手动刷新缓冲区;

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");// 通知浏览器用 utf- 8 解码,自己响应的内容用 utf- 8 编码 // response.setHeader("Content-type", "text/html;charset=utf-8"); response.getWriter().print("大家好"); // response.flushBuffer(); // 没有这句话,浏览器 5 秒钟之后才显示,有的话,立即就显示出来 try {Thread.currentThread().sleep(5000); } catch (InterruptedException e) {// TODO Auto-generated catch block e.printStackTrace();} }

三、设置响应头信息

可以使用 response 对象的 setHeader()方法来设置响应头!使用该方法设置的响应头最终会发送给客户端浏览器!

response.setHeader(“content-type”,“text/html;charset=utf-8”):设置 content-type 响应头,该头的作用是告诉浏览器响应内容为 html 类型,编码为 utf-8。而且同时会设置 response 的字符流编码为 utf-8,即 response.setCharaceterEncoding(“utf-8”);

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 通知浏览器用 utf- 8 解码,自己响应的内容用 utf- 8 编码 response.setHeader("Content-type", "text/html;charset=utf-8"); response.getWriter().print("大家好"); }

response.setHeader(“Refresh”,“5; URL=http://www.baidu.com”):5 秒后自动跳转到百度主页。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html;charset=utf-8");// 通知浏览器用 utf- 8 解码,自己响应的内容用 utf- 8 编码 // response.setHeader("Content-type", "text/html;charset=utf-8"); response.getWriter().print("大家好"); response.setHeader("Refresh","5; URL=http://www.baidu.com"); }

四、设置状态码及其他方法

response.setContentType(“text/html;charset=utf-8”)
等同与调用
response.setHeader(“content-type”,“text/html;charset=utf-8”);
response.setCharacterEncoding(“utf-8”):设置字符响应流的字符编码为 utf-8;
sendError(int sc) –> 发送错误状态码,例如404500
sendError(int sc, String msg) –> 也是发送错误状态码,还可以带一个错误信息!setStatus(int sc) –> 发送成功的状态码,可以用来发送 302
response.sendError(404,“您要查找的资源不存在”):当发送错误状态码时,Tomcat 会跳转到固定的错误页面去,但可以显示错误信息。
setHeader(String name, String value):适用于单值的响应头,例如如:response.setHeader(“aaa”,“AAA”);// 只有一个键和值
addHeader(String name, String value):适用于多值的响应头
response.addHeader(“aaa”,“A”);
response.addHeader(“aaa”,“AA”);
response.addHeader(“aaa”,“AAA”);
setIntHeader(String name, int value):适用于单值的 int 类型的响应头
response.setIntHeader(“Content-Length”, 888);
addIntHeader(String name, int value):适用于多值的 int 类型的响应头
setDateHeader(String name, long value):适用于单值的毫秒类型的响应头
response.setDateHeader(“expires”, 1000 * 60 * 60 * 24);
addDateHeader(String name, long value):适用于多值的毫秒类型的响应头

五、重定向

5.1、什么是重定向

当你访问 http://www.sun.com 时,你会发现浏览器地址栏中的 URL 会变成 http://www.oracle.com/us/sun/index.htm,这就是重定向了。

重定向是服务器通知浏览器去访问另一个地址,即再发出另一个请求。

response 对象

5.2、完成重定向

响应码为 200 表示响应成功,而响应码为 302 表示重定向。所以完成重定向的第一步就是设置响应码为 302。

因为重定向是通知浏览器再第二个请求,所以浏览器需要知道第二个请求的 URL,所以完成重定向的第二步是设置 Location 头,指定第二个请求的 URL 地址。

public class AServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setStatus(302); response.setHeader("Location", "http://www.tyschool.com"); } }

上面代码的作用是:当访问 AServlet 后,会通知浏览器重定向到传智主页。客户端浏览器解析到响应码为 302 后,就知道服务器让它重定向,所以它会马上获取响应头 Location,然发出第二个请求。

5.3、便捷的重定向方式

public class AServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.sendRedirect("http://www.baidu.com"); } }

response.sendRedirect()方法会设置响应头为 302,以设置 Location 响应头。

如果要重定向的 URL 是在同一个服务器内,那么可以使用相对路径,例如:

public class AServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.sendRedirect("/hello/BServlet"); } }

重定向的 URL 地址为:http://localhost:8080/hello/BServlet。

5.4、重定向小结

重定向是两次请求;

重定向的 URL 可以是其他应用,不局限于当前应用;

重定向的响应头为 302,并且必须要有 Location 响应头;

重定向就不要再使用 response.getWriter()或 response.getOutputStream()输出数据,不然可能会出现异常;

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-06-06发表,共计6827字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19351
评论数
4
阅读量
7993178
文章搜索
热门文章
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见 zabbix!轻量级自建服务器监控神器在 Linux 的完整部署指南 在日常运维中,服务器监控是绕不开的...
飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛 NAS 中安装 Navidrome 音乐文件中文标签乱码问题解决、安装 FntermX 终端 问题背景 ...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
开发者福利:免费 .frii.site 子域名,一分钟申请即用

开发者福利:免费 .frii.site 子域名,一分钟申请即用

  开发者福利:免费 .frii.site 子域名,一分钟申请即用 前言 在学习 Web 开发、部署...
小白也能看懂:什么是云服务器?腾讯云 vs 阿里云对比

小白也能看懂:什么是云服务器?腾讯云 vs 阿里云对比

小白也能看懂:什么是云服务器?腾讯云 vs 阿里云对比 星哥玩云,带你从小白到上云高手。今天咱们就来聊聊——什...
星哥带你玩飞牛NAS-4:飞牛NAS安装istore旁路由,家庭网络升级的最佳实践

星哥带你玩飞牛NAS-4:飞牛NAS安装istore旁路由,家庭网络升级的最佳实践

星哥带你玩飞牛 NAS-4:飞牛 NAS 安装 istore 旁路由,家庭网络升级的最佳实践 开始 大家好我是...
仅2MB大小!开源硬件监控工具:Win11 无缝适配,CPU、GPU、网速全维度掌控

仅2MB大小!开源硬件监控工具:Win11 无缝适配,CPU、GPU、网速全维度掌控

还在忍受动辄数百兆的“全家桶”监控软件?后台偷占资源、界面杂乱冗余,想查个 CPU 温度都要层层点选? 今天给...
三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Android 的最优解?

三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Android 的最优解?

  三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Andr...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
开源MoneyPrinterTurbo 利用AI大模型,一键生成高清短视频!

开源MoneyPrinterTurbo 利用AI大模型,一键生成高清短视频!

  开源 MoneyPrinterTurbo 利用 AI 大模型,一键生成高清短视频! 在短视频内容...
恶意团伙利用 PHP-FPM 未授权访问漏洞发起大规模攻击

恶意团伙利用 PHP-FPM 未授权访问漏洞发起大规模攻击

恶意团伙利用 PHP-FPM 未授权访问漏洞发起大规模攻击 PHP-FPM(FastCGl Process M...
星哥带你玩飞牛NAS-16:不再错过公众号更新,飞牛NAS搭建RSS

星哥带你玩飞牛NAS-16:不再错过公众号更新,飞牛NAS搭建RSS

  星哥带你玩飞牛 NAS-16:不再错过公众号更新,飞牛 NAS 搭建 RSS 对于经常关注多个微...
Prometheus:监控系统的部署与指标收集

Prometheus:监控系统的部署与指标收集

Prometheus:监控系统的部署与指标收集 在云原生体系中,Prometheus 已成为最主流的监控与报警...
让微信公众号成为 AI 智能体:从内容沉淀到智能问答的一次升级

让微信公众号成为 AI 智能体:从内容沉淀到智能问答的一次升级

让微信公众号成为 AI 智能体:从内容沉淀到智能问答的一次升级 大家好,我是星哥,之前写了一篇文章 自己手撸一...