zoukankan      html  css  js  c++  java
  • HttpServletResponse对象

    HttpServletResponse对象代表服务器的响应,这个对象中封装了响应客户端浏览器的流对象,以及向浏览器响应的响应头、数据、响应状态码等。
    每一个请求的客户端都独立创建请求和响应对象

    设置响应类型

    默认是text/html;若要设置则使用resp.setContext("MIME")进行对应的设置。

    设置响应编码

    为了能够防止响应内容出现错乱和乱码(不同的传输类型,对应不同的编码类型,要基于具体类型进行设置。(二进制文件、影音、图片,响应字节文件,除此其他类型则是字符类型)

    常见字符型响应

    调用resp.setContextType()进行设置

    • 若是文本型,内含html字符串,是默认响应 resp.setContextType(“text/html”)
    • 若响应类型是文本型,纯文本(也就是浏览器不会去解析html内容,进行所有字符的原样输出)使用resp.setContextType(“text/plain”)

    常用字节型响应

    public class RespByteServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            this.doPost(req, resp);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //       读取图片文件
            File file = new File("/Users/pain_/Downloads/IMG_01E5F8C6DA14-1.jpg");
    //       字节流
            FileInputStream fis =new FileInputStream(file);
    //        available():返回与之关联的文件的字节数
            byte[] buf = new byte[fis.available()];
            fis.read(buf);
    
            //设置响应类型(产生响应之前设置)
            resp.setContentType("image/jpeg");
    //        从HttpServletResponse对象中获取字节输出流对象
            OutputStream os = resp.getOutputStream();
    
            os.write(buf);
            os.flush();
            os.close();
        }
    }
    

    设置响应编码

    浏览器和服务器之间的传输是通过字节形式进行传输,当请求到达tomcat之后会进行解析(字节到字符的转换)使用的是iso-8859-1的单字节编码,将字节转换成字符。(若含有中文,这时候请求对象也会进行编码的处理)而要将内容响应给浏览器时(tomcat需要负责字符到字节的转换,若含中文,则会出现乱码,因此我们在响应时进行编码的设置,避免到达浏览器时,浏览器解析出现乱码)

    • 只设置服务端为浏览器响应的编码
      resp.setCharacterEncoding("utf-8");
      -设置服务端和客户端编码(建议使用)
      resp.setContentType("text/plain;charset=utf-8");

    在响应中添加附加信息

    重定向响应

    服务端给客户端响应的一种方式通过resp.sendRedirect(URL 地址)。重定向响应会在响应头重添加location的key,对应的value是给定的URL,客户端收到响应会直接请求URL。通过案例来展示这个方法的使用

    public class RedirectServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            this.doPost(req, resp);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            req.setCharacterEncoding("utf-8");
            //根据key找值
            String search =req.getParameter("search");
            //解决搜索中文乱码,浏览器搜索要显示中文 解决URL乱码问题
            resp.sendRedirect("https://www.baidu.com/s?wd="+ URLEncoder.encode(search,"utf-8"));
        }
    }
    
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
            <form action="redirect" method="post">
               搜索 <input type="text" name="search"/>
                <input type="submit" value="搜索"/>
            </form>
    </body>
    </html>
    

    文件下载

    在实现文件下载时,我们需要修改响应头,添加附加信息
    resp.setHeader("Content-Dispostion","attachment;filename="+文件名")

    • "Content-Dispostion","attachment; 这个附加信息是默认格式表示对下载文件的一个标识,不会在浏览器里显示是直接下载处理。
    • filename=文件名 表示指定下载文件的文件名
      当我们使用中文文件名由于编码不一致会出现中文乱码,因为使用的磁盘读取的文件下载,而系统默认使用的是GBK编码,而响应给客户端浏览器(字节型响应)tomcat不会做响应转换(若含有中文名字,tomcat会转换通过iso-8859-1)因此需要对文件名进行处理,先将文件名在服务端按照系统默认GBK编码进行转换,成纯字节的内容,再按照iso-8859-1 响应给浏览器,浏览器再将字节文件,通过GBK转换
     //对字节按照 charsetName:iso-8859-1 进行解码
    //String(byte bytes[]) 表示按照系统默认编码方式进行
            resp.addHeader("Content-Disposition","attachment;filename="+new String(file.getName().getBytes("gbk"),"iso-8859-1"))
    
    • new String()是申明一个新的字符串
    悲观者正确,乐观者成功
  • 相关阅读:
    Auto X2021 K Increasing Sequence
    拉普拉斯平滑处理 Laplace Smoothing
    博学之
    Python-生成音乐-pyshnth
    Python-Kivy ImportError: DLL load failed: 找不到指定的模块
    Python-Word模板填充-docxtpl
    Python-文字转语音-pyttsx3
    Virtual Box中Ubuntu使用"桥接网卡"不能联网而使用"网络地址转换(NAT)"却可以上网
    STM32的HAL库中的DMA_FLAG_TCIF3_7等几个宏定义的含义
    Linux下编写互相通信的驱动模块并将其加入到内核中
  • 原文地址:https://www.cnblogs.com/freebule/p/13660754.html
Copyright © 2011-2022 走看看