博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Response的使用入门
阅读量:5797 次
发布时间:2019-06-18

本文共 4210 字,大约阅读时间需要 14 分钟。

一、Servlet访问过程
  1. response:是Servlet里一块区域,可以通过人为修改之后由tomcatMS引擎重新写入Http
  2. request :经过tomcatMS引擎封装的http请求体信息
名词说明:    
 
  1. service(ServletRequest,ServletReponse)
    由来:在Servlet接口中的方法,目的是接收传递response和request 的参数
    3266646680.bmp 
  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()方法不能共存

转载于:https://www.cnblogs.com/didixyy/p/bf6ae0d788f569251d8db3b3b7b964aa.html

你可能感兴趣的文章
【SSH网上商城项目实战21】从Demo中看易宝支付的流程
查看>>
史上最简单的SpringCloud教程 | 第八篇: 消息总线(Spring Cloud Bus)
查看>>
ACM编程题
查看>>
20145237 《信息安全系统设计基础》第1周学习总结
查看>>
说说我为什么开始在园子写日记。
查看>>
uoj#344. 【清华集训2017】我的生命已如风中残烛(计算几何)
查看>>
Windows 7 下如何配置PHP网站运行环境
查看>>
转字节流
查看>>
Java中Dao模式中Dao的数据库操作(BaseDao的写法)
查看>>
(转)让科学和理性回到计算机科学
查看>>
ASP.NET MVC 5 生命周期
查看>>
Centos下安装memcached以及php-memcached扩展
查看>>
>函数的方法call、apply、bind
查看>>
URAL 1427 SMS
查看>>
用python编写简易登录接口
查看>>
HTTP中Get与Post、ViewState 原理
查看>>
克隆对象和自动加载类
查看>>
WPF标准控件模板查看程序(文件里面)
查看>>
python在windows下安装paramiko模块和安装pycrypto模块(3步搞定)(转)
查看>>
黑马程序员_面向对象(基础)
查看>>