00:00
好,那咱们刚才呢,咱们应该是看了我们这个dispat solve,然后它的service的一个执行过程,对吧?好,然后这个service执行到最后执行到哪呢?执行到了咱们的do dispature方法里面,对不对,对吧?Do dispatch方法中啊好,那在这个方法里面呢,大家注意,然后有一个东西,其实这里面的东西咱们大部分其实都看过,大家说是不是啊是吧?好,然后在这儿呢,我直接来给大家打一个断点,咱们就把这个断点给打到这儿可以吧,好啊,行,然后打完断点之后啊,然后我们看一下,咱们把这其他东西啊,咱们都给它关掉,然后来找到我们当前的这个控制器,然后咱们就找咱们的第一个吧,然后是first inter,是啊,应该是咱们的test control,咱们就来把这个东西也打个断点,OK吧,好,然后这儿打个断点之后,然后咱们当前咱们的do dispatch方法,然后进去的时候咱们讲打个断点,然后。
01:00
打完之后,然后咱们在哪再打一个咱们的110这一行,这是应该是执行拦截器的,对吧?然后这个呢,然后是不是应该是调用我们的控制器方法的,然后这个方法是来调用咱们的post handle的,然后这个是来再往下走,这个是来做咱们的后续处理的,就是来处理model and view啊,然后再往下,咱们在这儿大家看这有一个render方法,这个应该是干嘛的,这个是不是应该是来处理我们当前的这个渲染视图了,对吧?然后再往下咱们走到这儿,这就是到结束了啊,这个地方就结束了,这个地方应该是咱们的什么方法,是不是应该是我们来调用过滤器中的after completion方法,对不对,对吧,好啊来。啊对,来调用拦截器的这个after comp方法啊,我重新部署了吗。不需要重新部署吗?不需要吧,来咱们直接来访问啊刷新哦,完了刷新完就进来了,咱们不看这个啊,先都跳过。
02:08
然后咱们下面来点击测试拦截器,点击之后大家看到这儿了,首先request是咱们当前的请求吧,把这个请求复制给了一个processist,然后request,然后往下走,走到这儿大家还记不记得这个map handler,记不记得,记得不,咱们去调用我们当前咱们的这个什么,我们去调用咱们的拦截器的pre handle post handle,还有after completion用的都是它,有印象没有,有印象没有?有印象吧,那不说了嘛,这个东西是一个执行链嘛,对不对,执行链里面包含了三个内容嘛,第一个是我们当前咱们所匹配到的控制器方法,然后第二个就是咱们的拦截器集合,第三个就是咱们的拦截器索引嘛。
03:01
有印象没来,咱们往下走,走走,然后再走,然后大家看,然后哪是为它来进行赋值的呢?然后大家看一下这个地方是不是应该是来为它进行赋值的,看到了没?看到了吧?好,然后咱们再往下走,然后走到这儿大家看啊,那我们的这一行执行完之后,这个东西是不是就有值了,其实咱们这个东西咱们也看过,里面就只有三个部分的内容啊,鼠标放上去之后大家看看,好啊,点击看,点开看,首先这个handle,这这是啥?来这东西是什么handle着是不是就是处理器啊,咱们说处理器它不其实就是咱们的控制器方法嘛,是不是啊,对吧?大家看一下是谁?com.at特硅谷点MVc.controller.test controller井号test intercept是不是就是我们当前test controller中的这个方法,能看懂吧?好OK啊,行,这是它所包含的第一个内容,第二个内容是不是应该就是咱们当前的拦截器,一共几个拦截器啊,三个拦截器一个spring VC中自带的两个是咱们自己写的,能看懂不好OK,然后再往下就是咱们的拦截器索引是不是啊,这个东西一直指它这个,这个东西来指向谁?来指向我们当前咱们过滤器返回force之前的这个索引,对不对?对吧?如果说没有返回force的话,应该来指向咱们当前过滤器集合中的最大,所以是不是啊哎,好啊行,然后呢,我们有了它之后,然后。
04:35
咱们再往下走来,大家看是不是就走到这儿了。这个东西是干啥的?Ha看什么类型,Handler adapter干什么的啊,干什么的?是不是叫处理器适配器?咱们刚才在讲咱们SPVC的常用组件的时候,说过一个叫handler mapping,是通过咱们当前将我们的请求和咱们的控制器方法,然后来创建映射关系的,对不对,对吧?好,然后呢,这个东西是干什么的?当我们找到了咱们的控制器方法,咱们是不是要去调用控制器方法,所以说就是由我们的handler adapter来实现的,能看懂吧?好,OK,来下边,那我们再往下走,然后咱们这些东西咱们就不管了啊,好,然后再往下,然后咱们就走到这儿了,这个东西是干什么的?调用我们拦截器的什么pre handle方法,还需不需要再进去再看一眼啊?
05:33
那算了啊。我还以为大家说用我的鼠标都点上了啊,咱们就看一眼吧,行不行?好,然后在这儿大家看,然后咱们来便利我们当前的拦截器集合对不对?好,然后只要没返回false,然后是不是应该就执行,然后再执行,再执行,那这个时候咱们三个拦截器intercept index应该等于二,是不是啊,好,然后再往下执行,所以说咱们拦截器的pre handle方法是按照我们配置的顺序执行的,对不对?好,然后再往下,咱们就走到这儿了,那大家看这一句话,Ha就是我们上边的谁呀?Handler adapter就是我们的处理器适配器,这个东西叫request mapping handler adapter,那说明我们当前咱们的handler adapter是不是也有各种类型,是不是啊,比如说我们当前咱们的请求和我们的这个控制器方法中,是不是就通过request makingping来进行映射的,是不是啊,那所以说我们。
06:38
在这大家看我们是不是就创建的一个handler adapter是什么类型的request mapping handler adapter能看懂吧,然后来执行咱们当前的方法,来执行什么方法,控制器方法,所以说大家注意我在这儿,我再往下一步执行的话,它是不是就会跳转到我们的下一个断点的地方,大家说是不是啊,对吧,点击之后大家看就走到这儿了,那我这样说大家听一下对不对啊,我们当前的这个方法,它一定是调用了我们的控制器方法的,对不对?
07:14
对不对。它不都进到这儿了吗?它都进到这儿了,那你说这里面有没有调用咱们的控制器方法呀,如果没调用的话,它怎么能进入到这个断点的位置呢?大家说是不是啊,是不是啊,对吧?好,所以说它一定是调用了咱们的控制器方法啊,那所以说大家想在这个过程里面,他应该就完成了很多的任务呀,就比如说我们所知道的任务,为咱们当前的行参来进行赋值,大家说是不是就在这一步做的对不对?大家想想是不是啊,因为我们的这个方法执行完之后,是不是直接就给我们返回了一个最终的结果,Model and view是不是啊?那所以咱们的控制器方法的行参,像咱们收集的请求参数呀,像咱们获取的请求头信息,Cookie数据,还有我们的请求集以及请求报文,像这些数据是不是应该都是在这个过程中处理的,对不对,对不对,对,包括咱们的数据类型转换,你。
08:17
就比如说大家都知道。大家还记得不?我们原来大家想啊,我们如果说从咱们的浏览器中,然后传输过来的一个请求参数,比如说是ID,咱们用的是什么方式呢?问号传参的方式传过来的OK吧?那ID大家都知道,一般都是int类型,是不是啊?那我们原来咱们做例子的时候,咱们经常做的就是username和PASSWORD2个字符串,那如果我们现在传过来的有一个ID,那我们能不能用in tIgEr,就是在咱们的控制器方法中,在这个地方用一个in t类型来接收ID,可不可以啊,可以大家注意好。还有就是大家记不记得我们原来的时候,咱们做过一个例子,就是当我们的浏览器传输过来的有多个同名的请求参数,有印象没有?有印象就咱们那个复选框吗?爱好有印象吧,好,那个东西大家想我们在这儿,咱们在控制器方法中是不是可以用数。
09:20
组来获取,也可以用一个字符串获取,对不对?当你用字符串获取的话,然后咱们的里面是不是应该是每一个当前这个请求参数名所对应的每一个值中间用逗号分格,是不是啊,对吧?那你说这个过程是谁处理的,那肯定也是在这个地方处理的,大家说是不是啊,对吧?还有就是我们刚才所说的那个问题,我们传过来的应该是string,但是咱们在这儿用ineg来接收,那他是不是也要来对我们当前的数据类型进行转换,大家说是不是对吧?大家注意啊,你可一定得转换,有学员老师,咱们不能直接获取一个inel,获取不了,为啥?因为万变不离其宗啊,你就算是dispatch solvele来获取请求参数,它用的必定也是request.get parameter,大家说对不对对对不对,你获取请求参。
10:20
就是你讲过别的方法吗?没有吧,咱们是不是就讲过request.get parater呀,对吧?那所以说没学过别的方法,那大家记不记得咱们request get parameter,包括request get parameter values,它方法的返回值是固定的呀,都是string的,所以说你要用其他类型来获取,那它不就得进行数据类型转换吗?咱们没有转换,那肯定dispace solve就进行了转换呀,是不是啊,是不是啊,好,所以说大家看好我们当前在这个方法执行的过程中,他就干了很多事情,干了什么事情呢?比如说咱们的数据类型的转换,比如说来收集咱们的请求参数,为型参赋值,就比如说咱们的行参中是不是能够使用solve API,是好,他就要为咱们的solve API复制,是不是啊?所以说这个过程中干的事情是很多的啊好,OK,来。
11:20
那咱们现在呢,咱们把咱们的这个断点跳过,然后F9大家看就走到这儿了,那是不是就说明我们当前咱们的这个方法已经执行完了,来获得了一个model and view是不是啊,看model view等于success model,咱们往预对象放值了吗?没有,所以说是空啊,然后再往下,这个地方是不是应该是来调用我们当前过滤器拦截器的post handle方法,来咱们再进去看一眼,大家看在这儿咱们是是不是倒叙直行的对不对,然后来走直行,再直行,再直行,看到A减减,那肯定就是倒叙直行的对不对?好,来执行完之后咱们再往下,然后咱们看到这个方法,那这个方法呢,叫process dispatch result,因为咱们当前的杜迪斯帕方法到这儿就结束了呀,大家说对不对,对吧,那这个方法结束了,咱们有没有看到它是如何渲染视图的没?
12:20
没有,所以说那这个方法就应该是来做一些后续处理的,大家说对不对啊,对不对啊,对吧,所以说这个方法咱们也是要看的,所以当我们来点进去之后,来咱们往下走,大家看来往下走,走到这儿,这有一个叫做error和error view,对吧,这个咱们也不管,然后这儿大家看,这就是对咱们的异常进行处理的,知道吧,如果说当前咱们在执行我们的控制器方法的时候,如果有异常,这不是异常不等于空吗?也就是说有异常我们下面就需要通过咱们的这个来进行处理,能看懂不啊,需要通过这段代码处理啊,但是很明显咱们现在有异常没有,没有,没有的话,咱们继续往下走,走到这儿,然后这个地方就是来渲染视图。
13:11
这个地方就是来渲染视图啊,就比如说把咱们的模型数据放在请求域中,然后根据我们当前的视图名称创建相对应的视图,都是在这里面去做的,能听懂吧,好,OK啊,然后再往下,然后咱们走再走,然后走到这儿,这是不是应该就是我们当前控制器方法,包括我们整个请求处理过程的最后一步,来调用拦截器的after completion方法,是不是啊,是不是啊,它的执行跟谁有关系啊?Intercept index有关系是不是啊,对吧?好,然后也是按反序,然后来进行执行,然后咱们当前的intercept index,然后等于几,那它是不是应该就是来执行,比如说等于二,那它就来循环三次,等于三就循环四次,是不是啊,哎,好啊,行,那就没别的了,那我们当前的这个请求呢,咱们就处理完了,OK吧,好啊。
14:11
小F9,然后跳过,好,这里面大家需要注意的地方啊,就是咱们这重要的这几个点是用来干什么的,大家要注意,OK吧,就比如说我们在咱们处理请求之前,要来创建一个什么叫做执行链,也就是咱们的handler execution char,这里面来包含的就是我们当前所匹配的控制器方法,还有咱们当前的拦截器集合,还有一个拦截器索引,OK吧,好,然后再往下的话,咱们在这儿创建了一个handler adapter,这个东西叫处理器适配器干什么的,来调用我们当前。咱们呢,请求所对应的控制器方法是不是啊,好在哪调用的呢?在这儿调用的,当然在调用之前来执行的是拦截器的break handle方法是不是啊,好啊好,在这儿就调用了我们当前的控制器方法,然后调用完之后来获得统一的结果,就是咱们的model and view,然后再往下调用咱们的post handle,然后再往下,然后来处理我们当前的model and view,也就是解析模型模型数据,然后还有一个就是来处理视图对不对,渲染视图啊好,最后再来执行我们的最后一个就是咱们的after completion方法,能看懂吧,能看懂吧啊,然后这里面我已经给大家写出来了,就比如说第杜dispach里面咱们都要干什么,这是咱们第一个要看的,我加上中文的这些地方大家都要看知道吧啊。
15:47
然后这个东西大家要看,然后这儿呢,大家也要看,来创建处理器适配器调用所对应的控制器方法,再往下,这是调用拦截器的pre handle方法,再往下由处理器适配器调用具体的控制器方法,最终获得model and view,好,再往下是调用咱们的拦截器的post handle,再往下后续处理这个方法我在下边也给大家粘贴出来了,能看懂吗?能看懂吧,好,OK,咱们需要来看的就是这一步,处理模型数据和渲染渲染视图,还有最后咱们调用拦截器的after comp,能看懂不?好,这就是我们当前处理请求spring VC调用组件来处理请求的整合过程了。OK吧啊,咱们当然呢,只看的是表面,大家知道这几个过程就行,能听懂吧,能听懂吧啊。
我来说两句