HttpServletRespnse 对象 相关基本应用

HttpServletRespnse 对象相关基本应用

向浏览器输出数据

getOutputStream()

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      resp.setHeader("Content-Type","text/html;charset=UTF-8");
      resp.getOutputStream().write("你好,aaaa".getBytes("UTF-8"));
    }

或者

getWriter()

        //设置消息头,设置编码,自动刷新时间
        resp.setHeader("Refresh","5");
        resp.setHeader("Content-Type","text/html;charset=UTF-8");
        //显示时间
        resp.getWriter().write("实时时间是"+System.currentTimeMillis());
        /*登录后3秒跳转可用此方法实现*/

注意事项

  1. getWriter()和getOutputStream()两个⽅法不能同时调⽤。如果同时调⽤就会出现异常。
  2. Servlet程序向ServletOutputStream或PrintWriter对象中写⼊的数据将被Servlet引擎从response⾥⾯获取,Servlet引擎将这些数据当作响应消息的正⽂,然后再与响应状态⾏和各响应头组合后输出到客户端。
  3. Servlet的serice()⽅法结束后【也就是doPost()或者doGet()结束后】,Servlet引擎将检查getWriter或getOutputStream⽅法返回的输出流对象是否已经调⽤过close⽅法,如果没有,Servlet引擎将调⽤close⽅法关闭该输出流对象。

实现文件下载

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws  IOException {
        //获取资源路径
        String realPath = this.getServletContext().getRealPath("/download/二维码.jpg");
        //读取资源
        FileInputStream fileInputStream = new FileInputStream(realPath);
        //获取文件名
        String filename = realPath.substring(realPath.lastIndexOf("\\") + 1);

        //设置消息头,告知浏览器,需要下载该文件
        resp.setHeader("Content-Disposition","attachment;filename="
                        +URLEncoder.encode(filename,"UTF-8")   //设置编码,解决乱码问题
                        );

//        将读取到的内容返回给浏览器
        //按字节读取文件,输出流按字节输出文件
        ServletOutputStream outputStream = resp.getOutputStream();

        byte[] bytes =new byte[fileInputStream.available()];  //获取文件字节大小并设置
        int len = 0;
        while(  ( len = fileInputStream.read(bytes)) > 0){
            outputStream.write(bytes , 0 , len);
        }
        //关闭流
        outputStream.close();
        fileInputStream.close();
    }

注意事项:

  1. windows系统获取文件的路径分隔符为 “ \\” 。

  2. 中文文件名需要加上设置编码,否则会出想下载到的文件名乱码。

  3. 注意最后要关闭流。

  4. 获取文件大小(字节)通过 FileInputStream 的 available() 方法获得。

    以下是通过Debug 下验证获取的文件大小与文件本身大小是否一致。

HttpServletRespnse 对象 相关基本应用_第1张图片

image-20200901161610482

设置缓存

 //首先要明确哪些页面需要缓存。
    //还是通过设置消息头,设置缓存。
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置不缓存
        /*resp.setHeader("Cache-Control","no-cache");
        resp.setHeader("Pragma", "no-cache");
        resp.setDateHeader("Expires",-1);*/
        //设置缓存,缓存一分钟
        resp.setDateHeader("Expires",System.currentTimeMillis() + 1000 * 60);
        resp.setHeader("Cache-Control","max-age");
        //输出增加时间便于观察
        /*配置消息头和消息编码,即可解决浏览器端乱码*/
        resp.setHeader("Content-Type","text/html;charset=UTF-8");
        resp.getWriter().print("你好,aaaaa");
    }

通过调试模式可以查看到缓存的期限。

HttpServletRespnse 对象 相关基本应用_第2张图片

