Response概述
response是代表响应的对象。
Response继承结构
ServletResponse |-HttpServletResponse |
- ServletResponse
定义了Response应该具有的基本的方法
- HttpServletResponse
在ServletResponse的基础上增加了很多HTTP协议相关的方法
Response功能详解
设置状态码
void | setStatus(int sc) Sets the status code for this response. 设置状态码 |
设置响应头
void | setHeader(String name, String value) Sets a response header with the given name and value. 设置响应头,没有就增加,有就修改 |
void | setIntHeader(String name, int value) Sets a response header with the given name and integer value. |
void | setDateHeader(String name, long date) Sets a response header with the given name and date-value. |
void | addHeader(String name, String value) Adds a response header with the given name and value. 设置响应头,没有就增加,有也是增加,多个同名头并存 |
void | addIntHeader(String name, int value) Adds a response header with the given name and integer value. |
void | addDateHeader(String name, long date) Adds a response header with the given name and date-value. |
获取输出流
ServletOutputStream | getOutputStream() Returns a ServletOutputStream suitable for writing binary data in the response. 获取字节流,向客户端发送数据 |
getWriter() Returns a PrintWriter object that can send character text to the client. 获取字符流,向客户端发送数据 |
多次调用getOutputStream()得到的是同一个流
多次调用getWriter()得到的是同一个流
getOutputStream()和getWriter()是互斥的,在同一个response对象上只能获取一种
getOutputStream()和getWriter()不要手动关闭,Servlet容器会关闭此流
响应乱码解决
- getOutputStream()
利用字节流输出字符数据时,需要开发人员手动将字符转为字节,此时可以手动指定输出编码。
浏览器解析时,如果不指定,默认采用操作系统码解码数据。
如果两码不一致,产生乱码。
此时可以通过设置Content-Type的响应头,告知浏览器当前数据的格式及编码,命令浏览器用指定编码打开数据,乱码解决。
![]() |
可以手动设置Content-Type,也可以通过便捷方法设置
![]() |
- getWriter()
利用字符流输出字符数据时,会将字符按指定编码转为字节写入response响应体,最终发送给浏览器。
此编码默认为iso8859-1,其中没有中文,输出中文时必然产生乱码。
此时可以通过response.setCharacterEncoding();控制写入response时的编码,解决这个问题。
![]() |
除此之外,如果浏览器打开数据的编码和发送编码不一致仍然会有乱码,
可以通过response.setContentType()指定浏览器打开编码,解决乱码
![]() |
其实,setContentType方法,除了会设置Content-Type头,还会隐含的设置setCharacterEncoding,所以其实只需设置setContentType就可以解决响应乱码
![]() |
- 响应乱码解决总结
一句话解决响应乱码,无论字节流还是字符流
![]() |
实现请求重定向
重定向是javaweb三种资源跳转方式之一
原理就是通过302状态码加Location响应头,通知浏览器重定向访问指定资源,从而实现资源跳转。
- 请求重定向特点
浏览器和服务器之间的资源跳转 |
两次请求两次响应 |
无法通过request域传递数据 |
地址栏会发生变化 |
- 重定向实现
重定向是浏览器和服务器之间的资源跳转,地址是给浏览器用的,地址必须以应用名称开头。
- 手动实现重定向
![]() |
- 便捷方式实现重定向
![]() |
举例
![]() |
实现定时刷新
定时刷新时javaweb三种资源跳转方式之一
原理是通过refresh头命令浏览器在指定时间之后自动刷新访问一个新的地址,从而实现资源跳转。
- 定时刷新特点
浏览器和服务器之间的资源跳转 |
两次请求两次响应 |
无法通过request域传递数据 |
地址栏会发生变化 |
可以在资源跳转期间提示额外消息 |
- 定时刷新实现
重定向是浏览器和服务器之间的资源跳转,地址是给浏览器用的,地址必须以应用名称开头。
![]() |
举例
![]() |
- 禁止缓存
浏览器默认有缓存机制,可以缓存曾经访问过的资源,再次访问该资源时,可以直接使用本地缓存提高访问效率。
但有些资源,开发者不希望浏览器缓存,例如 验证码图片 二维码图片 等等
此时可以通过设置禁止缓存响应头,禁止浏览器缓存指定资源
![]() |
举例
![]() |