「这是我参与2022首次更文挑战的第16天,活动详情查看:2022首次更文挑战」。
对于Service 的一些用法已经介绍了许多,我们知道,继承Servlet 接口,我们着重需要实现的就是service 方法。在service 方法中有两个参数,一个是ServletRequest
,一个是ServletResponse
。
对于我们日常使用继承的类HttpServlet
,其经常实现的doGet 或者doPost 等方法中,参数一般为:HttpServletRequest
和HttpServletResponse
。本篇文章我们重点介绍Response 相关概念。
Response 介绍
我们首先要有个理念,web 服务器接收到客户端的http 请求,针对这个请求,会分别创建一个代表请求的HttpServletRequest 对象,一个代表响应的HttpServletResponse 对象。
说白了,本质我们就是要去操作这两个对象。但是我们不用去写这个实现类,我们继承这个Servlet 接口就可以了。
我们如果要获取客户端请求过来的参数,找HttpServletRequest。
如果要给客户端响应一些信息,找HttpServletResponse。
Response 分析
我们查看HttpServletResponse 类,可以看到其中的方法,很多都是set、add、send、get 这种方法。
对这些方法进行分类:
- 负责向浏览器发送数据的方法
// 一般写平常的字符流用这个
ServletOutputStream getOutputStream() throws IOException;
// 一般写中文用这个
PrintWriter getWriter() throws IOException;
复制代码
- 负责向浏览器发送响应头的方法
void setCharacterEncoding(String var1);
void setContentLength(int var1);
void setContentType(String var1);
void setBufferSize(int var1);
void setDateHeader(String var1, long var2);
void addDateHeader(String var1, long var2);
void setHeader(String var1, String var2);
void addHeader(String var1, String var2);
void setIntHeader(String var1, int var2);
void addIntHeader(String var1, int var2);
复制代码
- 设置状态码
void setStatus(int var1);
复制代码
- 响应的状态码。对应HTTP 的响应状态码。
常见应用
因为能设置一些响应信息,所以有很多应用场景。
-
向浏览器输出消息
-
下载文件
- 要获取下载文件的路径
- 下载的文件名是啥
- 设置想办法让浏览器能支持下载我们需要的东西
- 获取下载文件的输入流
- 创建缓冲区
- 获取OutputStream 对象
- 将FileOutputStream 流写入到buffer 缓冲区
- 使用OutputStream 将缓冲区中的数据输入到客户端
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1. 要获取下载文件的路径(注意,可以写个绝对路径)
String realPath = this.getServletContext().getRealPath("/1.png");
System.out.println("获取到的要下载的文件的路径:" + realPath);
// 2. 下载的文件名是啥
String fileName = realPath.substring(realPath.lastIndexOf("\")+1);
// 3. 设置想办法让浏览器能支持下载我们需要的东西(要用到Response 行为了)
resp.setHeader("Content-Disopsition", "attachment;filename=" + fileName);
// 4. 获取下载文件的输入流
FileInputStream in = new FileInputStream(realPath);
// 5. 创建缓冲区
int len = 0;
byte[] buffer = new byte[1024];
// 6. 获取OutputStream 对象
ServletOutputStream outputStream = resp.getOutputStream();
// 7. 将FileOutputStream 流写入到buffer 缓冲区,使用OutputStream 将缓冲区中的数据输入到客户端
while ((len = in.read(buffer))>0) {
outputStream.write(buffer, 0, len);
}
in.close();
outputStream.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
复制代码