00:00
然后就是我们的response n集体了,那response n集体是干啥的呢?Response叫响应,N集体叫什么?实体叫做响应实体,大家看这个东西是用在哪的,大家注意我的就http message convert里面每一个类型和注解我都跟大家说了,它该用在哪儿,能听懂吧,就比如说咱们的这个注解是用在哪儿?行参,用来标识行参的,标识的行参,然后就可以获取请求体,能听懂吧,好,然后这个东西是用在哪的控制器行参的类型是不是,是不是是吧?好,这个注解是用在哪的标识控制器方法对不对?而咱们的response ntity这个东西用于哪控制器方法的返回值类型,而response en体代表的就是咱们当前所响应的实体,换句话来说。
01:00
说就是咱们自定义的一个响应报文,能听懂不?能听懂吧,叫自定义的一个响应报文啊好,来,大家看好该控制器方法的返回值,就是应到浏览器的响应报文,OK。这个东西能干什么?文件下载。OK吧,文件下载使用response n来实现文件下载文件的功能,好,然后这个功能的话,大家注意你直接复制上去,然后呢,大家去执行一遍,然后看一下效果就OK,能听懂吧,好,然后我在这先把这个环境给大家设置出来啊,好,然后首先呢,我们先把这些东西啊都给它关掉,然后呢,来找到我们当前咱们的这个controller,然后我再来创建一个class,咱们叫做fair up and down down,然后c control干啥呢?来实现文件的上传和下载的,OK吧,好,然后crver,好然后写完之后大家来看,首先呢,咱们先来写一个下载功能,比如说我们现在咱们要下载什么,我在我当前的static下边,然后我来创建一个新的目录它。
02:24
都叫做img,可不可以啊,可以吧,好,然后下面呢,我来找一些图片吧,比如说哪有美女啊。然美女老师语文老师有我没有啊,我不是不是那种人啊。找找啊,这个上归谷是吧,上规谷壁纸,我看看这个长什么样啊,行就这个吧,行吧,这是eclipipse的快捷键,好啊行,然后我把当前的这个图片呢,然后给它放到这,这能看懂不好OK啊行,然后咱们设置完之后,那咱们这个地方肯定是不是也是没有的,对不对,然后我们现在先来重新打包,OK,然后打完包呢,咱们就可以来实现一个下载功能了啊来大家看好怎么来实现下载,我还是在咱们的这个音代词算了吧,咱们换个页面啊行不行,来在这,然后咱们来创建一个HTML,咱们就叫做fair.html可不可以啊。
03:35
可以吧,好OK,然后怎么跳转到这呢?来找到我们spring mvc的配置文件,咱们是不是只需要来实现页面跳转就行,对不对,对吧,需不需要来处理其他的请求啊,不需要,所以说在这直接方法名就叫做啊请求路径咱们就叫做斜线file,可以吧,好然后呢,咱们的这个view name呢,然后咱们也是叫可不可以啊可以吧,好OK啊行,然后咱们设置完之后呢,我们就能够跳转到咱们的这个非点HTL了,对不对,对吧,这个是咱们。
04:13
好,然后这个是咱们来测试文件,测试文件上传和下载OK啊好,然后呢,我们先来写一个下载功能,比如说我们当前咱们下载的这个页面呢,咱们下载的这个资源它是固定的,我们就要让他下载我们sta下面的什么img下面的1.obg可不可以啊。可不可以,可以吧,好,大家注意,如果说你现在你要下载的资源不固定,其实咱们只需要动态的来获取它就行了,那什么叫做文件下载呢?文件下载按照我们当前工程的一个环境的话,咱们是从服务器将文件给下载到咱们的客户端,浏览器端能听懂吧,而我们的文件上传是从浏览器端将咱们的文件上传到服务器端,能听懂吧。好,所以说呢,这个大家注意它都不难,它都是文件复制,它都是文件复制,大家要知道他们的底层用的都是文件复制的过程,能听懂吧,好啊,行,然后下面大家看好,比如说我现在我就要下载这个文件,那咱们就可以来写个超链接啊,然后TH冒号,然后在这应该是A的大括号,比如说咱们就叫做test,就叫做斜线叫做test up啊,这是下载叫test到可不可以啊。
05:38
可不可以啊,可以吧,好,这个地方咱们叫做下载咱们的一点一点勾PEG可不可以啊,可以吧,好,OK,来咱们把这个请求处理一下来找到我们当前咱们的控制器,然后来写一个request me,或者说大家在这直接把我们当前咱们的这一段代码,然后给复制过来,我给大家解读一下,OK吧,好啊,行,然后咱们把它放到这儿,大家看好,首先呢,然后大家来看我当前我的这个请求映射是不是也叫做test的,是不是来那我们在这里面咱们是怎么写的?首先这是咱们的控制器方法,然后这个方法的返回值就是response nt,能看懂不?我刚才是不是也说了response nt作用于哪来作为我们当前控制器方法的返回值来表示我们当前响应到浏览器的响应包围是不是?
06:38
是不是好,OK啊?来,再往下,咱们的方法名叫test response entity。能看懂不好,OK,这里面咱们是不是来获取了一个什么,来获取了一个session对象,绘画对象是不是啊,好,首先大家看他都干了点啥?首先第一步我们先来获取了solve that context对象,通过session.get solve that context能获取不能,可不可以啊,可以so that contexttest表示的不就是咱们当前的整个工程吗?大家说对不对,对吧?好,OK,然后下面大家再往下看好看好这一句话是干什么的?我们现在是不是要下载文件了?大家说是不是啊,那我们是不是就要知道我们当前的文件,我们当前这个文件在服务器的哪个位置,因为我们只有知道这个位置,你是不是才可以通过文件咱们的IO流来实现一个文件的复制,大家说对不对?哎,能听懂不?哎,行啊,好,大家来看,那我们在这solve context,然后点。
07:45
Get real pass,我们当前要获取的文件是咱们的static下面的img下面的1.popg能看懂吗?好,大家有没有学过这个方法?学过没有?Serve contest里面的get real pass是干什么的?来获取当前咱们的服务器的部署路径,大家说对不对?
08:08
对不对,对吧,就是我们当前这个工程,然后部署到Tom片的服务器上的路径能听懂吧?好,如果这里面有字符串的话,来获取的是谁?当前这个字符串所对应的文件,然后在服务器中的路径能听懂不好啊行,那大家说这个时候它代表的是谁啊?咱们当前这个部署到tomcat服务器上,它是在哪显示的?咱们今天上午大家应该就能明白吧,今天上午咱们在做咱们的这个restful的增删改查的时候,我是不是引入了一个v.GS对不对,是不是访问不了啊,是不是啊,好,然后访问不了,那我们当前大家来看一下,是不是应该是在这个位置,就是我们当前咱们的服务器的一个,就相当于我们往务器中部署的内容,对不对,是不是啊,对吧,因为因为什么呢?因为今天上午咱们看到这个地方它是没有v.GS的,所以说咱们访问不到,我们重新打包之后,这个地方有了v.S咱们是不是就能够访问到了,对不对,所以说我们来访问的是不是应该就是这个地方的内容能看懂吧,大家注意跟咱们上个阶段还一样,不不一样的,外部阶段是放在哪的?
09:29
是不是放在咱们的输出路径叫out下的,有印象没有,有没有印象,有印象吧,就是这个位置,就是这个位置吗?咱们在这点project,这是不是有个out是不是,是不是在这放着呢,对不对,但是咱们这个阶段的话,用了maybe之后,是不是应该是在这个地方能看懂吧,所以说大家来看啊,咱们把它给输出,咱们看一下行不行,So,然后咱们把real pass来给输出,好,然后这个时候咱们获取了我要下载的文件的路径,那大家说如果我现在我下载的不是一个固定的文件,大家会写吗?
10:08
啊,首先大家要知道我们的浏览器一定我们从浏览器发送到服务器的请求是一定要告诉服务器你要下载的文件是什么的,大家说对不对,对吧?你既然知道你要下载的文件是什么,我能不能获取它的真实路径啊,我在这儿无非就是写死的,能听懂不?如果说我现在能够指定我要下载的内容,那咱们在这是不是把它给写活了就行了,能听懂不能听懂吧?哎,行啊,好,然后来再往下看,创建输入流,创建输入流为什么要创建输入流呢?简单说过,文件不管上传还是下载功能,它都是一个文件复制的过过程,那什么叫做文件复制?那你不得先读,读完之后再写,这不就是复制吗?大家说对不对,对吧?所以说大家看好了,我们在这创建了一个输入流。把谁放进。
11:09
进去了,我们要下载的这个文件的一个真实路径是不是放进去了,对不对,对吧?然后再往下看,去创建一个字节数组,能看懂吧,这个大家应该都见过,在咱们的IO流里面,我们是不是可以一次读一个字节啊,我们也可以一次来读满一个字节数组,大家说对不对,是不是好OK,来再往后看,大家知道这个东西是啥不,这个东西来表示的是不是数组的长度对不对,对吧?但是这个方法大家来看它是啥意思啊is.available。什么意思啊?见过没有?Available是可用的,意思是不是啊,那那这个这个方法是干啥的。啊,来获取我们当前的输入流所对应的文件的所有字节数,能听懂吗?
12:04
所有字节数就是当前这个文件,咱们的输入流是不是对应的这个文件呢?对吧?这个文件里面有100个字节,那它就是100,有1000个字节,那它就是1000,能看懂不好,OK,创建完数组之后再看这个方法叫做is的read by词知道啥意思不?知道啥意思,不是不是把我们当前输入流所对应的文件中所有的字节全部都读到这个文件中了,全部都读到这个数组中了,能听懂不能听懂不好,大家知道为什么这个数组能放得下,不就是因为咱们上边我们创建数组的时候,它的长度就是我们这个文件的字节数能听懂吧?所以说这个方法执行完之后,大家说这个数组里面放的是什么,就是这个文件所对应的所有的字节能听懂吗?
13:00
能听懂吧,好,OK,那大家说我现在是不是只要把这个数组响应到浏览器,那这就是我要下载的文件,大家说对不对,对不对,对吧,好,OK,再往下看,好那在这,那既然咱们当前方法的返回值是个什么玩意儿,Response ntt,那咱们是不是就一定要将咱们当前响应到浏览器的数据是不是给转换成response ntt对象,是不是?所以说在下边它干嘛了?是不是创建了一个response的NT的对象啊,是不是啊,好,而这个对象通过构造方法在创建的时候一共有几个参数,三个参数,第一个参数代词。知道是啥不代此现在是不是来存放了我们当前要下载的文件中所有的字节,大家说对不对?换句话来说,这就是响应题,能听懂不能听懂不,这就是响应题,大家想吗?你要下载,你又请求浏览器,你请求服务器的是啥?那服务器不就得给你什么吗?我要下载一张服片,那服务器不就得把图片给我吗?而现在咱们代表了这个图片所有的字节,不就是这个best词数组吗?大家说对不对?所以说这是啥响应题?那he是什么?那咱们的响应报文光有响应题行不行?不行,还得有响应头对不对?好,那响应头长什么样?大家看好,咱们刚才是看到这儿了对不对?然后再往下大家看。
14:39
有个headers,然后这个headers是什么类型的呢?是multi value map,其实这就是一个map集合,能听懂吧?好,其实这个东西大家注意,它就是一个map集合,大家自己看1MAP能看懂不?哎,好,然后这个东西呢,它是一个接口,看看是接口不是,那咱们能直接创建对象,不,不能,我们需要找它的实现类,而它的实现类有一个叫httb head,大家说这是啥意思,Http heads嘛,这不就是咱们的这个报文的图入信息吗?对不对,对吧?好,然后下面当我们去创建它之后,那为什么咱们的头信息是一个键值对的结构map集合呢?这个很好理解,不管请求头还是响应头都是减值,对,大家说对不对,对不对,对吧,都是减值,对,好,OK,那我们创建完之后,咱们往里面去添加数据,大家注意,哎,这。
15:40
这个东西就有讲究了,哎,这个东西就有讲究了啊,我们往咱们的响应头里面去添加的一个内容键,叫做content disposition,然后这个东西呢,叫做attachment file name,等于一点勾PG,大家注意这里面的内容只有这一点勾PG你可以改,剩下的东西你都不能改,都是固定的,能听懂吗?
16:05
能听懂吗?首先这个句话是干什么的?就是我们当前咱们设置的这个这个响应头是用来干什么的啊,然后这是用来设置我们当前的下载方式的,能听懂吧,设置咱们当前的下载方式,就比如说这个单词就是以附件的方式来下载文件,能听懂不?也就是大家点完之后,在咱们的谷歌浏览器的下面是不是会显示一个谁谁谁已经下载完毕,见过没有,这就是以附件的方式下载,能听懂吧?好,然后后边这个是啥?大家有没有发现,不管你在哪下载文件,它都必定有一个默认的文件名,大家说是不是?是不是就像是咱们从咱们的这个百度百科这个百度这个图图片里面,然后去下载了一张图片,它有名字没有,有名字没有有名字吧,所以说这个东西就是什么意思啊,我们当前未下载的文件所设置的默认的名字能听懂吧,一般这个东西大家可以怎么写,如果我现在我下载的是一个就是不是固定的文件,那我下载的文件叫什么,在这个地方大家就可以设置为什么能听懂吗?好啊。
17:23
行,然后这个是我们往咱们的响应头里面去添加的信息,好大家注意功能咱们说了,这就是设置咱们下载的方式的,那既然功能是功能是固定的,所以说这个也是固定的,这个大家能听懂了,能听懂吧,这个键它就是固定的,好然后这个值里面,呃,Attachment表示以附件的方式下载file name,然后这个东西来设置我们下载的文件的默认的名字,大家注意一定要看好啊,好,然后再往下看,大家看那咱们的第二个参数是不是就有了,这是不是请求题,这不是响应题,这是不是响应头对不对,那大家应该都看过咱们的响应题,响应报文信息吧,响应报文信息中除了有我们当前咱们的什么应头,有响应体之外,它还必须得有一个内容叫做响应状态码,见过没有,见过没有,二零。
18:23
0404来一个F12,然后咱们把这个打开,我现在来发送一个请求,咱们应该访问的是第一个吧,对不对,因为咱们当前这个页面中一共发送了几个请求,三个请求一个是他,一个是咱们的两个GS文件,对不对?好,点击之后大家来看看好了啊,这是我们的头信息,这是响应头,我点击之后大家来看,这不是我们当前的响应状态码吗?是不是?200代表OK 404代表not phone是不是?是不是是吧,好,所以说咱们除了有响应头之外,咱们还得有响应体,能看懂吗?除了有响应体之,咱们还得有一个非常重要的内容,叫做响应状态码,能听懂吧,好OK啊行,所以说来大家看咱们的第三个参数,在这是不是去创建了一个叫http statuss,咱们的HTTP协议的一个状态点,OK,就是200能听懂不能听懂吧,好OK啊来。
19:35
好看,是200,不是,是200吧,好行,然后下面那咱们的状态码也有了,大家看我们要想创建一个response n的对象,是不是就通过这三个参数创建了对不对?这是响应题,这是响应头,这是啥?响应状态码对不对?然后把流关闭了之后,直接将我们当前的response nt t响应到浏览器,那这个东西是不是应该大家想想就既包含咱们的响应头,又包含响应题,还包含响应状态码对不对?所以说response nt是干嘛的?咱们可以来自定义一个响应报文去响应浏览器,能听懂吗?能听懂吗?好,OK啊,来重新部署,大家来看看看,跟大家想象中的下载功能一样不一样啊。
20:28
其实是一样的,来咱们往下看,咱们在这我记得有一个什么玩意儿,是不是一个fair是吧,看好了啊,下载一样不一样,一样不一样,然后点击大家看好使不好使好使。能看懂吧,好,我希望大家在练习的时候啊,把这你可以把它换成是一个MP3,换成是一个MP4,比如说咱们上课的这个视频,对不对,大家都可以在这来实现一个下载功能,能听懂吗?哎,都是可以的啊好,这个大家要注意啊,行,这里面我说几点啊,首先呢,就是大家要知道这个方法是来获取咱们的输入里所对应的文件,所有的字节的,知道吧,好,还有一个就是我们在下载的时候,这个东西大家注意,我可以这样跟大家说,就是我们在外部阶段,咱们实现文件下载,跟我们在这个地方实现文件下载它一样的,就没几行,但是这一行你不管在哪实现下载,它都必须要用能听懂吗?能听懂吗,它都必须要有啊来设置下载方式,以及咱们下载文件的默认文件夹。这个东西不管你用的是什么方。
21:48
设它都必须要设置OK吧,好啊,行来别的就没什么了,那这个就是咱们通过瑞response ntt,然后来实现的文件下载能看懂吧。
22:00
能看懂吗?
我来说两句