详解响应消息 response
1.1 简介
1.1.1 概述
Response 对象用于动态响应客户端请示,控制发送给用户的信息,并将动态生成响应。Response 对象在 ASP 中负责将信息传递给用户 Response 对象用于动态响应客户端请求,并将动态生成的响应结果返回到客户端浏览器中,使用 Response 对象可以直接发送信息给浏览器,重定向浏览器到另一个 URL 或设置 cookie 的值等。
1.1.2 流程
Tomcat 服务器会根据请求 URL 中的资源路径,创建对应的 ServletImpl 的对象。然后会创建 Response 对象,将 Response 对象传递给 service 方法,并且调用 service 方法。根据 Request 对象的信息将返回数据封装到 Response 中,将其响应给请求方。
1.2 response 的使用
我们创建 Servlet 通常是继承 HttpServlet,所以我们一般操作 HttpServletResponse,HttpServletResponse 继承了 ServletResponse。
1.2.1 常用方法
☞ ServletResponse
方法 |
描述 |
---|---|
void flushBuffer( ) |
强制将缓冲区中的内容写入客户端 |
String getCharacterEncoding( ) |
获取响应数据字符编码 |
String getContentType( ) |
返回用于此响应中发送的MIME正文的内容类型 |
ServletOutputStream getOutputStream( ) |
获取字节输出流 |
PrintWriter getWriter( ) |
获取字符输出流 |
void setCharacterEncoding(String charset) |
设置响应数据字符编码 |
void setContentType(String type) |
设置响应消息类型 |
☞ HttpServletResponse
方法 |
描述 |
---|---|
void addCookie(Cookie cookie) |
将指定的cookie添加到响应中 |
void addHeader(String name, String value) |
添加响应头 |
String getHeader(String name) |
根据名称获取响应头的值 |
void sendRedirect(String location) |
使用指定的重定向位置URL向客户端发送临时重定向响应并清除缓冲区 |
int getStatus() |
获取此响应的状态码 |
void setStatus(int sc) |
设置此响应的状态码 |
void setHeader(String name, String value) |
设置响应头 |
1.2.2 重定向
重定向(Redirect)就是通过各种方法将各种网络请求重新定个方向转到其它位置,即当一个请求抵达一个 servlet 时,该 servlet 无法处理这个请求,就让请求方去找另外一个 servlet 处理。就好比,老张向老王借 ¥500,老王没有,但是老王告诉老张说:老李有钱,去找他借。然后老张就去找老李借钱了。
☞ 重定向步骤
① 设置状态码为 302 ② 重定向方法
☞ 特点
① 地址栏发生变化 ② 重定向可以访问其他站点(服务器)的资源 ③ 重定向是两次请求。不能使用request对象来共享数据
☞ 示例
// 设置状态码为302
response.setStatus(302);
// 重定向
// ① 设置响应头 location
response.setHeader("location","/Bservlet");
// ② 简单的重定向方法
response.sendRedirect("/Bservlet");
☞ 执行流程
☞ 中文乱码
// 设置字符集
response.setCharacterEncoding("utf-8");
// 设置响应消息类型,主要使用
response.setContentType("text/html;charset=utf-8");
1.2.3 ServletContext
servletContext 接口是 Servlet 中最大的一个接口,呈现了 web 应用的 Servlet 视图。ServletContext 实例是通过 getServletContext( ) 方法获得的,由于 HttpServlet 继承 GenericServlet,GenericServlet 类和 HttpServlet 类同时具有该方法。每个 web 应用都会有一个 ServletContext 对象与之关联,是最大的域对象。
☞ 获取 ServletContext
// 通过 request 对象获取
request.getServletContext();
// 通过 HttpServlet 获取
this.getServletContext();
☞ 常用方法
方法 |
描述 |
---|---|
String getMimeType(String file) |
返回指定文件的 MIME 类型;如果 MIME 类型未知,则返回 null |
String getRealPath(String path) |
获取与给定虚拟路径相对应的真实路径 |
void setAttribute(String name,Object object) |
设置属性 |
Object getAttribute(String name) |
根据名称获取属性值 |
☞ MIME MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。有以下几种常见类型:
MIME |
类型 |
描述 |
---|---|---|
application/msword |
doc dot |
Microsoft Word |
application/vnd.ms-excel |
xls |
Microsoft Excel |
application/vnd.ms-powerpoint |
ppt |
Microsoft Powerpoint |
application/pdf |
Adobe Acrobat |
|
application/octet-stream |
bin exe so dll class |
可执行程序 |
application/zip |
zip |
winzip |
application/x-gzip |
gz |
gzip |
image/gif |
gif |
GIF图像 |
image/jpeg |
jpg jpeg jpe |
JPEG图像 |
image/png |
png |
PNG图像 |
text/html |
html jsp |
网页文档 |
text/plain |
txt |
文本文档 |
text/xml |
xml |
XML文档 |
text/json |
json |
JSON字符串 |
1.3 示例
/**
* Created with IntelliJ IDEA.
*
* @author Demo_Null
* @date 2020/6/19
* @description 文件下载
*/
@WebServlet("/downloadServlet")
public class DownloadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 获取请求参数,文件名称
String filename = request.getParameter("filename");
// 用字节流关联
FileInputStream fis = new FileInputStream("/path/" + filename );
// 设置 response 的响应头
ServletContext servletContext = this.getServletContext();
String mimeType = servletContext.getMimeType(filename);
response.setHeader("content-type", mimeType);
response.setHeader("content-disposition", "attachment;filename=" + filename);
// 将输入流的数据写出到输出流中
ServletOutputStream sos = response.getOutputStream();
byte[] buff = new byte[1024 * 8];
int len = 0;
while((len = fis.read(buff)) != -1){
sos.write(buff,0,len);
}
fis.close();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request,response);
}
}
- Hive 中的复合数据结构简介以及一些函数的用法说明
- BloomFilter 简介及在 Hadoop reduce side join 中的应用
- 关于 hadoop reduce 阶段遍历 Iterable 的 2 个“坑”
- Hadoop Mapper 阶段将数据直接从 HDFS 导入 Hbase
- 译文 | 量化投资教程:投资组合优化与R实践
- 浅谈 java 中构建可执行 jar 包的几种方式
- python 日志模块 logging 详解
- 基于堆实现的优先级队列:PriorityQueue 解决 Top K 问题
- explain 深入剖析 MySQL 索引及其性能优化指南
- 图文并茂详解 SQL JOIN
- 自定义 hadoop MapReduce InputFormat 切分输入文件
- Hadoop MapReduce 二次排序原理及其应用
- MySQL Tips【Updating】
- Meltdown、Spectre攻击---CPU乱序执行和预测执行导致的安全问题
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- SAP Spartacus shipping address页面请求1 - Address
- SAP Spartacus shipping address页面请求2.1 - setDefaultAddress
- SAP Spartacus只执行指定单元测试的小技巧
- SAP CDS view里将Date和time连接成timestamp的函数
- SAP CDS view里计算两个date & time字段间包含的seconds秒数
- SAP CDS view里的日期操作函数(往后推算X天得到新日期)
- SAP CDS view的日期格式转换,比如从YYYYMMDD转到DD/MM/YYYY
- SAP CDS view如何取得当前系统日期和系统时间戳
- Vue 父组件如何监听子组件的生命周期
- Django3+websocket+paramiko实现web页面实时输出
- 【5分钟玩转Lighthouse】开车也能跑程序
- LeetCode74|有序矩阵中第K小的元素
- LeetCode73|根据字符出现频率排序
- LeetCode72|前K个高频元素
- LeetCode71|数组中第K个最大元素