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()是申明一个新的字符串