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()是申明一个新的字符串
上一篇:SSM整合中易出现的问题(xml文件无法自动加载,跨域,lib目录,乱码等)


下一篇:HttpServletResponse(set方法)