实现数据压缩

 @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //压缩数据
        String ss = "fsdfhsdfhuisdhfusdhfuids" +
                "fsdfdsfsdfsdfdsfdafdsfhsdjfhsdjkfhkjds" +
                "fdsfjdslkfjsldkfjsdlkfjsdkfsdjkff" +
                "fsjdfjdsklfjdsklfjkldsfjlksdjflksdjflkds" +
                "dsjfklsdjflsdjfkldsfkjsdkfjsldkfjsdlfk" +
                "fdsjlkfjdslkfjsdlkfjlkasjflk";
        //获取GZIP类
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        GZIPOutputStream gzipOutputStream = new GZIPOutputStream(byteArrayOutputStream);
        //输出数据
        gzipOutputStream.write(ss.getBytes());
        //GZIPOutputStream有缓存,关闭流清理缓存
        gzipOutputStream.close();
        //将压缩的数据取出来
        byte[] bytes = byteArrayOutputStream.toByteArray();
      //  resp.getWriter().write(ss+"
"+"
"+"
"); System.out.println("原来的长度: "+ss.getBytes().length); System.out.println("压缩后的长度: "+bytes.length); //设置编码 resp.setHeader("Content-Encoding","gzip"); //把数据写到浏览器,让浏览器获取到压缩的数据 resp.getOutputStream().write(bytes); }

注意: 回到前面提到的 getWriter() 和 getOutputStream() 不能同时使用。

HttpServletRespnse 对象 相关基本应用_第3张图片

生出随机图片

@Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //通过java提供的 BufferedImage 生成一张图片
        BufferedImage image = new BufferedImage(80, 20, BufferedImage.TYPE_INT_RGB);
        //获取这张图片
        Graphics graphics = image.getGraphics();
        //设置图片内容,颜色
        graphics.setColor(Color.white);
        graphics.setFont(new Font(null,Font.BOLD,20));
        //随机数字使用自定义方法
        graphics.drawString(this.getNum(),0,20);
      //  graphics.fillRect(0,0,80,20);   不需要填充
        //告知浏览器,发送的是一张图片
        resp.setHeader("ContentType","jpeg");
        //Java提供图⽚流给我们使⽤,这是⼀个⼯具类发送图片
        ImageIO.write(image,"jpeg",resp.getOutputStream());
    }

    private String getNum() {   //自定义生成随机数字方法
        Random random = new Random();
        int nextInt = random.nextInt(9999999);
        String num = String.valueOf(nextInt);

        StringBuilder stringBuffer =new StringBuilder();
        //不够数字就填充
        for (int i =0 ;7- num.length() > i ;i++){
            stringBuffer.append("0");
        }
        return stringBuffer.append(num).toString();
    }

注意 :是否要使用Graphics . fillRect() 方法填充, 填充是否会覆盖要显示的内容,这需要使用者自己衡量决定使用哪一种。

image-20200901224550868

重定向跳转

@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //重定向
        resp.sendRedirect("/hello.jsp");
    }

HttpServletRespnse 对象 相关基本应用_第4张图片

注意: jsp 页面是否放在正确的路径上。

HttpServletRespnse 对象 相关基本应用_第5张图片

web.xml 配置文件




  Archetype Created Web Application

  
    
    demoServlet
    
    com.ling.demoServlet
  
  
    
    demoHttpServlet
    
    com.ling.demoHttpServlet
  
  
    
    downloadServlet
    
    com.ling.downloadServlet
  
  
    
    dataServlet
    
    com.ling.dataServlet
    

      fileEncoding

      UTF-8

    
  
  
    
    cachedServlet
    
    com.ling.cachedServlet
  
  
    
    graphServlet
    
    com.ling.graphServlet
  

  
    
    graphServlet
    /graphServlet
  
  
    
    demoHttpServlet
    /demoHttpServlet
  
  
    
    demoServlet
    /demoServlet
  
  
    
    downloadServlet
    /downloadServlet
  
  
    
    cachedServlet
    /cachedServlet
  
  
    
    dataServlet
    /dataServlet
  


注意: 需要设置编码时,要明确编码类型。

你可能感兴趣的:(HttpServletRespnse 对象 相关基本应用)