Java Web Response

Response 对象的作用是存储发送给客户端的响应消息。

一、Response 是什么?

1. 工作流程

Java Servlet - 工作流程

2. Response 对象

当客户端向服务器端发送请求时,服务器为本次请求创建 Response 对象,并传递给 Servlet。

需要将响应信息存储至 Response 对象之中,并发送给客户端。

二、常用方法

1. 设置响应行

方法 说明
setStatus(int num) 设置响应状态码

2. 设置响应头

方法 说明
setHeader(String name, String value) 设置响应头

3. 设置响应体

(1) 设置步骤

  • 获取输出流
    • 字符流
    • 字节流
  • 使用输出流,将数据输出到客户端浏览器

(2) 编码方式

方法 1:

  • 设置流的默认编码

    1
    response.setCharacterEncoding("编码方式")
  • 通知浏览器使用何种编码方式

    1
    response.setHeader("content-type", "text/html;charset=编码方式")

方法 2:

使用 response 对象的 setContentType() 方法设置。

1
response.setContentType("text/html;charset=编码方式")

三、重定向

Java 请求转发与重定向

四、示例 - 文件下载

1. 目录结构

2. index.html

1
2
3
4
5
6
7
8
9
10
11
12
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>123</h1>
<a href="/img/2021072901.png">点击查看</a>
<a href="/downloadServlet?filename=2021072901.png">点击下载</a>
</body>
</html>

3. DownloadServlet

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
@WebServlet("/downloadServlet")
public class DownloadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("Hello");
// 获取请求参数,即文件名称
String filename = request.getParameter("filename");
// 获取ServletContext
ServletContext servletContext = this.getServletContext();
// 获取文件的真实路径
// 需要注意的是:文件在服务器中的路径为 "/img/文件名"
String realPath = servletContext.getRealPath("/img/" + filename);
// 设置 response 的响应头
String mimeType = servletContext.getMimeType(filename);
response.setHeader("content-type", mimeType);
response.setHeader("content-disposition", "attachment;filename=" + filename);
// 新建字节输入流
FileInputStream fileInputStream = new FileInputStream(realPath);
// 将数据写入到输出流中
ServletOutputStream servletOutputStream = response.getOutputStream();
byte[] bytes = new byte[1024 * 8];
int len = 0;
while ((len = fileInputStream.read(bytes)) != -1) {
servletOutputStream.write(bytes, 0, len);
}
fileInputStream.close();
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}

4. 中文文件问题

当下载文件的文件名为中文时,文件名将无法正常显示,解决方法如下:

  • 获取客户端使用的浏览器信息
  • 根据浏览器信息,将 filename 编码后再写入响应头中

参考