1.Response_输出数据

1、Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象.

 

ServletResponse -- 通用的response提供了一个响应应该具有最基本的属性和方法|-HttpServletResponse -- ServletResponse的基础上针对于HTTP协议增加了很多强化的属性和方法

 

2、HttpServletResponse对象封装了向客户端发送响应状态码、响应头、实体数据的方法

案例一:向浏览器输出一段数据

*response.setContentType("text/html;charset=utf-8");

同时设定服务器的字符集编码,浏览器所用的字符集编码。

1getOutputStream() 获得一个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*getOutputStreamgetWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。要注意转发的情况,是同一个请求和响应,只能使用getOutputStreamgetWriter其中一种方法。

这两个流,缓存的数据会在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>