Response的功能

1.向客户端发送数据 (重点是乱码问题)

getOutputStream()
getWriter()

字节流发送数据的中文乱码问题

服务器端指定了用utf-8来发送数据, 浏览器在接受数据时, 如果不指定将使用默认的平台码GBK, 编解码不一致导致乱码.
解决方案:
response.setHeader("Content-Type", "text/html;charset=utf-8");// 通知浏览器使用utf-8打开服务器发送过去的数据
response.getOutputStream().write("中国".getBytes("utf-8"));// 指定编码为utf-8

字符流发送数据的中文乱码问题

利用字符流发送数据, 底层还是要转成字节. 服务器端如果不手动指定, 服务器默认会使用iso8859-1码表, 由于里面没有中文汉字, 所以服务器端发送给客户端就是一堆乱码, 客户端不管使用什么码表都无法转成正常的字符
服务器会根据getCharacterEncoding()方法返回的编码来发送数据, 如果没有指定, 该方法默认返回iso8859-1
解决方案:
第一步, 需要指定服务器发送数据使用utf-8
response.setCharacterEncoding("utf-8"); //通知服务器使用utf-8来发送响应实体中数据
第二步: 需要指定浏览器在接收数据时也使用同一个编码来打开数据
response.setHeader("Content-Type", "text/html;charset=utf-8");
等价于<==>
response.setContentType("text/html;charset=utf-8");

在通知浏览器使用什么编码接受服务器发送的数据时, 服务器很智能, 会使用相同的编码来发送数据, 所以指定服务器以什么编码发送数据的代码可以省略不写

总结: 不管是字符流还是字节流, 解决乱码问题, 可以用一行代码搞定:

response.setContentType("text/html;charset=xxx");

getOutputStream()和getWriter() 这两个方法是互斥的, 在一次请求当中调用了其中的一个, 就不能再调用另一个!!!
在调用完getOutputStream()或getWriter()方法之后, 不需要手动去关闭流, 服务器会自动帮我们去关闭!!!
这个两个方法获取到的流并不是指向客户端的流, 而是指向response缓冲区的流, 通过流将数据写入response缓冲区, service方法执行结束, 请求回到服务器, 由服务器将数据组织成响应消息打给浏览器!!


2.实现重定向

重定向的原理就是302+location, 通过设置状态码302和location响应头就可以实现重定向的效果
response.setStatus(302);
response.setHeader("Location", "/Day09/index.jsp");
这两行代码等价于
response.sendRedirect("/Day09/index.jsp");


3.实现定时刷新

定时刷新是通过Refresh响应头, 可以实现在多少秒之后跳转到另外一个资源
response.setHeader("Refresh", "3;url=/Day09/index.jsp");


总结:

请求转发/请求重定向/定时刷新都可以实现资源的跳转, 区别是什么呢?**

请求转发:
一次请求,一次响应 request对象是同一个
地址栏不会发生变化
只能用于服务器内部的资源跳转, 并且只能是同一应用中的不同资源上进行跳转, 不可用在不同应用和不同服务器中的资源跳转

请求重定向:
两次请求,两次响应 request对象不是同一个
地址栏会发生变化
可以用于服务器内部的资源跳转, 也可以用于不同应用和不同服务器之间的资源跳转

定时刷新:
两次请求,两次响应 request对象不是同一个
地址栏会发生变化
可以用于服务器内部的资源跳转, 也可以用于不同应用和不同服务器之间的资源跳转
和重定向不同的是, 定时刷新可以在刷新到新的地址之间设置一个时间, 在间隔的这段时间内可以输出文本到浏览器并维系一段时间

那什么时候用哪种方式进行资源的跳转呢?
如果是同一服务器中的同一应用内部的资源跳转:
~如果需要利用request域在跳转的资源之间传输数据, 只能用请求转发
~如果不想让地址栏发生变化, 只能用请求转发
~如果需要地址栏发生变化, 只能用重定向或定时刷新
~如果没有什么特殊需求, 三种方式都可以, 但是推荐使用转发, 可以减少请求次数降低服务器的压力.
~如果只是想更新刷新操作, 最好使用重定向或定时刷新, 使用请求转发, 在刷新时会把刚才的操作再做一遍, 可能会导致一些问题, 比如表单重复提交或重复支付订单等
如果是不同服务器或不同应用内部的资源跳转, 只能用重定向或这定时刷新:
重定向和定时刷新的主要区别在于: 重定向会立即跳转, 而定时刷新可以设置一个时间间隔, 在指定时间后再进行跳转.
如果在跳转之前需要输出提示信息(如: 注册成功, xx秒后跳转到xxx)只能用定时刷新, 否则两种方式都可以.


4.控制浏览器的缓存行为 (!掌握)

由于不同的浏览器的缓存行为可能是不同的, 我们可以在服务器中通过设置响应头来控制浏览器的缓存行为!!
控制浏览器不要缓存:
setDateHeader("Expires", -1);
setHeader("Cache-control", "no-cache");
setHeader("Pragma", "no-cache");
控制浏览器缓存:
setDateHeader("Expires", System.currentTimeMillis()+10006060*24);
setHeader("Cache-control", "max-age=60");

附:
HTTP1.1 响应码 -- 一个3位的数字, 范围为100~600, 表示服务器处理请求的结果
200~299 表示服务器正确的处理了请求
300~399 表示服务器正确的处理了本次请求, 但是如果想要继续执行, 还需要更多的额外信息
400~499 表示客户端的请求有问题
500~599 表示服务器端发生了问题

200 表示服务器处理成功
302 表示请求重定向
304/307 通知浏览器使用缓存资源
404 表示客户端请求的资源不存在
500 表示服务器端处理请求出错

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,036评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,046评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,411评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,622评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,661评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,521评论 1 304
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,288评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,200评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,644评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,837评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,953评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,673评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,281评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,889评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,011评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,119评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,901评论 2 355

推荐阅读更多精彩内容

  • 编码问题一直困扰着开发人员,尤其在 Java 中更加明显,因为 Java 是跨平台语言,不同平台之间编码之间的切换...
    x360阅读 2,480评论 1 20
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,656评论 18 139
  • request乱码指的是:浏览器向服务器发送的请求参数中包含中文字符,服务器获取到的请求参数的值是乱码; resp...
    Aldeo阅读 1,123评论 0 1
  • 主要内容 1. 字符编码理论简述 本文主要是围绕Web开发中涉及到的中文编码这一常见问题展开,包括了对字符编码基础...
    topgunviper阅读 13,309评论 5 28
  • 躁动的鞭炮 空气中充斥着火药的味道 新年的祷告 穿过我的耳道 听起来是那么聒噪 裹紧棉袄 蜷缩在那 颤抖的楼脚
    书中简阅读 142评论 0 1