00:01
好,前面呢,我们说了一下spring m VC的参数处理原理,接下来我们再来说一下数据响应与内容协商。首先数据响应呢,我们分为两个模块,我们来说第一个是响应页面,就是说我们如何发送一个请求跳转到指定页面,这个呢我们将会在后来的视图解析章节详细解释,那这次呢,主要在我们响应数据。响应页面呢,我们一般建于开发一些单体项目,那我们直接发一个请求,我们服务器处理完以后就给我们跳转页面,那就像我们这一块请求发来来我们想直接跳转页面,或者我们开发后台管理系统,请求发来我们这一个小单体应用直接跳转页面。那第二种响应数据呢,常见于我们来开发一些前后分离的项目,比如我们这个呢,只做一个后台服务来接收请求,前端我们这个项目呢,给我们发诉讼请求,能给前端响应接送数据,或者呢,我们给前端响应我们的这个图片或者音视频数据,或者我们的这个的Excel文档等等一大堆,以及我们的自定义协议数据都行。
01:01
这是我们说到的数据响应,那数据响应里边呢,我们前面已经说过了响应JS,响应JS呢非常简单,它的这个步骤呢是这样子的,首先我们想要让spring l VC能帮我们快速的返回一个接数据,首先我们必须在我们的POM插里边来引入我们这个start web场景,所以这是我们要做的第一步,有了我们这个web开发场景以后,我们会发现在web开发场景里边,他已经帮我们引入了叫start杰son相当于森的开发场景,哎,这是我们这个web场景,Web场景场景呢,自动自动引入了杰森场景,而这个杰森场景呢,就给我们引入我们杰森处理的相关依赖,主要呢,它是使用Jack克son来作为我们底层的这个杰森处理依赖啊,我们这一块把它截个图,那其实有了他们以后呢,那接下来我们想要让spring mvc给我们发一个请求以后,然后快速的想。
02:01
因为我们监测数据变得非常简单,怎么简单呢,我们第一次依赖已经赢了,现当引入了扎son的炸,第二次我们呢,只需要给我们的方法上标注response body注解,那么前面的这个测试类呢,是直接给类上标注了,好我么现在呢专门来写一个CTR了,那么就叫response啊,Test controller来测试响应,并且来说它里边的一些原理,好我们现在呢,来标一个普通的controller,按一个controller,我来标一个普通的controller,那这个controller的话呢,我也来写上一个方法,比如我们返回一个person person数据,哎,我们就叫get person来处理一个请求,处理get请求,给我们来响应person数据,比如我们就叫person啊,我们就叫test person,那我们最终呢,把这个person return出去。又一个。
03:01
我们把这个person呢,里边的相关属性给它构造出来,想要把这个person以杰森的方式返回,那我们先让我们的这个方法啊,我们的这个请求处理方法返回我们这个person对象,然后我们给person对象里边随便来装上一些属性,比如edge,比如28,然后呢,我们再来person,再来写一个set,比如person我们就来以当前日期为准,包括我们这个person来set上一个他的username,比如我们就叫张三好,那我们这个person对象有了以后呢,我们直接给这个方法上标注response body助理就行了,来我们用它呢,会非常方便,那我们来测试一下。而它的原理是什么样呢?其实我们前边一直在讲解我们这一块的原理,就是参数处理的原理,哎,我们如何确定各种参数的值,那接下来呢,我们就应该说到的就是我们返回值处理的原理,我们现在有一个person对象的返回值,它怎么能给我们响应一个接S数据,我先来测试我们这个请求是没问题的。
04:15
走,我们确定呢,响应的是一个杰森数据没问题,所以我们以后的JA森开发用我们spring boot也会非常方便,我们自动的已经引入了接算场景,我们只需要给方法上标注response body,然后呢,我们就可以给前端,给我们这个前端自动返回接算数据,前端自动返回结算数据,而这一块的原理又是什么呀?我们主要呢,来说一下这个原理,来看一下这个原理,我现在以debug方式来运行起来。这块呢,是来目标方法来进行处理,我们来看它处理完以后呢,返回到person对象以后,他该怎么做。前面呢,我们说了各种相当于参数解析器,帮我们来解析参数的值,来看返回值在spring mvc底层又是怎么做的,我们来刷新,刷新以后呢,好,来到我们这个请求dotypach,我们之前的断点一直在这,我直接来放行,来到我们真正的啊handler adapter handle来处理我们目标方法的,好,我们来到我们的这个handle了,它已经得到我们哪个handle了,我们来进入到内部的处理逻辑啊,我们进入到它的这个handle internal step into进来,好,来到他这一块的逻辑以后呢,我们之前给我们这一块打过断点,就是他来真正来执行请求方法呢,那么就直接放行来到这step into叫work handler method这一块呢,只要我们以work,好,我们来step into进来,然后我们来直接来继续来放行,他在这儿来准备了一些东西,大家注意在这呢,有一个叫argument reserve,就是参数解析器,我们再来确定方法参数值的时候,我们会用各种参数去解析器来确定啊,同。
05:57
同样的,我们在下边看到了一个叫return y6看到了,所以呢,我们spring mvc在底层对返回值的所有解析也是使用返回值解析器,所以呢它相当于能支持各种各样的返回值,好我们把这个打开,所以呢,我们现在原理这一块呢,首先有一点,我们这个返回值解析器这个呢也非常重要,在我们这个呃方法的返回返回值之前,他已经帮我们把所有的返回值解析器帮我们设置好了,然后呢,就等我们方法有了返回值以后,它就会呢,利用这个返回值解析器帮我们最终来处理好我们把这个。
06:40
图它原始大小放在这,然后我们来看一下返回值解析器怎么办?现在呢,我们返回值解析器已经被放到了这个EVO Apple可执行的这个方法里边,这个方法里边呢,我们现在都知道这有15个返回值解析器,然后呢,接下来我们这个方法的这个呃呃类,我们是使用response test ctrler,然后呢,我们调用这个方法来进行请求处理,最终处理完以后呢,我们来看怎么处理返回值,我们直接放行放行放行就行了,我们来到它的真正的请求处理逻辑这一块呢,都是前置的一些设置项啊,前置的设置项接下来在这这有一个in work for request,那么接下来呢要执行请求,请求执行完以后呢,会返回一个返回值,所以呢,我们以前是进入到这个内部来看请求如何执行,那我们现在呢,直接断点放行到下一步,好,我来直接给它放行好,这一块呢,还是来确定方法值,我们就不用确定方法参数了,在这doing work想利用反射来执行目标方法好。
07:40
让它执行在这块我们看到了执行好,那执行完目标方法以后,那我们肯定就会有一个返回值,那现在得到了返回值就是我们自己返回的per对象,得到person对象以后呢,接下来看怎么办,接下来在这一块if return value等等空,那如果我们返回了一个空对象,那么相当于方法直接返回,而我们接下来再来看待我们现在呢,不是返回空对象接来它判断,如果string us has test,相当于呢,我们在这一块呢,如果我们这个返回值,它这有一个response status来可以看一下啊,相当于呢,他来检测我们这个返回值里边有没有什么一些呃,返回了一些失败原因啊之类的东西,那么现在呢,也没有各种其他的这个相应的相当于response status,我们后来再说,然后呢,接下来只要我们没有我们有返回值,并且呢,不是返回的一个字符串啊,它利用strings来检测,那么就可以来看一下它呢,接下来就会调用这个叫return value。
08:40
Handle handle return value来处理返回值,而返回值呢,我们现在拿到了就是person这个张三对象,然后呢,它在这会获取到返回值的类型,并且传到我们这个方法里边。好,我们返回值的类型呢,我们来看一下啊,返回值的,这是返回值的值,返回值的类型啊,我们来看一下re,它这个类型它放在哪里了,类型好类型呢是person类型,在这个cuable里边,好所以呢,我们现在主要的核心就来到这儿,在这儿呢,它利用所有的返回值处理器来帮我们来处理返回值,我们把这一段的账va代码给大家拿过来,那我们返回值处理器如何处理返回值,我们可以来确定一下,现在我们返回值是一个对象,它呢又是如何把这个对象写成杰森的,好,我们可以step into step into呢,先会来到这个return one type啊,我们先来step into,然后呢,我们把它再出去,然后再step into进来。
09:40
来到我们真正的这个方法,Handle return value处理返回值,处理返回值里边呢,我们来看一下,它先select handle了,相当于它呢,先把我们这个返回值拿来是我们person对象返回值的类型,他也拿来是我们这个person类型,他来先用第一步先来找哪个返回值处理器能处理,然后呢,找到这个返回值处理器能处理,以后呢,接下来用返回值处理器再来处理就行,所以呢,关键方法就在这儿,它会呢,来寻找哪个返回值处理器能处理我们的这个返回值,走来看它如何进行寻找。step into进来看它的这个select handle的方法就在下边,首先呢,它判断is,呃,Ethnic return value是不是一个异步返回值,所以我们现在来step into看一下我们这个呢,是不是异步返回值来到这个return value handleless15个里边,好,它在这来进行判断,判断呢,相当于它在这便利循环每一个handle了,然后呢,会使用一个叫。
10:40
就是anthic handle了速的RETURN6HANDLE了,用这个handle了了判断我们当前这个返回值是不是异步返回值,它是怎么判断的?很简单,我们来step into进来就行了,进来来到它的这个实线。好,我们来看一下啊,直接step into来到它的这个实现,我们直接要来到我们的这个异步的这个handle啊,这有非常多的这个返回值处理器啊,我们看哪一个能进来啊,这个也不进来,Return value6handler也不进来,我们把这一块呢放大,大家注意观察这边。
11:15
好,再来step into进来,现在用handleler,呃,叫HTTP啊,Handle return value返回我们这个头的也不是,然后呢,接下来callable啊,也不是,然后呢加defer result也不是,接下来这有一个anthnic task1步任务的也不是,然后呢,接下来再大家看啊,有一个model attribute也不是,我接下来看我们的返回值类型是哪个,这呢,有一个叫request response body method,我们来step into进来,然后呢它也不是,然后来到我们这个view name也不是,然后呢,再来到map method也不是,再来到model attribute也不是,然后呢,大家会看到所有的这个返回值,处理器全部挨个判断它是不是异步的,这个返回值都判断不是,以后呢会给我们返回false,返回force,以后呢,接下来来到我们真正的逻辑,又是遍利所有的这个return value handle断了现在所有的返回值处理器,看哪个返回值处理器。这有一个叫。
12:16
Suppose return value相当于返回值处理器呢,我们来点进来,它呢其实是一个接口,好这个接口上呢,我们来看它规定的方法F12,它呢其实就有两个方法,一个叫support return,呃的这个type想让它支持的返回值类型,另外就是handle,它去来真正来处理这个返回值,想返回值处理器的逻辑就是我先来判断我当前是否支持这种类型返回值返回值处理器返回值,哎,我们把这个文档记录在这返回值处理先先判断啊,是否支持支持这种类型的返回值,支持这种类型返回值,如果支持它是怎么判断是否支持,就用它的support return type support return type是不是支持,然后呢,如果他判断,如果他支持,再调用返回值处理器。
13:16
处理器,然后呢,最终就会调用我们这个,如果它支持了,自然就会调用它处理器的这个处理方法叫handle return value来进行处理这个。进行处理好,所以呢,这就是我们返回值处理器的整个工作与原理,就这么两步,那我们最终呢,是哪个返回值处理器能支持好,我们来到这来看一下,首先model and view,我们来看第一个返回值处理器来step into好,我们先来看第一个返回值处理器叫model and view method return value,看到了,看它支不支持step into进来,它呢支不支持返回值,它的判断非常简单,看我们这个返回值的这个类型是不是model and view这个类型,也就是说我们说的叫模型及视图,里边呢,既有我们这个数据,也有我们要跳转的页面,先看我们这个方法的返回值类型是不是呢,叫一个这个类型叫model and view是不是叫它,但是呢,我们现在不是叫它,所以呢,我们第一种就不支持,那我们自然呢,会返回false,我们可以可以给大家。
14:31
在这来计算一下。首先呢,它的L这个没有圈完整,我们把这一块呢圈完整,我们来给大家计算一下,这种返回值呢,不支持好相当于我们第一种叫model and view method的return value handle了,大家来看到底有多少种返回值类型解析器,就在这第一种它不支持,那我们自来猜第二种model的processor啊,这个呢,我们他肯定也不支持好第一种不支持跳过接下来来到第二个叫model method的processor,它判断支不支持step into进来,它呢判断支不支持,就看你的这个类型是不是model这个类型,我们返回值呢,也不是model类型,我们是自定义的对象,所以也不支持。在第三种返回值类型解析器叫view的return value啊,这个看到了,好,我们来step into进来,叫view return value handler来看它,它呢,判断我们返回值是不是能写view类型,所以呢,那正好我们来整理一下到底支持多少种返回值。
15:37
我们在这呢来整理一下1231.2,我们可以在这1.2spring mvc到底支持到底支持哪些返回值。哪些返回值,那我们就可以在这儿呢来确定出来了,首先呢,我们把这一块的所有的确定,我们写到这第一种返回值啊,我们之前看到了各种这个Y6看到了,好,我们现在把能整理的整理过来,叫首先它是view类型的,好,前面呢我们已经判断过几个,我们来看一下前面的这几个他们的判断,Model and view,所以呢,第一种就是我们之前刚看过的,如果你的返回值是model and view的,或者呢是model的,第二种呢,大家看啊,第二种这个叫model method process,判断你反回值是不是model的,第三种哎,接下来是response body,呃,Ter return value,看断了,我们来看啊,这种呢是支持什么。
16:48
好,这种呢,也不支持将来是response body的这个好我们来看一下step into,它呢现在支持是什么,它呢,拿到返回值类型,看你返回值类型是不是response entity是这种的啊,然后呢,我们把这个拿过来。
17:08
是不是response啊,然后呢,接下来它还支持响应式的这个response,大家看reactive看到了,好,我们这一块呢,说到响应式在说拿到body type相当于拿到我们这个返回,呃,相当于方法的返回值,这是person类型,然后呢,它判断我们这个person类型是不是我们这个responsibilityter,这个class相当于我们返回值也可以返回为它。叫它来step into,它会啊,多种判断啊多种判断,所以呢,我们接下来直接也也给他返回这个呢,也不是我们来看接下来streaming啊response判断我们这个返回值是不是流逝数据的,哎,有一个叫streaming responsibility把这个拿过来,所以呢,你返回值的类型是不是它。
18:01
我们可以点进来看一下streaming response body,哎,其实呢,它是一个函数式接口,你使用函数式编程的话呢,也可以,哎,我们接下来这个结束了以后呢,接下来这个也不是接下来来到HTP n.method的,我们来看一下支不支持,将在我们还能返回HTTPN,它判断我们这个返回值类型是不是它,并且呢,返回值类型不能是request ntt,哎,你返回值类型也可以写HDNTT啊,我们现在呢也不是,我们就是一个自定义的对象,那再来叫http heads return value来看一下啊,Step into进来来到这呢,这有一个判断我们返回值类型是不是叫http head走相当于返回值我们又能写它。其实按照这些名字大家都能知道,接下来看colorable method,我们来step into,叫colorable method return value handle断了,它判断我们的返回值是不是cable类型的,这其实就相当于它判断我们这个东西呢是不是异步的,哎,这是我们异步的cable。
19:07
我们在学GUUC的时候,大家也都知道这个事情,然后呢,接下来我们继续来判断,这个呢,我们也不是cornerable加来呢,它还判断是不是有一个叫这个我们来step into,我们来看接下来的handle了,叫diver result,好,Div result呢相当于判断我们这个返回值类型是不是他们你可以返回至类型,写他们dier result,这相当于也是来支持异步的,叫listen listenable future啊,这个呢,还是我们这个GOC里边跟异步相关的啊,Comp stage,只不过这个呢是被spring m v包装了的一些异步返回方式,那我们在后来学我们的这个异步编程的时候啊,我们也会说到现在呢,也不是啊,来到我们这一块叫还有一个叫anthyic task啊,我们异步任务的,我们看一下step into进来,现在呢,我们返回值还可以写,它其实也就是说S么MVC它能支持的。
20:07
的返回值有非常多啊,不只是我们开发中啊,简单的用那么几个再来step into,还有一呢,看我们的这个呃,Return value,我们的这个return type,我们返回值是不是has method的a not,是不是我们这个方法标注了model attribute注解的。所以呢,如果我们方法标注model attribute注解来返回值,有有modeltribute注解,它呢也行,它呢也这种处理器就能支持这种处理的注解,来看我们的整个这个方法给我们返回的是true还是false。计算好它返回呢还是false,而且呢,你标这个注解,它会还会判断being,你的这个返回值类型不是simple property,虽然不是简单的string类些,比说你标的注解必须反馈是对象,不能是一个简单啊类型,然后呢,接下来还有一个叫request response body,我们来看一下这个step into这块呢,这个叫request responsibility body muscle processor。
21:14
这个拿过来,它呢不叫value handler,它叫processor,这呢有一个叫support return type支持的返回类型,它使用an notation工具类,先判断我们当前的这个返回值,然后呢,它有没有标注response body注解,大家看是不是来判断标注response body注解,那巧了,我们这个方法的这个返回值,它呢确实标注了response body注解,你在方法上标的或者在类上标的都一样,我们相当于呢,现在来判断我们是不是标注了response body注解,那我们现在呢,肯定是标了,可以给大家看一下,这块的判断会为true。走好,我们这个判断为true,然后最终呢,我们相当于决定就是用它,因为我们标了注解,所以我们决定用它,决定用哪个呢,叫request response body method的process control后,也就说我们的这个返回值响应接数据返回值标注了at race on body注解,哎,我们的这个,呃,确实呢,标注了这个注解,标注注解呢,就会用这个处理器来进行处理。
22:27
好,用这个处理器来进行处理,那相当于我们最终终于知道了,好,那我们就是用这个处理器,然后我们最终呢,经过一系列确定以后,我们知道了用这个response request response body muscle的process来处理我们的这个数据啊,最终呢,接下来就是handle了,Handle return value step into进来,那接下来呢,下节课我们就来看我们的这个request response body method processor,它如何处理我们反馈值,相当于呢,我们现在的场景就是只要我们来标了response body注解,我们就能看到这个数据呢,就会被以杰森的方式写出去,但是呢,它又是怎么写出去的,我们探究到这一步,相当于它是利用我们的这个processor,这个processor呢,能支持处理我们返回指标的responsibility注解的,那下节课我们就来看它如何进行处理的,那现在方法断点呢,已经达到这一行叫handle了,Handle return value,哎,就是来处理它的这个return value呢,我们能够看到最后一行话,然后呢。
23:27
就最后一行话叫write with message converts,比如呢,它在这一块来处理呢,是使用message convert消息转换器,比如我们下一节课要说的消息转换器的原理,好,那我们就暂停到这儿。
我来说两句