一:response概述
我们之前在创建Servlet时,会覆盖写service和doGet,doPost方法,而这些方法呢都有两个参数,一个是代表请求的request和响应的response。
response类型是指的是ServletResponse
doGet和doPost方法中的类型是HttpServletResponse。
HttpServletResponse是ServletResponse的一个子接口,功能显然更加的强大。
二:response运行流程
(1)用户从客户端发送http请求到服务器,服务器内核解析,封装成一个request对象,与此同时创建一个与之对应的response对象。再创建servlet对象,调用service方法。
(2)web应用(servlet)中的response书写的内容(通过response.getwrite().write()方法)写进response的缓冲区。
(3)最后服务器把从response缓冲区获得的内容,组装成一个具有响应行,响应头,响应体的http响应,最后客户端通过解析http响应体在显示所给的内容。
通过抓包工具获得的http响应,知道因为response代表响应,所以我们可以在服务器端对response对象进行设置响应行,响应头,响应体。
三:response对象设置响应
1.通过response设置响应行
主要是设置响应行中的状态码
通过setStatus(int sc)数字代码状态码;例如404
2.通过response设置响应头&重定向
一般有如下方法:setHeader()设置头最常用
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)
注意set设置和add添加的区别
重定向
状态码使用302,响应头中的location:代表重定向的地址
// 1.设置状态码为302
// response.setStatus(302);
// 2.设置响应头 location: url
// response.setHeader(“location”,”/javaweb2_war_exploded/hello1”);
每次跳转时,只有location的value发生改变,于是有了封装方法。response.sendRedirect( url );
hello为Servlet1的url,而hello1为Servlet2的url 配置文件如下:
特点:通过状态码使用302,客户端访问服务器多次,第一次是人为访问,第二次则是自动访问。其地址栏的地址会相应的发生变化。
3.通过response设置响应体
(1)响应体设置文本
通过response的getWriter()方法可以获取一个字符流,即PrintWriter。
然后通过字符流的write(String str)方法来将内容设置到response的缓冲区中,随后Tomcat会将response缓冲区中的内容组装成Http响应返回到浏览器端。
*****write()书写中文乱码的问题
原因:response缓冲区的默认编码是 iso8859-1,码表没有中文,可以通过response的setCharacterEncoding(charset)来设置response的编码,Windows默认为GBK,不要设置为UTF-8 因为浏览器默认编码是本地系统的默认编码,所以这样做还要手动修改浏览器编码。
response.setContentType(“text/html;charset=UTF-8”);
此方法底层包含两部分,修改缓冲区的编码,再加上修改浏览器的编码。包括setCharacterEncoding的功能。
(2)响应头设置字节(图片,视频)
response.getOutputStream() 这个方法可以获得字节流,通过字节流的write(byte[] bytes)可以向response缓冲区写入字节,再由服务器将字节内容组成http响应返回浏览器。
中间用到了IO流的知识
4.response 细节点:
(1)response获得的流不需要手动关闭,web容器(Tomcat)会帮我们关闭。
(2)getWrite和getOutputStream不能够同时的调用。不然会报以下错误。可以认为是同一个。