Response的使用入门

一、Servlet访问过程
  1. response:是Servlet里一块区域,可以通过人为修改之后由tomcatMS引擎重新写入Http
  2. request :经过tomcatMS引擎封装的http请求体信息

名词说明:     
  1. service(ServletRequest,ServletReponse)
    由来:在Servlet接口中的方法,目的是接收传递response和request 的参数
     
  2. doGet(HttpServletRequest,HttpServletReponse)
    由来:doGet方法在HttpServlet类中
              HttpServletRequest继承ServletRequest

              HttpServletResponse继承ServletRequest

二、HttpServletResponse的使用
  1. 什么是http响应

     响应行

    响应头

    响应体
  2. 可以设置的一些参数
    响应行中:可以设置状态码setStatus(int) //200 302 304 404 500
    1. res.setStatus(500);


    响应体头中:
    1. 设置时间:
      格式:
      addDateHeader(String name,long value);//添加新的参数
      setDateHeader(String name,long value);//修改原有参数
      例子:
      1. res.addDateHeader("timer", new Date().getTime());


    2. 设置文本
      格式:
      addHeader(String name,String value);//添加新的参数
      setHeader(String name,String value);//修改原有参数
      例子:
      1. res.addHeader("name", "abc");

    3. 设置数字
      格式:
      addIntHeader(String name,int value);//添加新的参数
      setIntHeader(String name,int value);//修改原有参数
      例子:
      1. res.addIntHeader("unmber", 123);

      注意:setHeader和addHeader的区别?
      setHeader如果有同名的覆盖  addHeader追加头信息

      响应体:服务端向前端页面回写数据
      格式:
      PrintWriter writer = response.getWriter();//字符流
      ServletOutputStream out = response.getOutputStream();//字节流
      例子:
      1. //设定字符编码解码方式
      2. res.setContentType("text/html; charset=UTF-8");
      3. String str="你好 中国";
      4. //获得Servlet的Response输出流
      5. PrintWriter writer = res.getWriter();
      6. //写出数据到内存
      7. writer.println(str);

  3. response的案例
    1. 重定向(状态码302)
      技术实现:302+location
                       302:状态码 代表中定向的状态码
                       location:头信息 代表跳转的头信息
      1. //设置重定向状态码
      2. res.setStatus(302);
      3. //设置重定向访问路径
      4. res.setHeader("location", "/Demo6/servlet2");

      注意:重定向的特点?
      (1) 客户端访问服务端两次
      (2) 地址栏的地址变化了
      在实际的开发我们实现重定向不用此方式
      response为我们直接提供了一个重定向的方法sendRedirect("url");
      例子:
      1. //设置重定向状态码
      2. res.setStatus(302);
      3. //设置重定向访问路径
      4. res.sendRedirect("/Demo6/servlet2");
    2. 定时跳转
      通过refresh的头可以实现定时跳转(此方法不需要设置重定向状态码)
      1. res.setHeader("refresh", "5;url=/Demo6/servlet2");
      注意:定时跳转的特点?
      (1) 客户端访问服务端两次 但是有时间的拖延
      (2) 地址栏的地址变化了
    3. 缓存机制:代表缓存的状态码是304
      1. last-modified:出现在响应头中,代表服务器文件最有一次修改的时间|

      2. if-modified-since:出现在请求头中,代表本地缓存中的服务器文件最后一次修改的时间。

      3. 状态码是304拿缓存

        设置缓存资源的生命周期:
        expires头:代表缓存 代表资源缓存的时间
        1. res.addDateHeader("expires", new Date().getTime()+1*60*1000);//设置这个web资源的缓存时间是1分钟

    4. 向页面输入内容
      如果向页面输出中文 会导致乱码 切值都是?????
      问题:乱码是在客户端还是服务端乱的啊?服务端 是在写到response缓冲区的时候乱码的
      response缓冲区本身有内置的编码格式:iso-8859-1
      要想使服务端写入中文 客户端正常显示中文
      1. 设置response的编码格式utf-8
        1. res.setCharacterEncoding("UTF-8");
      2. 设置指导浏览器解码的方式
        方式一:
        1. writer.write(" <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">");
        方式二:
        1. res.setContentType("text/html; charset=UTF-8");
        方式三:
        1. response.setHeader("content-type", "text/html;charset=UTF-8");
        注意:下面2种方式是经常使用的方式,会覆盖方式一的设置,也会覆盖对response编码格式的设置。
    5. getOutputStream() 文件下载
      1. 什么时候需要文件下载?浏览器不识别的文件需要下载
      2. 什么文件需要编写文件下载的代码?浏览器识别的需要编写文件下载的代码
        注意:如果文件需要客户端进行下载 需要两个头:
        Content-Disposition:告知浏览器文件以附件形式打开
        Content-Type:告知浏览器文件的MIME类型

        实现代码:
        html页面:
        1. <a href="/Demo6/servlet3?filename=1.bmp">图片资源</a>
        Servlet后台:
        1. //获取请求中的filename参数
        2. String filename=request.getParameter("filename");
        3. //设置告诉浏览器是下载文件的参数
        4. response.setHeader("Content-Disposition", "attachment;filename="+filename);
        5. //设置下载文件的扩展名
        6. response.setContentType(this.getServletContext().getMimeType(filename));
        7. //获取对应下载文件的路径
        8. String path=this.getServletContext().getRealPath("/resouce/1.bmp");
        9. //设置读取流读取文件
        10. BufferedInputStream bufs=new BufferedInputStream(new FileInputStream(path));
        11. //获取response的输出流
        12. ServletOutputStream out = response.getOutputStream();
        13. //一般读取写出流程
        14. byte []b=new byte[1024];
        15. int len=-1;
        16. while((len=bufs.read(b))!=-1)
        17. {
        18. out.write(b, 0, len);
        19. }
        20. //关闭流资源,也可以不写。tomcat服务器会自动关流
        21. bufs.close();
        22. out.close();
    6. 验证码
      html页面:
      1. <img id="verify" alt="" src="/Demo6/servlet4" onclick="fn()">
      2. <a href="javascript:void(0);" onclick="fn()">看不清 点击刷新</a>
      3. <script type="text/javascript">
      4. function fn()
      5. {//如果每次提交的页面路径都相同者服务默认会任务是相同资源不会从新获取,所以提交的时候带上一个时间来欺骗服务器,达到每次都进行重新获取
      6. document.getElementById("verify").src = "/Demo6/servlet4?timestamp="+ new Date().getTime();
      7. }
      8. </script>
       Serlvet页面:
      1. OutputStream out = response.getOutputStream();
      2. VerifyCodeUtils.finalOutputImage(out);
      工具类中finalOutPutImage方法源码:
      1. public static String finalOutputImage(OutputStream out) throws IOException{
      2. String verifyCode = generateVerifyCode(5).toLowerCase();
      3. int w = 300;
      4. int h = 90;
      5. outputImage(w,h,out,verifyCode);
      6. return verifyCode;
      7. }

    7. response的注意事项
      1.  通过response获得流资源不必手动关闭  tomcat服务器会帮助你关闭
      2.  getWriter()与getOutputStream()方法不能共存






posted @ 2016-01-01 18:59  蓝蝶岳  阅读(2989)  评论(0编辑  收藏  举报