一、HttpServletResponse
1.HttpServletResponse(响应)概述
我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。
service方法中的response的类型是ServletResponse,而doGet/doPost方法的response的类型是HttpServletResponse,HttpServletResponse是ServletResponse的子接口,功能和方法更加强大,= HttpServletRequest是ServletResponse接口的子类
2.response的运行流程
请求只能获取, 响应可以配置。响应会有一个缓冲区。
1.通过抓包工具抓取Http
3.通过response设置响应行
设置响应行的状态码
setStatus(int sc)
利用设置302状态码跳转页面
4.重定向
请求服务器两次,地址栏变化。
Location在下面的设置响应头有讲解
1.通过response设置响应头
addHeader(
String name,
String value)
addIntHeader(
String name, int value)
addDateHeader(
String name, long date)
setHeader(
String name,
String value)
setDateHeader(
String name, long date)
setIntHeader(
String name, int value)
其中,add表示添加,而set表示设置
重定向需要:1.状态码:302
2.响应头:location 代表重定向地址
设置自动跳转页面
这个和刚才的Location一样,也是用的setHeader方法
1.通过response设置响应体
(1)响应体设置文本
获得字符流,通过字符流的write(
String s)
方法可以将字符串设置到response缓冲区中,随后Tomcat会将response缓冲区中的内容组装成Http响应返回给浏览 器端。
关于设置中文的乱码问题
原因:response缓冲区的默认编码是iso8859-1,此码表中没有中文,可以通过 response的setCharacterEncoding(
String charset)
设置response的编码
但我们发现客户端还是不能正常显示文字
原因:我们将response缓冲区的编码设置成UTF-8,但浏览器的默认编码是本地系 统的编码,因为我们都是中文系统,所以客户端浏览器的默认编码是GBK,我们可以 手动修改浏览器的编码是UTF-8。
我们还可以在代码中指定浏览器解析页面的编码方式,
通过response的setContentType(
String type)
方法指定页面解析时的编码是UTF-8
response.setContentType("text/html;charset=UTF-8");
上面的代码不仅可以指定浏览器解析页面时的编码,同时也内含 setCharacterEncoding的功能,所以在实际开发中只要编写 response.setContentType("text/html;charset=UTF-8");就可以解决页面输出中文乱码问题。
(2)响应头设置字节
ServletOutputStream
getOutputStream()
获得字节流,通过该字节流的write(byte[] bytes)可以向response缓冲区中写入字 节,在由Tomcat服务器将字节内容组成Http响应返回给浏览器。
(3)解决响应体中文乱码问题
5.案例-完成文件下载
在网页配置里写
运行代码
这就完成了,但是这个样子如果还是不行那就是浏览器的问题了,不同浏览器编码不一样,所以得获取请求里面的请求头看看是哪一个浏览器版本,然后在解决。
解决乱码方法如下(不要记忆--了解):
//获取User-Agent获取客户端浏览器到底是哪个浏览器
String agent=request.getHeader("User-Agent");
String filenameEncoder=“”;
if (agent.contains("MSIE")) {
// IE浏览器
filenameEncoder= URLEncoder.encode(filename, "utf-8");
filenameEncoder= filenameEncoder.replace("+", " ");
} else if (agent.contains("Firefox")) {
// 火狐浏览器
BASE64Encoder base64Encoder = new BASE64Encoder();
filenameEncoder= "=?utf-8?B?"
+ base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
} else {
// 其它浏览器
filenameEncoder= URLEncoder.encode(filename, "utf-8");
}
其中agent就是请求头User-Agent的值