1.Response_输出数据
1、Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象.
ServletResponse -- 通用的response提供了一个响应应该具有最基本的属性和方法|-HttpServletResponse -- 在ServletResponse的基础上针对于HTTP协议增加了很多强化的属性和方法
2、HttpServletResponse对象封装了向客户端发送响应状态码、响应头、实体数据的方法
案例一:向浏览器输出一段数据
*response.setContentType("text/html;charset=utf-8");
同时设定服务器的字符集编码,浏览器所用的字符集编码。
1、用getOutputStream() 获得一个ServletOutputStream 字节流输出数据
按字节输出数据,如果输出的数据是表示一段字符的字节数据,则一定要指定浏览器以什么码表解码,浏览器默认用平台码表打开。
response.setHeader("content-type", "text/html;charset=utf-8"); //指定浏览器用utf-8解码 response.getOutputStream().write("中国".getBytes("utf-8")); //设置服务器用utf-8编码
2、用getWriter()获得一个PrintWriter字符输出流输出数据
response对象默认以ISO8859-1将需要输出到浏览器的字符进行编码,如果输出的字符在IOS8859-1中不存在,就会导致乱码问题。可以使用setCharacterEncoding(String charset)方法设置编码用的字符集
response.setHeader("content-type", "text/html;charset=utf-8"); //指定浏览器用utf-8解码//response.setCharacterEncoding("utf-8"); //设置服务器用utf-8编码 response.getWriter().write("中国"); //服务器很智能,setHeader这个头里设置了utf-8,服务器也会按utf-8编码,发给浏览器。
2.response实现文件下载
默认请求头和响应头都不能包含中文,包含的字符要属于ISO8859-1里存在的字符,乱码。
url编码方式 -百分号编码
利用这种算法将ascii码中没有的字符转换为ascii码中的有的字符表示的形式
//设置下载文件的名称,设置为“美女.jpg” response.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode("美女.jpg", "utf-8")); FileInputStream fis = new FileInputStream(this.getServletContext().getRealPath("1.jpg")); OutputStream os = response.getOutputStream(); byte[] bs = new byte[1024]; int i =0; while((i=fis.read(bs))!=-1){ os.write(bs,0,i); } fis.close();
3.response实现定时刷新页面
1、利用Response设置响应头refresh可以实现页面的定时刷新功能。
response.getWriter().write(new Date().toLocaleString()); response.setHeader("Refresh", "2"); //本页刷新 response.setContentType("text/html;charset=utf-8"); response.getWriter().write("恭喜注册成功,2秒回到主页"); response.setHeader("Refresh", "2;url=/day04/index.jsp");
2、用<meta http-equiv= "" content="">可以模拟头功能,实现页面刷新,虽然响应头里没有Refresh头
<html> <head> <meta http-equiv="Refresh" content="2;url=/day04/index.jsp"/> </head> <body> 注册成功啦...2秒回到主页 <br> </body> </html>
4.控制浏览器是否缓存资源
控制浏览器不要缓存当前资源:
response.setIntHeader("Expires",-1); response.setHeader("Cache-Control","no-cache"); response.setHeader("Pragma","no-cache");
告诉浏览器缓存这个页面一个月时间:
response.setDateHeader("Expires", System.currentTimeMillis()+1000L*3600*24*30); //以毫秒为单位,从1970年1月1日0时到当前的毫秒值+一个月的毫秒值
5.请求重定向_response注意事项
在大部分情况下请求重定向和转发的效果是差不多的,这时候我们推荐使用转发,以减少对服务器的访问。
而在某些情况下是需要使用重定向的,目的往往是为了改变浏览器地址栏里的地址(如登录成功后转到主页),和更改刷新操作(如加入商品到购物车后转到购物车页面的操作)
//重定向 //response.setStatus(302); //response.setHeader("Location", "/day04/index.jsp"); 或 response.sendRedirect("/day04/index.jsp");
response生成响应注意事项
1、同一个response,*getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。要注意转发的情况,是同一个请求和响应,只能使用getOutputStream和getWriter其中一种方法。
这两个流,缓存的数据会在response的缓冲区里,缓冲区已经定义为字节数据,就不要随便改为字符数据了。
//如果在getOutoutStream()后希望使用Writer输出,可以这么做: ServletOutputStream out = response.getOutputStream(); //编码要和response.setCharacterEncoding()一致 PrintWriter writer = new PrinterWriter(new OutputStreamWriter(out,”utf-8”)); //上述使用方式和getWriter()没有区别
2、*response中获取的输出流,在service方法结束后服务器会帮我们关闭,所以一般不要自己在Servlet中关闭这个流.
6.respons_实现验证码
ValiImg.java
//告诉浏览器不用缓存该图片 response.setDateHeader("Expires",-1); response.setHeader("Cache-Control", "no-cache"); response.setHeader("Pragma","no-cache" ); //随机数 private Random r = new Random(); private int randNum(int begin,int end){ //nextInt(end-begin) 返回0到(end-begin)之间的随机数字 return r.nextInt(end-begin)+begin; }
regist.html
<script type="text/javascript"> //地址变了就会重新加载图片 function changeImg(img){ img.src="/day04/servlet/ValiImg?time="+new Date().getTime(); } </script>