Servlet 中Response 的使用(一)

「这是我参与2022首次更文挑战的第16天,活动详情查看:2022首次更文挑战」。

对于Service 的一些用法已经介绍了许多,我们知道,继承Servlet 接口,我们着重需要实现的就是service 方法。在service 方法中有两个参数,一个是ServletRequest,一个是ServletResponse

对于我们日常使用继承的类HttpServlet,其经常实现的doGet 或者doPost 等方法中,参数一般为:HttpServletRequestHttpServletResponse。本篇文章我们重点介绍Response 相关概念。

Response 介绍

我们首先要有个理念,web 服务器接收到客户端的http 请求,针对这个请求,会分别创建一个代表请求的HttpServletRequest 对象,一个代表响应的HttpServletResponse 对象。

说白了,本质我们就是要去操作这两个对象。但是我们不用去写这个实现类,我们继承这个Servlet 接口就可以了。

我们如果要获取客户端请求过来的参数,找HttpServletRequest。

如果要给客户端响应一些信息,找HttpServletResponse。

Response 分析

我们查看HttpServletResponse 类,可以看到其中的方法,很多都是set、add、send、get 这种方法。

对这些方法进行分类:

  1. 负责向浏览器发送数据的方法
// 一般写平常的字符流用这个
ServletOutputStream getOutputStream() throws IOException;
// 一般写中文用这个
PrintWriter getWriter() throws IOException;
复制代码
  1. 负责向浏览器发送响应头的方法
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);
复制代码
  1. 设置状态码
void setStatus(int var1);
复制代码
  1. 响应的状态码。对应HTTP 的响应状态码。

常见应用

因为能设置一些响应信息,所以有很多应用场景。

  1. 向浏览器输出消息

  2. 下载文件

    1. 要获取下载文件的路径
    2. 下载的文件名是啥
    3. 设置想办法让浏览器能支持下载我们需要的东西
    4. 获取下载文件的输入流
    5. 创建缓冲区
    6. 获取OutputStream 对象
    7. 将FileOutputStream 流写入到buffer 缓冲区
    8. 使用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);
    }
}
复制代码

Guess you like

Origin juejin.im/post/7062717585116102669