00:00
好,那我们刚才呢,是通过it response body呢,然后来响应浏览器的一个数据,对吧?那咱们只需要干什么呢?将咱们当前这个需要响应到浏览器的数据,然后来作为当前方法的返回值返回就可以,如果说我们需要来响应浏览器一个接送格式的数据,那这个时候呢,那我们是不是只需要,然后按照咱们那三个步骤对吧?第一个步骤导入杰克son的加包,然后第二个步骤呢?然后就是来设置这个MVC的注解驱动,然后第三个步骤就是将我们需要转需要响应到浏览器的这个Java对象,然后来作为方法的返回值,然后在咱们的控制器方法上来加上it responsibility注解就行啊。好,所以说it response body注解,咱们以后用的会非常非常的多,然后甚至呢,咱们一个控制器里面,咱们的一个控制层里面,所有的控制器方法,咱们都需要干嘛呢?加上it responsibility body,那所以说咱们现在呢,就这个结合我们的a controller注解和我们的it response body注解,大家注意就有了一个复合注解。
01:07
然后是什么呢?叫做a rest controller,大家注意就这个啊,好,然后it rest controller这个注解相当于什么?大家看好,这个大家可以自己去试一下,然后大家知道它是什么意思就行啊好,然后它就相当于我们在类上加上了a controller注解,然后并且为类中所有的控制器方法都加上了it responsibility注解。这个我记得我之前我跟大家说过一回,对吧,然后这个东西怎么去设置啊,叫做it rest control,大家注意就这个知道吧,啊,然后这个注解啊,非常的重要,它就相当于谁啊,然后咱们给它加上一个注释,然后它就相当于啊,它就相当于咱们的it controller,然后加上it response body,这个大家注意好OK,所以说这个注解呢,咱们以后呢,也是用的比较多的,因为如果我们用了这个注解之后,那我们就不需要在咱们当前咱们的每一个控制器方法上再加上it responsibility了啊好OK,那我们把这个说完之后,下面咱们再来看一下咱们spring VC中来实现这个文件上传和文件下载,这个文件上传和文件下载呢,大家注意,不知道大家有没有学习过solve,中原生的上传和下载功能,然后呢,这个万变不离其宗,就是我不管我不管。
02:30
我们是怎么来实现的啊,然后最终呢,咱们的思路是一样的,只不过就是我们的写法呢有些区别。OK吧,但是大家要知道文件上传和文件下载它都是文件复制的过程,文件下载是把文件从服务器,然后下载到我们的浏览器,复制到咱们的浏览器,文件上传呢,是把咱们的文件由咱们的这个浏览器,然后复制到咱们的服务器中这样的,所以说呢,它都涉及到IO流啊,然后呢,其实我们原来咱们在solve中使用原生的方式实现文件上传和文件下载,然后我们是不是只需要去创建一个输入流,然后来读取这个文件,再创建一个输出流,然后呢,把它给输出到相对应的位置就行,比如说你下载,然后我们就要把它给输出到咱们的浏览器,如果说我们要上传,那咱们就要把咱们的这个文件呢,把它给输出到我们指定的一个位置。
03:24
好OK,那下面呢,咱们就来看一下。SPVC,然后是怎么帮助我们来实现这个文件下载功能的,咱们先讲这个下载功能,然后再讲这个上传功能啊好,那我们先来看文件下载,文件下载中我们要想使用VC中的方式实现,那我们在这呢,咱们需要用到一个类型,叫做response entity类型,大家看啊,就是这个类型,然后这个类型呢,它是做它怎么用这个东西呢?大家注意它需要用在我们控制器方法的返回值,然后这个东西来表示的就是我们当前响应到浏览器的一个完整的响应报文。
04:05
叫做response entity,然后我们只需要把它作为我们控制器方法的这个返回值,那我们当前的response entity就表示我们响应到浏览器的这个完整的响应报文啊好,那所以说呢,那大家想,那我们现在的下载功能对吧?那我们是不是只需要将什么,咱们只要把咱们的响应报文的响应起来,设置成我们当前要下载的这个文件,对吧?那我们是不是就可以直接把文件给响应到浏览器啊,对不对,这样的啊好,那下面呢,大家来看一下,那这个文件下载功能呢,大家注意,大家可以直接去复制,然后咱们主要呢,就是来讲一下这里面的一个步骤就可以啊行,然后那我们现在呢,然后咱们来就在这个阿贾克斯里面吧,然后咱们把这个文件下载呢,给实现一下文件上传和文件下载啊实现一下好。那我们在这呢,咱们首先呢,先来找一张图片OK吧,比如说我在外部APP下面,然后咱们来创建一个目录,然后咱们就叫做img。
05:06
啊,或者说咱们叫做妹姐都可以啊,然后我们来找到一张图片啊,然后是找到咱们的这个。上硅谷,然后来找到咱们的这个上硅谷壁池,对吧,然后比如说咱们就拿着这张图片来实现一个文件下载功能吧,然后咱们从服务器呢,然后可以把咱们当前的这个图片给下载下来,OK吧,行。好,然后咱们来复制一下,然后放在我们当前咱们的这一个I'mg这个目录下,大家注意你下载这张图片是这样去下载,然后我们去下载其他的一些文件,比如说你下载一个Excel,下载一个MP3,然后下载一个视频,咱们都是这样去下载的,OK吧,行,然后呢,我们这样啊,然后咱们在咱们的首页里面,然后我们去写上一个超链接啊,然后A标签。然后在这呢,大家注意,然后TH冒号,然后我们在这来设置一个路径,比如说这个路径咱们就叫做test,然后斜线叫做下载下载,那咱们就叫做当OK吧,然后这个咱们是要来实现一个下载功能,下载咱们的图片,OK,其实咱们有的时候啊,大家注意这个下载功能其实我们也不需要自己去写,为什么呢?大家想啊,就有的时候呢,然后我们直接去看到一个页面的时候,就比如说我们只要把这个页面呢,在页面中给用户展示出来,如果他要想去下载的话,其实我们直接点击右键,你选中这个图片,点击右键,其中就有一个叫做图片另存为,对不对,对吧?所以说下载图片的功能啊,其实咱们的浏览器中就有包括咱们的好多文件的下载功能,大家注意这个浏览器里面它都是有的啊好,那我们现在把这个请求呢来处理一下,首先呢,咱们来创建一个控制层,这个控制层咱们叫做。
06:59
叫做fair up,然后and downdown down,然后叫count control,啊,行,然后我们在这需要加上一个a control的注解,然后呢,咱们就可以直接把我们的这个方法复制过来了。首先request mapping,我们需要来处理的请求,叫做test的斜线do的OK,然后咱们直接把这个方法给复制过来,大家注意,这个过程呢,其实大家可以理解为就是一个固定的过程。
07:30
OK吧,来咱们把它给放到这儿,然后呢,这里面的有些东西啊,对吧,然后大家如果就是我们把它给作为一个模板,如果大家要想去下载一些其他文件的话,其实我们只需要来改的就是谁啊,我们当前下载的文件的路径啊,行,那我们现在咱们来看这个方法,大家注意方法的返值呢,叫做response entity,然后这个response entity这个东西它是用来干什么的,大家看好,然后呢,它作为可以作为可以作为,然后咱们控制器方法的返回值,OK吧,好,然后就是啊然后啊表示可以表示,然后我们当前响应响应到浏览器的完整的响应报文,响应报文OK。
08:20
好,响应报文来大家看一下,你看这个对象它怎么去创建的啊,响应报文OK,你看它是怎么来创建的,咱们要想来创建这个对象,我们是需要有三个参数,首先第一个参数叫做bits,第二个参数叫heads,第三个参数叫status code,然后第一个bits这个东西是什么?你看啊,CR加P大家看你看这里面它是怎么来描述的,首先第一个叫啥叫body,啥叫body响应体,第二个叫做heads,什么意思,叫响应头,然后那我们之前咱们学过HTTP,在我们的响应报文中,然后咱们比较重要的信息,除了有响应头,还有响应题,还有什么,还有就是我们当前咱们的一个响应状态码。
09:04
所以说最后一个参数叫做status code,就是咱们的响应状态码,OK吧,所以大家看你看这个response nt t,它表示的不就是一个完整的响应报文吗?是不是啊,好,那下面呢,我们再来看,大家注意,咱们来看第一,你看我们在这咱们还传进去了一个参数叫做httb session,我们为什么咱们要来设置这个参数啊,大家注意,因为我们现在要来实现下载功能,那我们是不是就需要来进行一个文件的复制,那我是不是就需要知道我当前我要下载的这个文件,它所对应的服务器中的位置?OK吧,所以我们现在需要先通过session,然后来获取我们当前的solve context对象,然后获取它之后在我们的solve context里面是不是会有一个方法叫做get pass。对吧?Get real pass什么意思来获取咱们当前某一个文件的真实路径?
10:00
这个大家能看懂吗?这个大家应该之前都学过吧,叫做get real pass,其实就是来获取我们当前的某个资源在服务器上的路径,这个方法啊,大家看好,你可以在这里面设置一个空字符串,你获取空字符串的时候,它获取的是谁?设置空字符串的时候,获取的是我们当前这个工程在服务器中的路径,如果在这大家去加上一个字符串的话,然后它来表示的是我们当前咱们的这一个文件,然后在服务器中的路径。OK吧,其实就是一个拼接,比如说大家看好啊,然后我们现在呢,咱们这样,我在这来设置一个过的,咱们先把下面的这一堆代码,咱们都给它干掉,对吧,然后一个注释好,然后我们现在咱们来测试一下这个方法,比如说这个方法现在它是没有什么的,它是没有任何的这个参数,这个参数是一个空字符串,然后我们直接把ru pass给他输出,然后我们现在咱们来一个执行一个重新部署,大家看咱们来访问首页。
11:03
然后呢,来访问首页中的这一个超链接大家看啊,来刷新好,然后我们现在咱们来点接大家看啊,然后这里面是报错了对吧,这个报错的话,这个无所谓,你看他报的错是什么,他报的错是说我们当前咱们的web info下面的time place下面的test下面的down.html呢,然后他没有找到。对吧,然后他说我们当前咱们的这一个视图没有找到,那这又是什么意思,其实这个问题我们之前没有跟大家说过啊,但是它算是一种特殊情况,就是说我现在我的控制器方法,如果你没有设置返回值的话,它会把我们当前咱们的请求地址,就是我们当前要处理的这个请求的请求地址来作为逻辑视图,然后进行返回。对吧,就相当于我们在这写了返回,设置了一个返回值为string,而这个string就是test斜线档对吧?然后这个时候大家看你看他才会给咱们报这个错嘛,然后去找到我们当前ten place下面的什么这个test,然后斜线down.htmlok吧,但是这种情况咱们一般都遇不到。
12:14
然后我们一般情况下,你要往哪个页面去跳,那咱们就去设置一个逻辑视图就行啊行,然后咱们主要来看的是这个内容,来大家看啊,或者说我们也可以直接让他响应回去一个success,返回一个success也行啊好啊,在这报错了对吧,然后那我们这样吧,咱们在这给他设置一个string。对吧,然后呢,我们这样,咱们其其实这里面他已经把这个内容输出了,咱们就不找了啊,咱们别让他报错,然后直接返回sus行,这样就可以了吧,咱们在这儿是不是有这个页面对不对,咱们刚才说的那一种,大家注意是一种特殊情况,再说一遍啊,就是说这个控制器方法如果说没有返回值的话。
13:00
然后我们也没有通过response。点get right.right或点print响应浏览器数据,那它会直接将我们当前要处理的请求的请求地址作为逻辑视图来解析,OK吗?行,我们现在咱们在这再来一个重新部署,然后我们把这个东西啊给它清空掉。好,咱们稍等一下啊。好,咱们把这个给它清空,然后下面大家再来看,然后我们来一个刷新,然后咱们点击下载图片大家看啊,然后咱们看这个路径它输出的是谁,然后大家看一下啊。然后在这呢,大家看D盘,然后ideal下面的work space下面的s SM SP spring_MVC下划线,阿贾克斯,然后target,然后spring VC,阿贾克斯,然后杠1.0杠内short,知道这个东西在哪吗?就在我们当前的target下。这个大家应该都知道吧,如果说我们现在没有创建maven工程的话,我们创建的是一个普通的web工程,那当前咱们通过get real pass,你所获取的是谁?我们当前咱们所获取的大家听好啊,你获取的是我们的out当前的idea这个项目里面的out目录下的一个路径,而我们当前用了maven工程之后,我们现在获取的就是咱们的target下面,咱们的咱们的袜包下面的一个路径。
14:28
OK吧,好,那所以说我们现在要干什么,大家知道不?我们现在咱们是不是需要先来获取我们的这个文件,然后再读取这个文件来进行一个复制的功能,对不对,对吧?所以说我们是不是需要来获取的是我们的这个路径,就是我们当前咱们的这个袜包下面这个img下面的这个1.opg这个路径对不对,那这个时候怎么写,大家可以直接。直接把我们当前咱们这里面的这个路径给它写上img,然后1.propg就可以了,或者说我们也可以先看看,比如说你在这里面来写个ABC,或者说咱们写个img,大家看啊,然后这个东西如果你写的是一个具体的字符串,那我们当前的咱们这个路径它就会变发生变化,怎么发生变化呢?很简单,它会直接把我们当前咱们的这个字符串括号里面这个字符串的内容拼接到我们的这个地址后。
15:24
一定要看好啊,它会直接把咱们当前这个字符串拼接到我们的这个地址后边,它不管这个路径,不管这个文件在我们当前这个位置它有没有,它就是一个简单的拼接。OK吧,就是一个简单的拼接啊,这个答案要注意好OK,然后呢,比如说我们在这,咱们再来一个重新部署。好,然后我们把它给清空一下。来咱们把它给清空一下,然后下面我们在这大家看好,我们再来一个刷新,然后点击下载图片,大家看这个时候的路径,你看是不是就在后边直接去加上了一个img啊,对不对,所以说我们现在咱们要想来获得我们的这个图片的路径,那所以说大家需要怎么做,我们是不是直接在这来设置一个string啊,或者说咱们的real pass,然后等于real pass,然后把我们后边这个1.okg给它拼上就行,有他老师为什么你不在后边直接写斜线对吧?然后我建议大家,因为这里面咱们可能不知道我到底是要写啊这个斜线还是要写这个斜线,这个时候怎么办?那这个时候大家就可以自己手动来拼接,然后咱们拼的时候怎么拼,大家看好啊,在我们当前的file这个文件类里面,它有一个什么呀?它有一个separate,然后这样的一个成员变量,然后这个东西它来表示的就是咱们当前的文件的分隔符,而且它可以自动的去匹配。
16:55
可以自动的适用我们当前不同的系统,OK吧,所以说建议大家直接用这种方式啊,叫做fair.separate就是文件的分隔符,然后再加上我们当前咱们要去下载的这个图片,叫做一点勾PG就可以啊,行,这个时候大家再看我们现在咱们再来重新部署啊,那我们现在咱们的real pass,它来表示的就是我们当前要下载的这个文件具体的一个路径,好。
17:23
那现在咱们来一个刷新,然后咱们再来访问下载图片,然后下面大家看一下,咱们把它拉到最后,然后大家看你看这个时候咱们这个路径是不是就获取到了,对吧?所以说如果大家不知道我们当前这个文件这个路径之间的这个分隔符用什么的时候,大家就可以直接用这个fair.separate来作为路径的分隔符,OK吧,行好,那咱们接着往下看这个具体的一个下载的过程啊。
我来说两句