zoukankan      html  css  js  c++  java
  • response和ServletContext和乱码问题

    服务器端以/开始就代表当前项目名
    客户端必须以 /项目名/资源 才能定位到资源

    软件与软件之间,以字符为标准传递,传递字节,接收端自己按原来的编码集编码之后再按照自己的编码集解码编码(如果没有对应字符,将会丢失数据)
    软件与文件或者浏览器之间,以字节为标准传递,传递字节,接收端直接将字节按照自己的编码集进行编码(不会丢失数据)
    数据丢失发生在解码的时候

    servlet一定要初始化之后才能对里面的对象赋值,否则对象为null
      加载----初始化----执行----消亡
    如何实现数据共享
      方案1(了解):静态变量(耗费内存,特别是服务器端)
      方案2(ServletContext):
        A、服务器为我们提供了一个内置的 ServletContext 对象
          this.getServletContext();
        B、这个对象可以实现不同Servlet 之间的数据共享
        C、设置数据的API: setAttribute("键","值");
          获取数据的API: getAttribute("键");
          删除数据的API:removeAttribute("键");
          such as:浏览量统计(每一个客服端请求时的servlet得到的都是用的同一个ServletContext)

    response
      作用:服务器通过这个对象向浏览器发送数据
      servlet向tomcat传递消息:
        response.setCharacterEncoding("UTF-8"); //告诉Tomcat用UTF-8进行编码

      response设置响应行:
        A:设置状态码:(默认是又tomcat管理)
          setStatus(int i); //响应行出现的状态码
          setError(int i,String s); //响应行出现的错误提示的状态码,后面是错误提示的信息

        response设置响应头:
          A:设置的响应头最好是HTTP协议规定的,不然没有具体用处
          B:setHeader("键","值")
            多次设置,键重复时,会覆盖
          C:addHeader("键","值")
            多次设置,追加
            such as: 键:refresh
                  值:秒数;url=路径 ---- 以项目名开始(值中出现多个属性时用分号)
                  键:content-type //简化版:response.setContentType("text/html;charset=utf-8");
                  值:text/html;charset=utf-8

        response 设置响应体
          getWriter() ---- 获取字符流
          getOutputStream() ---- 获取字节流
            注意:
              1、二者不能同时开启
              2、流可以不关,因为是 Tomcat 管理的(自己创建的流需要关闭)

    文件的下载操作:
      提交到服务器的时候:在url后面直接用get方式的形式跟上要下载的文件名
      <a href="/day3504/DownLoad?name=hello.txt">hello.txt</a>
      在Servlet中解析请求行:
        String fileName = request.getParameter("name");
        byte[] buffer = fileName.getBytes("ISO-8859-1");
        fileName = new String(buffer,"UTF-8");
        System.out.println(fileName);
      设置响应头,文件的类型
        response.setHeader("Content-Type", this.getServletContext().getMimeType("/" + fileName));
      设置响应头,告诉浏览器使用正确的打开方式,不要直接显示,而是执行下载操作
        response.setHeader("Content-Disposition", "attachment; filename =" + fileName);
    向浏览器传送文件名时的编码乱码问题:(文件名需要单独编码解码)
      eclipse:GBK
      Tomcat:unicode
      浏览器:GBK
        eclipse和tomcat之间,以字符为标准
        Tomcat与浏览器之间,以字节为标准
          1:byte[] buffer = fileName.getBytes("GBK");
            String newName = new String(buffer,"ISO-8859-1");
            response.setHeader("Content-Disposition", "attachment; filename =" + newName);
          2:调用DownLoadUtils
            String agent = request.getHeader("user-agent");
            String downName = DownLoadUtils.getName(agent, fileName);
            response.setHeader("Content-Disposition", "attachment; filename =" + downName);

    项目中的文件读写操作:
      获取读取当前文件的流:(获取到相对路径中文件的读取流)
        InputStream in = this.getServletContext().getResourceAsStream("/" + fileName);("/"定位到当前webapps目录)
      获取字节输出流
        ServletOutputStream out = response.getOutputStream();
      读的同时写
        byte[] buffer2 = new byte[1024];
        int length;
        while((length = in.read(buffer2)) != -1){
          out.write(buffer2, 0, length);
        }
        in.close();
      读取绝对路径中的文件
        String s = this.getServletContext().getRealPath("文件"); //得到的是Tomcat服务器下的文件路径,而不是eclipse下的文件路径
        FileInputStream in = new FileInputStream("s");

    获取文件读取流时的三种方法:
      1:获取绝对路径的文件读取流
        FileInputStream in = new FileInputStream("绝对路径");
      2:获取WebContent中文件的读取流
        InputStream in = this.getServletContext().getResourceAsStream("webContent下的绝对路径")
      3:获取src目录下的文件读取流(常用于读取配置文件)
        类名.class.getClassLoader().getResourceAsStream("src目录下的文件名");

    验证码中点击一次验证码更换一次图片:(原理,点击一次图片由servlet重新动态发送一次图片)
    图片是通过服务器穿过来的
      <script type="text/javascript">
        $(function(){
          $("#show").click(function(){
            $(this).prop("src","/day3505/Code?test=" + new Date()); //new Date():让每一次访问时提交的数据变化,不读取本地缓存
          });
        });
      </script>

  • 相关阅读:
    [国家集训队]拉拉队排练 Manancher_前缀和_快速幂
    高手过愚人节 Manancher模板题_双倍经验
    [模板]manacher算法
    [POI2011]MET-Meteors 整体二分_树状数组_卡常
    [国家集训队]矩阵乘法 整体二分
    三维偏序(陌上花开) CDQ分治
    博客园美化之旅第一天(CSS图层关系,背景相关设置,字体相关设置)
    力扣题目解答自我总结(反转类题目)
    python插件,pycharm基本用法,markdown文本编写,jupyter notebook的基本操作汇总
    关于小程序websocket全套解决方案,Nginx代理wss
  • 原文地址:https://www.cnblogs.com/chonglchong/p/6847643.html
Copyright © 2011-2022 走看看