Response介绍

[基于达内教育的学习,总结提炼]

概念:

response对象是用来对客户端进行响应的

继承关系:

ServletRequest、ServletResponse: 当浏览器发出请求时, Web容器创建一个ServletRequest对象封装请求信息, 一个ServletResponse对象封装响应信息. 两个对象作为Servlet的service()方法中的参数.

HttpServletRequest、HttpServletResponse: 丰富了SerlvetRequest、ServletResponse, 提供了http协议相关的内容.

基本API:

设置状态码的方法
void setStatus(int sc)        // sc ---> status code 状态码
void setStatus(int sc, String sm)        // sm ---> status message 状态的描述(java8中已经被弃用了,被标记为过时deprecated)
设置响应头的方法
void setHeader(String name, String value) 
void setDateHeader(String name, long date)
void setIntHeader(String name, int value) 

void addHeader(String name, String value) 
void addDateHeader(String name, long date)
void addIntHeader(String name, int value)
set方法是如果没有则添加,如果有则更新
add方法是无论有没有都添加新的

设置响应内容的方法
ServletOutputStream getOutputStream() 
PrintWriter getWriter()

Response作用:

1. 向客户端发送数据 ( 即服务器向应答实体添加内容 )

1) 字节流发送数据        getOutputStream()                                                                                            乱码问题: 服务器用的utf-8发送数据, 然而浏览器接收数据, 如果不指定特殊编码, 默认为gbk码, 导致编码解码不一致.                                                                                                                              解决方法: response.setHeader("Context-Type","text/html;charset=utf-8"); // 使浏览器用utf-8接收服务器发送过来的数据.

response.setHeader("Context-Type","text/html;charset=utf-8"); response.setContentType("text/html;charset=utf-8");两者等价

response.getOutputStream().write("中国".getBytes("utf-8"));// 把‘中国’以utf-8的格式存入response容器. getBytes()默认的编码是系统本地字符集

2) 字符流发送数据        getWriter()                                                                                                        乱码问题: 用字符流发送数据, 底层字符流要转换成字节流, 服务器不手动指定编码,默认使用iso8895-1码表,由于里面没有中文汉字,所以服务器发给客户端就是一堆乱码                                        服务器会根据getCharacterEncoding()方法返回的编码来发送数据. 如果没有指定, 则默认返回iso8895-1.                                                                                                                                              解决方法: 一. 指定服务器发送响应实体数据使用utf-8        response.setCharacterEncoding("utf-8")                                                                                                                                                                          二.指定浏览器在接收数据使用同一个码表          response.setHeader("Context-Type","text/html;charset=utf-8");   或者  response.setContentType("text/html;charset=utf-8");               注意: 通知浏览器使用什么编码接收服务器发送的数据, 服务器会使用相同的编码来发送数据, 所以指定服务器发送响应实体数据可以省略.                                                                                               getOutputStream()和getWriter()两个方法互斥, 在一次请求中调用了其中的一个方法,就不能调用另一个方法.                                                                                                                                        调用完getOutputStream()或getWriter()方法后, 不用手动关闭流, 服务器会自动帮助我们关闭.          这两个方法获取到的流并不是指向客户端的流, 而是指向response缓冲区的流, 通过流数据写入response缓冲区,service方法执行结束, 请求回到服务器, 服务器将数据打包给浏览器.

    综上: response.setContentType("text/html;charset=utf-8");可以解决乱码问题

2. 实现重定向

原理: 302+location, 通过设置状态码302和location响应头可以实现重定向

response.setStatus(302);                                                                                                                response.setHeader("location", "http://localhost/day11/index.jsp"); 

以上两行代码   <------>    response.sendRedirect("day11/index.jsp") 

特点: 两次请求,两次应答. | 服务器收到302+location后,自动发出新请求. | 地址栏发生变化. | 重定向可以访问服务器内部的资源, 也可以访问服务器外部的资源.                              

3. 实现定时刷新

概念: 通过Refresh响应头, 实现在多少秒之后跳转到另外一个资源

response.setHeader("refresh", "3;url=/day11/index.jsp");

特点: 两次请求,两次应答 | 在第二次请求前,会停留一段时间来显示第一次的响应内容 | 地址栏发生变化. | 重定向可以访问服务器内部的资源, 也可以访问服务器外部的资源. 

4.控制浏览器的缓存行为

1) 控制缓存资源

response.setDateHeader("Expires",System.currentTimemills()+缓存时间(ms))

response.setHeader("cache-control","max-age=缓存时间(s)")

2) 控制不缓存资源

response.setHeader("pragma","no-cache")   不缓存

response.setHeader("cache-control","no-cache")    不使用过期的资源

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值