zoukankan      html  css  js  c++  java
  • HttpServletRespnse 对象 相关基本应用

    HttpServletRespnse 对象相关基本应用


    文章中所有源代码都在我的这个GitHub的公开库--->servletStar来一个好吗?秋梨膏!


    向浏览器输出数据

    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 下验证获取的文件大小与文件本身大小是否一致。

    image-20200901161642779

    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");
        }
    

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

    image-20200901161342645

    实现数据压缩

     @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+"</br>"+"</br>"+"</br>");
            System.out.println("原来的长度:    "+ss.getBytes().length);
            System.out.println("压缩后的长度:    "+bytes.length);
            //设置编码
            resp.setHeader("Content-Encoding","gzip");
            //把数据写到浏览器,让浏览器获取到压缩的数据
            resp.getOutputStream().write(bytes);
    
        }
    

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

    image-20200901203711440

    生出随机图片

    @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");
        }
    

    image-20200901224848505

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

    image-20200901224936330

    web.xml 配置文件

    <!DOCTYPE web-app PUBLIC
     "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
     "http://java.sun.com/dtd/web-app_2_3.dtd" >
    
    <web-app>
      <display-name>Archetype Created Web Application</display-name>
    
      <servlet>
        <!--为这个Servlet去一个名字,一般是和类名一致-->
        <servlet-name>demoServlet</servlet-name>
        <!--Servlet的位置,有包名需要加上包名-->
        <servlet-class>com.ling.demoServlet</servlet-class>
      </servlet>
      <servlet>
        <!--为这个Servlet去一个名字,一般是和类名一致-->
        <servlet-name>demoHttpServlet</servlet-name>
        <!--Servlet的位置,有包名需要加上包名-->
        <servlet-class>com.ling.demoHttpServlet</servlet-class>
      </servlet>
      <servlet>
        <!--为这个Servlet去一个名字,一般是和类名一致-->
        <servlet-name>downloadServlet</servlet-name>
        <!--Servlet的位置,有包名需要加上包名-->
        <servlet-class>com.ling.downloadServlet</servlet-class>
      </servlet>
      <servlet>
        <!--为这个Servlet去一个名字,一般是和类名一致-->
        <servlet-name>dataServlet</servlet-name>
        <!--Servlet的位置,有包名需要加上包名-->
        <servlet-class>com.ling.dataServlet</servlet-class>
        <init-param>
    
          <param-name>fileEncoding</param-name>
    
          <param-value>UTF-8</param-value>
    
        </init-param>
      </servlet>
      <servlet>
        <!--为这个Servlet去一个名字,一般是和类名一致-->
        <servlet-name>cachedServlet</servlet-name>
        <!--Servlet的位置,有包名需要加上包名-->
        <servlet-class>com.ling.cachedServlet</servlet-class>
      </servlet>
      <servlet>
        <!--为这个Servlet去一个名字,一般是和类名一致-->
        <servlet-name>graphServlet</servlet-name>
        <!--Servlet的位置,有包名需要加上包名-->
        <servlet-class>com.ling.graphServlet</servlet-class>
      </servlet>
    
      <servlet-mapping>
        <!--配置映射路径-->
        <servlet-name>graphServlet</servlet-name>
        <url-pattern>/graphServlet</url-pattern>
      </servlet-mapping>
      <servlet-mapping>
        <!--配置映射路径-->
        <servlet-name>demoHttpServlet</servlet-name>
        <url-pattern>/demoHttpServlet</url-pattern>
      </servlet-mapping>
      <servlet-mapping>
        <!--配置映射路径-->
        <servlet-name>demoServlet</servlet-name>
        <url-pattern>/demoServlet</url-pattern>
      </servlet-mapping>
      <servlet-mapping>
        <!--配置映射路径-->
        <servlet-name>downloadServlet</servlet-name>
        <url-pattern>/downloadServlet</url-pattern>
      </servlet-mapping>
      <servlet-mapping>
        <!--配置映射路径-->
        <servlet-name>cachedServlet</servlet-name>
        <url-pattern>/cachedServlet</url-pattern>
      </servlet-mapping>
      <servlet-mapping>
        <!--配置映射路径-->
        <servlet-name>dataServlet</servlet-name>
        <url-pattern>/dataServlet</url-pattern>
      </servlet-mapping>
    </web-app>
    
    

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

  • 相关阅读:
    [转]Xcode4.5.1破解iOS免证书开发真机调试与ipa发布
    [转]QT多线程异步调用
    [转]Clone Object as instance in OgreMax
    [转]Texture atlas extension to the RTSS
    [转]QT中线程调用GUI主线程控件的问题
    c语言打印菱形解析
    今天开始第一次win32汇编之旅 先搭建编程环境吧
    MSHFlexGrid控件
    用1602模拟电子钟功能
    Combobox控件使用
  • 原文地址:https://www.cnblogs.com/l1ng14/p/13599325.html
Copyright © 2011-2022 走看看