Servlet的Response对象解析

Response
1.Resonse的继承结构:
ServletResponse--HttpServletResponse
2.Response代表响应,于是响应消息中的 状态码、响应头、实体内容都可以由它进行操作,由此引伸出如下实验:
3.利用Response输出数据到客户端
response.getOutputStream().write("中文".getBytes())输出数据,这是一个字节流,是什么字节输出什么字节,而浏览器默认用平台字节码打开服务器发送的数据,如果服务器端使用了非平台码去输出字符的字节数据就需要明确的指定浏览器编码时所用的码表,以防止乱码问题。response.addHeader("Content-type","text/html;charset=gb2312")
response.getWriter().write(“中文”);输出数据,这是一个字符流,response会将此字符进行转码操作后输出到浏览器,这个过程默认使用ISO8859-1码表,而ISO8859-1中没有中文,于是转码过程中用?代替了中文,导致乱码问题。可以指定response在转码过程中使用的目标码表,防止乱码。response.setCharcterEncoding("gb2312");
其实response还提供了setContentType("text/html;charset=gb2312")方法,此方法会设置content-type响应头,通知浏览器打开的码表,同时设置response的转码用码表,从而一行代码解决乱码。
4.利用Response 设置 content-disposition头实现文件下载
设置响应头content-disposition为“attachment;filename=xxx.xxx”
利用流将文件读取进来,再利用Response获取响应流输出
http请求头和相应头中只能是iso8859-1字符集编码
如果文件名为中,一定要进行URL编码(又称百分号编码,一个汉字被编码为带三个百分号的字符),编码所用的码表一定要是utf-8

URLEncoder.encode("狗狗.jpg","utf-8"),浏览器收到通知后直接就能转化。

例如:

	response.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode("美女.jpg", "utf-8"));
		
		InputStream in = new FileInputStream(this.getServletContext().getRealPath("1.jpg"));
		OutputStream out = response.getOutputStream();
		
		byte[]bs = new byte[1024];
		int i = 0;
		while((i=in.read(bs))!=-1){
			out.write(bs,0,i);
		}
		
		in.close();

5.refresh头控制定时刷新
设置响应头Refresh为一个数值,指定多少秒后刷新当前页面
response.setHeader("Refresh", "1");//定时循环刷新页面
设置响应头Refresh为 3;url=/Day05/index.jsp,指定多少秒后刷新到哪个页面
response.setHeader("refresh", "3;url=/Day04/index.jsp");
可以用来实现注册后“注册成功,3秒后跳转到主页”的功能
在HTML可以利用<meta http-equiv= "" content="">标签模拟响应头的功能。
6.利用response设置expires、Cache-Control、Pragma实现浏览器是否缓存资源,这三个头都可以实现,但是由于历史原因,不同浏览器实现不同,所以一般配合这三个头使用
6.1控制浏览器不要缓存(验证码图片不缓存)设置expires为0或-1设置Cache-Control为no-cache、Pragma为no-cache
response.setIntHeader("Expires", -1);
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
6.2控制浏览器缓存资源。即使不明确指定浏览器也会缓存资源,这种缓存没有截至日期。当在地址栏重新输入地址时会用缓存,但是当刷新或重新开浏览器访问时会重新获得资源。
如果明确指定缓存时间,浏览器缓存是,会有一个截至日期,在截至日期到期之前,当在地址栏重新输入地址或重新开浏览器访问时都会用缓存,而当刷新时会重新获得资源。
<span style="white-space:pre">		</span>response.setDateHeader("Expires", System.currentTimeMillis()+1000l*3600*24*30);//通知浏览器缓存一个月
		
		InputStream in = new FileInputStream(this.getServletContext().getRealPath("1.jpg"));
		OutputStream out = response.getOutputStream();
		
		byte[]bs = new byte[1024];
		int i = 0;
		while((i=in.read(bs))!=-1){
			out.write(bs,0,i);
		}
		
		in.close();

7.Response实现请求重定向
7.1古老方法:response.setStatus(302);response.addHeader("Location","URL");
7.2快捷方式:response.sendRedirect("URL");
8Response注意的内容:
8.1对于一次请求,Response的getOutputStream方法和getWriter方法是互斥,只能调用其一,特别注意forward后也不要违反这一规则。
8.2利用Response输出数据的时候,并不是直接将数据写给浏览器,而是写到了Response的缓冲区中,等到整个service方法返回后,由服务器拿出response中的信息组成HTTP响应消息返回给浏览器。
8.3service方法返回后,服务器会自己检查Response获取的OutputStream或者Writer是否关闭,如果没有关闭,服务器自动帮你关闭,一般情况下不要自己关闭这两个流。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值