Response对象
一. 功能:设置响应消息
-
设置响应行
1. 格式:HTTP/1.1 200 ok
2. 设置状态码:setStatus(int sc) -
设置响应头:setHeader(String name, String value)
-
设置响应体:
使用步骤:- 获取输出流
字符输出流:PrintWriter getWriter()
字节输出流:ServletOutputStream getOutputStream() - 使用输出流,将数据输出到客户端浏览器
- 获取输出流
二.案例
案例1.重定向 (资源跳转的方式)
(1) 原理
浏览器想请求Aservlet中的资源,Aservlet中没有,于是Aservlet就响应浏览器告诉浏览器Bservlet中有它所需要的资源,并且附带Bservlet的地址。浏览器接收到响应后,通过地址再去请求Bservlet。
(2) 重定向实现
根据原理实现如下
//1. 设置状态码为302
response.setStatus(302);
//2.设置响应头location
response.setHeader("location","/responseDemo2");
我们发现302,是固定的,"location"也是固定的,只有路径不是固定的。response中封装了这两个方法变成一个方法。如下
//简单的重定向方法
response.sendRedirect("/responseDemo2");
示例
结果全部访问到了
(3) 重定向的特点:redirect (和转发特点相反)
- 地址栏发生变化(demo1变为demo2)
- 重定向可以访问其他站点(服务器)的资源(可以定向到百度之类的网站)
- 重定向是两次请求。不能使用request对象来共享数据(因为有两个request对象了)
与之相比较的转发的特点:forward
1. 转发地址栏路径不变
2. 转发只能访问当前服务器下的资源
3. 转发是一次请求,可以使用request对象来共享数据*
(4) 路径写法(什么时候用需要加虚拟路径)
- 规则:判断定义的路径是给谁用的?判断请求将来从哪儿发出,从哪发出就是给谁用
- 给客户端浏览器使用:需要加虚拟目录
- 比如访问服务器文件的路径,重定向
- 建议虚拟目录动态获取:request.getContextPath()
- 给服务器使用:不需要加虚拟目录
- 比如转发路径(服务器转发到另一个服务器)
- 给客户端浏览器使用:需要加虚拟目录
解释
假设一个学校有两个班级这两个班级都有一个叫张三的学生。有一个外卖小哥来送外卖(送给1班的张三)。
给服务器用:好比外卖小哥在一班里喊 “张三拿外卖” 不需要加一班的前缀,因此不需要虚拟路径。
给浏览器用:好比外卖小哥站在楼底喊 “一班的张三来拿外卖” 此时就需要加一班的前缀,因此需要虚拟路径。
案例2 .response输出字符数据到浏览器
(1) 实现步骤
结果 乱码
乱码原因:编码和解码使用的字符集不一样,获取的流的默认编码是ISO-8859-1,而浏览器默认字符集是GBK
解决方法:在获取字符输出流之前,添加下图两个红框中任意一个红框中的内容即可
// //设置流的默认编码
// resp.setCharacterEncoding("utf-8");
// //告诉浏览器服务器发送消息的数据编码,建议浏览器使用该编码
// resp.setHeader("content-type","text/html;charest=utf-8");
resp.setCharacterEncoding("utf-8");
//resp 封装好的方法
resp.setContentType("text/html;charest=utf-8");
结果
(2) 注意事项
- 字符流是伴随着response销毁而销毁的,不需要手动关闭
- 使用字符流之前,无论需不需要输出中文都要加
resp.setCharacterEncoding(“utf-8”);
resp.setContentType(“text/html;charest=utf-8”);
这是一种好习惯
案例3 .response输出字节数据到浏览器
- 步骤:
1. 获取字节输出流
2. 输出数据
也要设置为相同的编码集
结果