HTTPServletResponse
HttpServletResponse是一个接口,它继承自ServletResponse接口;同时又被HttpServletResponseWrapper接口实现。
HttpServletResponse对象由servlet容器创建,并将这个对象作为参数传递给servlet的service方法(如:doGet、doPost等)
现在简单介绍一下一下这些方法:
setStatus(int sc)方法:
设置此响应的状态代码。此方法用于设置没有错误时的返回状态代码(例如状态代码 SC_OK 或 SC_MOVED_TEMPORARILY)。如果有错误,并且调用者希望调用 Web 应用程序中定义的错误页面,则应改用 sendError
方法。
并且调用setStatus()方法后,容器会清除缓冲区,设置Location响应头,并保留cookie和其他头
参数:sc 是状态码
setHeader(String name, String value)方法:
用给定名称和值设置响应头。如果已经设置了头,则新值将覆盖以前的值。containsHeader
方法可用于测试在设置其值之前头是否存在;
name:头的名称
value:头值
getWriter()方法:
这个方法是ServletResponse接口中的方法;它是用来返回可将字符文本发送到客户端的 PrintWriter
对象
getOutputStream()方法:
返回适用于在响应中编写二进制数据的 ServletOutputStream
。servlet 容器不会编码二进制数据。
对 ServletOutputStream 调用 flush() 将提交响应。 可调用此方法或 #getWriter
编写正文,而不是两种方法都调用。
注意:它跟getWriter()方法,这两个方法这二者选其一,不能同时既调用getWriter方法又调用getOutputStream方法,两者同时调用会出现异常:throw IllegalStateException
return:ServletOutputStream;
response常见应用:
向客户端输出中文数据
用OutputStream()发送数据:
1.response.getOutputStream().write("中国".getBytes()); //以默认的编码发送数据,这里的默认编码是你系统的默认编码;
2.response.getOutputStream().write("中国".getBytes("UTF-8"));//以UTF-8编码发送数据,浏览器(默认使用Gb2312)会出现乱码。
解决办法:
1.通过设置响应头告知客户端编码方式:response.setHeader("Content-type","text/html;charset=UTF-8"); //告知浏览器数据类型及编码
2.通过meta标签模拟请求头:out.write("<meta http-equiv='Content-type' content = 'text/html;charset=utf-8'/>".getBytes());
3.response.setContentType("text/html;charset=UTF-8");
总结:程序以什么编码输出,就需要告诉客户端用什么编码显示。
用PrintWriter(字符流)发送数据:
示例:response.getWriter().write("中国");//会出现乱码
原因:以默认的编码发送数据ISO-8859-1(不支持中文),此时会发生乱码;
解决办法:
setCharacterEncoding("UTF-8");//将编码设置为UTF-8
response.setHeader("Context-type","text/html;charset=UTF-8");//告诉客户端用utf-8编码方式来解析数据
当然,我们还可以用一种更简单的方法:
response.setContentType("text/html;charset=UTF-8");
这个方法跟上面的两句代码实现的是一样的功能。
文件下载问题:
CAPTCHA图像(输出随机图片):Completely Automated Public Turing Test to Tell Computers and Humans Apart (全自动区分计算机和人类的测试),也就是我们通常说的验证码;
相关主要类:
---- BufferedImage:内存图像
---- Graphics:画笔
---- ImageIO:输出图像
---- 然后放到html页面上<img src="***"/>
这里要注意的是浏览器会默认缓存图片,这样的话就无法刷新验证码,也就是说当用户看不清验证码时,没法换一张。这里的解决方法是:
控制客户端不要缓存:
response.addHeader("Prama","no-cache");
response.setHeader("Cache-Control","no-cache");
response.setHeader("Expires",0);
这 三种方法分别是控制不同浏览器不要缓存,一般三种方法都要写,这样可以做到浏览器版本兼容;
response.setHeader("Expires",0)这个方法的“0”这个参数,表示你需要浏览器缓存的时间,当这个参数设置为0或者负数时,就是表示不要缓存。
当然,有时候我们又需要浏览器帮我们缓存数据,因为有些不怎么变化的数据,利用缓存可以减轻服务器的负担;
发送HTTP头,控制浏览器缓存当前文档内容:
response.setDateHeader("Expires",System.currentTimeMillis() + 1000*60*60)//缓存1个小时,这里这个时间是1970年1月1日00:00:00的时间
请求重定向:
请求重定向是指当一个web资源收到客户端请求后,自身没有请求所需的资源,然后通知客户端去访问另外一个web资源;
在请求重定向中,会发送2次请求,,地址栏会变化;增加服务器负担
重定向图解:
实现方式:
-- response.sendRedirect(String location)
参数:location 重定向的url