一起养成写作习惯!这是我参与「掘金日新计划 · 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️⃣获取响应行数据
响应行包含三块内容,分别是
请求方式、状态码、状态码描述
- 响应行示例👇
a.接口方法
- 响应行中需要返回的主要是状态码,HttpServletResponse 接口定义了发送状态码的方法,如下表
| 返回值类型 | 方法 | 描述 |
|---|---|---|
| void | setStatus(int sc) | 发送 HTTP 响应消息的状态码,并生成响应状态行。 |
| void | sendError(int sc) | 发送表示错误信息的状态码。 |
2️⃣获取响应头数据
服务器返回响应数据时,需要通过响应头向浏览器传递一些附加信息,例如输出内容的字符编码方式、服务器种类等等。
- 响应头的数据,是
键值对的形式,例如下图👇
a.接口方法
- HttpServletResponse 接口中定义了一系列设置 HTTP 响应头字段的方法,如下表
| 返回值类型 | 方法 | 描述 |
|---|---|---|
| void | addHeader(String name,String/int value) | 增加响应头字段,,参数 name 指定响应头字段的名称,参数 value 指定响应头字段的值。 |
| void | setHeader (String name,String/int value) | 设置响应头字段,参数 name 指定响应头字段的名称,参数 value 指定响应头字段的值。 |
| void | setContentType(String type) | 用于设置 Servlet 输出内容的 MIME 类型(如text/html)以及编码格式(如utf-8)。 |
| void | setCharacterEncoding(String charset) | 用于设置输出内容使用的字符编码。 |
3️⃣ 获取响应体数据
对于响应体,是通过字符输出流或字节输出流的方式往浏览器传递数据
a.接口方法
- 在发送响应消息体时,HttpServletResponce接口定义了两个与输出流相关的方法,如下表
| 返回值类型 | 方法 | 描述 |
|---|---|---|
| PrintWriter | getWriter() | 获取字符输出流对象。 |
| ServletOutputStream | getOutputStream() | 获取字节输出流对象。 |
三、Response响应字符数据
1️⃣步骤
- 通过Response对象获取字符输出流
PrintWriter writer = response.getWriter();
- 通过字符输出流
写入响应体数据
writer.write("响应体数据");
- 注意:一次请求响应结束后,response对象就会被销毁掉,所以不需要手动关闭流
2️⃣代码示例
向浏览器输出
你好,世界!
- 创建一个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);
}
}
-
启动tomcat服务器
-
在浏览器地址栏输入,敲回车
localhost:8080/tomcat/resp2
3️⃣演示结果
四、Response响应字节数据
1️⃣步骤
- 通过Response对象获取字节输出流
ServletOutputStream outputStream = response.getOutputStream();
- 通过字节输出流写入
响应体数据
outputStream.write(字节数据);
- 注意:一次请求响应结束后,response对象就会被销毁掉,所以不需要手动关闭流
2️⃣代码示例
向浏览器返回一张本地的图片
- 创建一个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);
}
}
-
启动tomcat服务器
-
在浏览器地址栏输入,敲回车
localhost:8080/tomcat/resp3
3️⃣演示结果
写在后面🍻
感谢观看啦✨
有什么不足,欢迎指出哦💖
掘金的运营同学审核辛苦了💗