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

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

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>

response和ServletContext和乱码问题的更多相关文章

  1. Response ServletContext 中文乱码 Request 编码 请求行 共享数据 转发重定向

    Day35  Response 1.1.1 ServletContext概念 u 项目的管理者(上下文对象),服务器启动时,会为每一个项目创建一个对应的ServletContext对象. 1.1.2  ...

  2. Response与ServletContext对象

    HTTP协议: 请求消息:客户端发送给服务器端的数据 数据格式: 请求行: 格式: 请求方式 请求url 请求协议/版本 请求头:告诉服务器,当前访问的浏览器自身的一些信息 格式: 请求头名称: 请求 ...

  3. PrintWriter out = response.getWriter() 输出中文乱码问题

    HttpServletResponse response = ServletActionContext.getResponse();        response.setCharacterEncod ...

  4. response.getWriter().write()产生乱码

    Struts1中通过action, return到页面的时候,如果代码中使用到response.getWriter().write(),那么有可能jsp页面中汉字会变成乱码.百度上有人说改为respo ...

  5. 解决response.setHeader("Content-disposition" 中文乱码问题

    Content-Disposition中文乱码 Response.setHeader(”Content-Disposition”, “attachment; filename=” + fileName ...

  6. Response attachment filename 中文乱码

    Response.setHeader("Content-Disposition", "attachment; filename=" + fileName+&qu ...

  7. response.getWriter().write("中文");乱码问题

    起初遇到这个问题,网上几乎所有的建议都是: response.setHeader("Content-type", "text/html;charset=UTF-8&quo ...

  8. 关于使用response.addHeader下载中文名乱码问题

    介绍下我项目中遇到的问题:在数据库导出Excel文件的过程中,导出文件中文名始终异常,最终结果发现需要在response.addHeader 中的 filename = "xxxx" ...

  9. 解决response在controller返回乱码的解决方式

    乱码的代码 @RequestMapping(value = "/readbook", method = RequestMethod.GET) 加入 produces = " ...

随机推荐

  1. ADO方式,VC调用Execute执行INSERT INTO插入变量SQL语句的写法

    ADO方式,VC调用Execute执行INSERT INTO插入变量SQL语句的写法 有些情况下,SQL SERVER 2008r2中需要保存float,int类型的数据,当C 中的变量为double ...

  2. Cocos2d-x之项目结构分析

    |   版权声明:本文为博主原创文章,未经博主允许不得转载. 1.下面是我们创建cocos2d的工程MyGame01里的文件资源 2. 在下面:文件解决方案下面有6个项目,我们的启动优先项为MyGam ...

  3. vue组件级路由钩子函数(beforeRouteEnter/beforeRouteUpdate/beforeRouteLeave)

    1.vue组件级路由钩子函数(beforeRouteEnter/beforeRouteUpdate/beforeRouteLeave):http://www.menvscode.com/detail/ ...

  4. 数据持久化之嵌入式数据库 SQLite(三)

    阿里P7Android高级架构进阶视频免费学习请点击:https://space.bilibili.com/474380680 SQLite 是 D. Richard Hipp 用 C 语言编写的开源 ...

  5. redis的快速机制与数据类型

    想一下 redis 的高并发和快速 单线程模型 - 避免了不必要的上下文切换和竞争条件(锁) Redis客户端对服务端的每次调用都经历了发送命令,执行命令,返回结果三个过程.其中执行命令阶段,由于Re ...

  6. 28-python基础-python3-列表多重赋值

    1-列表多重赋值常规方法 >>> cat = ['fat', 'black', 'loud'] >>> size = cat[0] >>> col ...

  7. python之将Unicode文本标准化

    在需要比较字符串的程序中使用字符的多种表示会产生问题. 为了修正这个问题,你可以使用unicodedata模块先将文本标准化: s1 = 'Spicy Jalape\u00f1o' s2 = 'Spi ...

  8. Hooks初探

    一.创建自己的HOOkS,并进行封装 二.创建自己的HOOkS,并进行封装

  9. NOPI Excel 数据导入到数据库

    /// <summary> /// 上传excel文件 并将文件数据导入到数据库 /// </summary> /// <param name="file&qu ...

  10. cmd登录mysql、查所有的库、查所有的表、查表下的所有字段

    一.设置好mysql的环境变量,cmd之后输入mysql -u root  -p 输入password进入mysql 二.展示所有的库名show  batabases: 三.选择一个库名use dem ...