三、Response、ServletContext

三、Response、ServletContext

1、Response对象的功能
  • 设置响应消息

    1. 设置响应行 HTTP/1.1 200 ok

      设置状态码 : setStatus(int sc)

    2. 设置响应头:setHeader(String name,String value)

    3. 设置响应体:

      1. 获取输出流:
        • 字符输出流:PrinterWriter getWriter()
        • 字节输出流:ServletOutputStream getOutputStream()
      2. 使用输出流将数据输出到客户端浏览器
2、重定向
  1. 重定向功能是根据设置状态码和设置响应头组合完成

  2. 重定向和请求转发一样都是资源跳转的一种方式

  3. 重定向的特点:

    1. 浏览器地址栏发生改变
    2. 重定向可以访问其他站点的资源,不局限服务器内部资源
    3. 重定向是两次请求
  4. 步骤:

    1. 通过response对象设置相应状态码 setStatus(302)

    2. 再通过response对象设置响应头指明要重定向的地址 setHeader(“location”,String path)

              //方式一:使用两个方法
              //1.设置相应状态码为302
              resp.setStatus(302);
              //2.设置响应头location的值为要跳转的资源目录
              resp.setHeader("location","/web/responseRedirect");
      
    3. 使用sendRedirect(String path)方法对上述代码进行简化

              //方式二:使用 sendRedirect(String path) 该方法内部实现依然是方式一
              resp.sendRedirect("/web/responseRedirect");
              //对方式二的改进
              //上述两种方式都将要跳转的虚拟目录(/web)写死了,不便于后期的维护,我们可以动态获取
              String path = req.getContextPath();
              resp.sendRedirect(path + "/responseRedirect");
      
3、设置相应体数据
  1. 输出字符数据到浏览器 PrintWriter getWriter() :获取字符输出流,只能输出字符数据

        /**
         * 向浏览器输出数据
         */
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("responseInit........");
            //0.在获取输出流之前要设置编码(根据响应头content-type设置)
    //        resp.setHeader("content-type","text/html;charset=UTF-8");
            //简化方式,response提供了简单的方式
            resp.setContentType("text/html;charset=UTF-8");
            //1.获取输出流 getWriter(); 默认获取的输出流编码为iso的
            PrintWriter respWriter = resp.getWriter();
            //2.向页面写出数据 write(String data)
            respWriter.write("你好,response");
        }
    
  2. 输出字节数据到浏览器 ServletOutputStream getOutputStream() : 获取字节输出流

            //1.获取字节输出流 ServletOutputStream getOutputStream()
            ServletOutputStream respOutputStream = resp.getOutputStream();
            //2.向页面返回数据
            respOutputStream.write("你好中国".getBytes());
    
  3. 注意:一个response对象只能获取一种输出流,不能既获取字符输出流,又获取字节输出流

4、ServletContext对象
  1. 概念:代表真个web应用,可以和程序的容器(服务器)通信,(又称Application对象)

  2. 获取:

    1. 通过request对象获取

              //方式一:request.getServletContext();
              ServletContext reqContext = req.getServletContext();
      
    2. 通过HttpServlet对象获取

              //方式二:通过HttpServlet获取 getServletContext();
              ServletContext servletContext = this.getServletContext();
      
  3. ServletContext对象的功能:

    1. 获取MIME类型:

      1. MIME类型:在互联网通信过程中定义的一种文件数据类型

        • 格式: 大类型/小类型 text/html image/jpg
      2. 获取MIME类型:String getMimeType(String fileName)

                String filename = "图片.jpg";
                String type = servletContext.getMimeType(filename);
        
    2. ServletContext域对象:共享数据

      1. void setAttribute(String key,Object value) : 向域中存放数据
      2. Object getAttribute(String key) : 根据key获取域中数据
      3. void removeAttribute(String key) : 根据key删除指定的key-value
      4. ServletContext对象的范围:所有用户所请求的数据
    3. 获取文件的真实(服务器)路径 String getRealPath(String path)

      	//获取resources目录下的资源路径
      	String resPath = servletContext.getRealPath("res.txt");
      	System.out.println(resPath);
      	//获取WEB-INF下的资源路径
      	String webPath = servletContext.getRealPath("/WEB-INF/webInf.txt");
      	System.out.println(webPath);
      
5、文件下载
  1. 超链接指向的资源如果能够被浏览器解析,则在浏览器中展示,如果不能解析,则弹出下载提示框

  2. 要求:无论是哪种资源,都必须弹出现在提示框

  3. 示例:

        <a href="/web/img/Servlet.png">该图片能够被浏览器解析,直接在页面上展示</a>
        <hr>
        <a href="/web/download?filename=Servlet.png">弹出下载提示框的图片</a>
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //1.获取文件名称
            String filename = req.getParameter("filename");
            System.out.println(filename);
            //2.根据文件名称找到该文件在服务器的真实路径
            ServletContext context = this.getServletContext();
            String realPath = context.getRealPath("/img/" + filename);
            System.out.println(realPath);
            //3.根据获取的真实路径,将资源加载进内存
            FileInputStream inputStream = new FileInputStream(realPath);
            BufferedInputStream bis = new BufferedInputStream(inputStream);
            //4.获取response字节输出流,将内存中的文件通过response的输出流输出到页面上
            //设置response的响应头 content-type 和 content-disposition
            //获取filename的MIME类型
            String mimeType = context.getMimeType(filename);
            resp.setHeader("content-type",mimeType);
            //设置相应头的打开方式
            resp.setHeader("content-disposition","attachment;filename=" + filename);
            ServletOutputStream ros = resp.getOutputStream();
            byte[] buff = new byte[1024];
            int len;
            while ((len = bis.read(buff)) != -1){
                ros.write(buff,0,len);
            }
            bis.close();
        }
    
  4. 中文文件名乱码问题:

    1. 每个浏览器的设置文件名时都不一样,我们要根据浏览器,设置不同文件名编码,所以我们要使用到user-agent这个请求头

              //解决中文文件名问题
              //1.获取user-agent请求头
              String agent = request.getHeader("user-agent");
              //2.使用工具类方法编码文件名即可
              filename = DownLoadUtils.getFileName(agent, filename);
      
    2. util工具类示例:

      public class DownLoadUtils {
          public static String getFileName(String agent, String filename) throws UnsupportedEncodingException {
              if (agent.contains("MSIE")) {
                  // IE浏览器
                  filename = URLEncoder.encode(filename, "utf-8");
                  filename = filename.replace("+", " ");
              } else if (agent.contains("Firefox")) {
                  // 火狐浏览器
                  BASE64Encoder base64Encoder = new BASE64Encoder();
                  filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
              } else {
                  // 其它浏览器
                  filename = URLEncoder.encode(filename, "utf-8");
              }
              return filename;
          }
      }
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值