初识Servlet(五)🚙

219 阅读4分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第26天,点击查看活动详情

写在前面👀

今天主要讲讲Response响应字符数据响应字节数据的方法。

一、HttpServletResponse

1️⃣什么是HttpServletResponse?

在 Servlet API 中,定义了一个 HttpServletResponse 接口,它继承自 ServletResponse 接口。HttpServletResponse的实现类ResponseFacade对象专门用于封装 HTTP 响应消息,简称 response 对象

2️⃣HttpServletResponse继承体系

我们都知道,HttpServletResponse是一个接口,而接口是不能直接创建对象的,所以tomcat就定义了一个HttpServletResponse接口的实现类——ResponseFacade,而这个类的对象也是由tomcat创建的。

3️⃣验证猜想

  • 我在初识Servlet(三)🚕这篇文章验证过request对象的类型是RequestFacade,其实response对象的类型也就是ResponseFacade,在这就不过多赘述了。

二、 Response设置响应数据

HTTP响应数据总共分为三部分内容,分别是响应行响应头响应体

1️⃣获取响应行数据

响应行包含三块内容,分别是请求方式状态码状态码描述

  • 响应行示例👇

image-20220428225122130

a.接口方法
  • 响应行中需要返回的主要是状态码,HttpServletResponse 接口定义了发送状态码的方法,如下表
返回值类型方法描述
voidsetStatus(int sc)发送 HTTP 响应消息的状态码,并生成响应状态行。
voidsendError(int sc)发送表示错误信息的状态码。

2️⃣获取响应头数据

服务器返回响应数据时,需要通过响应头向浏览器传递一些附加信息,例如输出内容的字符编码方式、服务器种类等等。

  • 响应头的数据,是键值对的形式,例如下图👇

image-20220428230412894

a.接口方法
  • HttpServletResponse 接口中定义了一系列设置 HTTP 响应头字段的方法,如下表
返回值类型方法描述
voidaddHeader(String name,String/int value)增加响应头字段,,参数 name 指定响应头字段的名称,参数 value 指定响应头字段的值。
voidsetHeader (String name,String/int value)设置响应头字段,参数 name 指定响应头字段的名称,参数 value 指定响应头字段的值。
voidsetContentType(String type)用于设置 Servlet 输出内容的 MIME 类型(如text/html)以及编码格式(如utf-8)。
voidsetCharacterEncoding(String charset)用于设置输出内容使用的字符编码。

3️⃣ 获取响应体数据

对于响应体,是通过字符输出流字节输出流的方式往浏览器传递数据

a.接口方法
  • 在发送响应消息体时,HttpServletResponce接口定义了两个与输出流相关的方法,如下表
返回值类型方法描述
PrintWritergetWriter()获取字符输出流对象。
ServletOutputStreamgetOutputStream()获取字节输出流对象。

三、Response响应字符数据

1️⃣步骤

  1. 通过Response对象获取字符输出流
PrintWriter writer = response.getWriter();
  1. 通过字符输出流写入响应体数据
 writer.write("响应体数据");
  • 注意:一次请求响应结束后,response对象就会被销毁掉,所以不需要手动关闭流

2️⃣代码示例

向浏览器输出 你好,世界!

  1. 创建一个HttpServlet的子类:ResponseDemo2,Servlet映射路径:/resp2
/**
 * Response响应字符数据
 */
@WebServlet("/resp2")
public class ResponseDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1.设置响应的数据格式及数据的编码
        response.setContentType("text/html;charset=utf-8");
        // 2.获取字符输出流
        PrintWriter writer = response.getWriter();
        // 3.写入响应体数据
        writer.write("<h1>你好,世界!</h1>");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}
  1. 启动tomcat服务器

  2. 在浏览器地址栏输入,敲回车

localhost:8080/tomcat/resp2

3️⃣演示结果

四、Response响应字节数据

1️⃣步骤

  1. 通过Response对象获取字节输出流
ServletOutputStream outputStream = response.getOutputStream();
  1. 通过字节输出流写入响应体数据
outputStream.write(字节数据);
  • 注意:一次请求响应结束后,response对象就会被销毁掉,所以不需要手动关闭流

2️⃣代码示例

向浏览器返回一张本地的图片

  1. 创建一个HttpServlet的子类:ResponseDemo3,Servlet映射路径:/resp3
/**
 * 响应字节数据
 */
@WebServlet("/resp3")
public class ResponseDemo3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 1.读取本地图片
        FileInputStream picture = new FileInputStream("E:\\壁纸\\1132526.jpg");
        // 2.获取response字节输出流
        ServletOutputStream outputStream = response.getOutputStream();
        // 3.完成流的拷贝
        byte[] buff = new byte[1024];
        int len = 0;
        while ((len = picture.read(buff)) != -1) {
            outputStream.write(buff, 0, len);
        }
        picture.close();
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}
  1. 启动tomcat服务器

  2. 在浏览器地址栏输入,敲回车

localhost:8080/tomcat/resp3

3️⃣演示结果

写在后面🍻

感谢观看啦✨
有什么不足,欢迎指出哦💖
掘金的运营同学审核辛苦了💗