00:01
来,我们接着说,好,那么接下来呢,我们来说一下,当我的请求来了以后呢,它是存在对应的映射的,也就意味着我能交给这个dispa solid进行处理,那我们来看一下它后续是怎么进行处理的,好,那我们接下来呢,就需要来到我们的代码中,当你存在映射的话呢,那么你的代码会来到这个位置,所以说呢,我在这就给它加上一个断点,我们还是通过debug的方式再把这个过程的完整的再去调试上一遍,好,大家呢,都跟上我来走一下啊。好,先把我们的这个项目给他停掉,然后呢,我把这个移掉啊,因为bug的时候他经常容易出问题啊,我就只保留我当前的这个项目来把它启动一下。呃,我看一下啊,我记得我之前还加过好多断点是吧,我把这个加了断点的都给它去掉啊,我们重新来去打这个断点,好都把它干掉,干掉以后的话呢,我们刚刚加了这个断点是不是也被干掉了呀,是吧?把这个还得再重新给它加回去啊,那也就意味着现在其实我总共呢,诶就加了这么一个断点,看明白了吧,就加了这么一个断点啊OK,来我们就来去分析这个过程。
01:20
好,来,回到这个位置,我们来去访问一下,访问好,那么断点停到了这个位置,停到这个位置我们怎么去分析这个过程呢?那么这个代码是你自己写的,没啥要分析的,我们分析的是人家底层执行的流程,那我就要去找是谁调用的我的这个方法,好,所以说呢,我们来到调用站这个位置,我们往下翻,我们就能看到,诶,是在我的despite solid的do底PA里面,是在这一行开始去调用我们的,好,那我们就来到这一行,好,这个需要加我们的源码啊,外BMVC,我们给它加上。好,Web mvc我们回来给大加上啊好,在这来给大加上,OK,那么加上以后呢,我们再来点一下,我们刚刚确定好了这一步,哎,就是这一行,那么它是从这一行开始呢?诶就要去执行我们的请求处理方法了,那么我们来看一下它是怎么执行的呢?诶,它这个位置用到了一个ha对象,Ha是不是调用我们这个handle啊好,那我们就要看一下ha是谁,来我们点一下,诶我们发现这个ha呢,是在我们的923行初始化的,看到了吧?来这个位置我要打上断点,呃,这个ha呢,注意它是一个handler adapter,好,注意这个对象是不是就是我们在图里面提到的这个handler adapter对象,对吧?诶,找到他了啊好,他要进行初始化,那么它又是怎么初始化的呢?它掉了一个get handle了adapter,这是在当前类中的一个方法。那么在。
02:59
这个方法里面呢,传了一个map的handler.get handler,那我们来看一下这个map的handler又是谁好一点,诶,我们发现这个map的handle了,叫做handle了,Exq这个对象好,而它呢,就是我们在这个图里面看到的。
03:18
看这个位置是不是有一个,哎呦,是不是有一个handle了XQ称对象啊,对吧?OK,好,那么我们也就定位到了,就是它,那我要看一下它在哪个地方被初始化的啊,我们来往下找一找,哎,是在这个位置被初始化的呀,看到没有map的handler是不是给它赋了个值啊,对不对,OK,那么它被赋值的时候怎么赋的呢?是通过一个get handle的方法来赋的,那么这个方法呢,也在我们的dispa solid里面,我们来点一下,点一下以后呢,我们能看到在这个get handle了方法中,诶,它通过一个handle mapping,你看到没有,是不是迭代所有的handler mapping,然后呢,拿到具体的一个handleler mapping对象,通过hm.get handleler是不是获取到了我们的handleler XQ称对象啊,而这个地方我们提到的handler mapping,大家来看看是不是就是我们图里面提到的由handleler mapping来获取我们的handleler XQ train啊,没问题吧?好,那我们就能找到这个handleler mapping。
04:18
那么将来他肯定是要执行这个地方的,我也提前给他加上断点,明白了吧,那么这是我们的第一个阶段打断点,好,接下来我们就重新来一次,我就不会让这个代码直接停到这了,因为停到这其实已经晚了,该获取的对象我都获取到了,对吧?接下来我们要去看一下这些对象具体是怎么获取的,以及每个对象我为什么获取它,它到底是来帮我们完成什么功能的,理解了吧,好,所以因此这一次我们直接放行,放行完了以后呢,我们再来访问一次。啊,注意,首先代码,你看一下我们这一次停到的位置叫做什么,是不是先获取一个map的handler对象码,而这个map的handler我们刚刚看过,就是一个handler XQ train这个对象能看明白吗?OK,好,那我们就要来看一下这个map的handler,它到底是做什么事的?OK,那我们就要来到handle德了CU这个类中去看一眼。
05:19
啊呃,怎么看它呢?你不要这个一行一行去看,对吧?这个太浪费时间了,而且你敢保证你都能看得懂吗?是吧?所以说我们就不需要说一定要把它都完整的过一遍,我们大概的知道一下你这个类是干什么事儿的就行了,好把鼠标搁到这个上面,然后看我们的Java do OK,大家要注意了啊,这是一个handle了,什么意思啊,什么思啊,Q,应该是一个执行量对象吧,对吧?叫做什么handle了,执行量对象handle了,不就是我们的处理器嘛,然后呢,它包含了handler object,不就是我们的处理器对象吗?以及所有的handlercept是不是我们的拦截器对象啊,能明白什么意思吗?诶,就是我们的拦截器对象,这是我们的处理器对象,那我就知道了,在这个家伙里面呢,有我们。
06:20
的所有的处理器对象,有我们所有的拦截器对象,那么大家就来想,我在下面的操作中,我要去执行我的拦截器,我要执行我的处理器,我肯定得获取到这个对象了吧,对吧?因为所有的东西都在它里面了,能明白吗?OK,好,那么我们知道它是干嘛的了,知道它是干嘛的以后呢,我们来回到这个位置,我们来看一看它是怎么获取到这个对象的,好,因为在这个方法里面呢,我已经提前加了断点了,所以说我们断点直接放行,他就来到这个位置,准备开始要获取我们的handle了,XQ train这个对象了,好,到目前为止都能跟上吧。OK,来接着往后看,接下来呢,它是通过一个迭代所有的handler mappings,拿到每一个handle了mapping,那我们现在我们看一下这个handler mappings都是谁,你看看哈,放上来我们能看到这里面呢,还是比较多的,你看。
07:20
是不是总共有三个呀,是不是有三个这个handle了mapping啊,对吧,但是呢,我们只会使用其中的一个,就是第一个叫做request mapping handle了adapter mapping,好,所以说你看我们在迭代这个过程啊,大家注意迭代来代码往下走一行,我们拿到了这个HM,就是我们的request mapping,看德的mapping吧,看到没有?OK,拿到它以后呢,注意这是一个日志输出啊,我们不用去管它来代码直接往下走,是不是来到这个位置了,他要帮我们去把request传进去,是不是要去获取一个handlerq对象了吧?OK,好,那我们就来看一下这个HM里面有啥东西啊,你怎么能获取到它呢?来,我们把鼠标搁上去,我们来分析分析它里面的东西啊,好,在它里面呢,我们看看你要get一个handle德了,我们就找找它里面的handle德ler呗,看看能不能找到这个handle德R。
08:16
看一下哈,在什么地方呀,肯定是能找得到它的,找不到它的话呢,你用它干嘛呀,对不对,我们来看看哈,嗯,这里面找一找handler method啊,这是我们的那个映射的方法嘛,是不是我们这个hello的方法啊,对吧,映射的一些方法哈,OK啊,在这个位置你看一下,它里面其实已经能看到一些我们与我们相关的东西了吧,是不是我们这个spring VC handler里面的这个hello啊,对吧?啊,这是我们的这个方法啊,那么还有啥东西啊,我们再来找一找。还有什么东西啊,这个什么handler method是吧,然后呢,别的呢,别的好像都不认识了是吧啊。
09:08
好,别的好像确实也不咋认识了哈,好OK吧,那我们就不用再去找了吧,好,反正我们现在呢,能从这个handle了method中大家注意啊,从这里面的话呢,我们其实已经能看到一些跟我们相关的东西了,对不对啊,那么他将来从这个HM里面呢,去调用一个get handle的方法,把我们的request传进去,那么它就会拿到一个handlerq这样的一个对象来,我们代码往下走一行,好,我就拿到它了,拿到它以后呢,我们看一下这个handler是谁,这个handler其实就是你看看哈,Handler a q with,一个handler,它里面的就是我们的,诶,Spon mvc handler里面的hello,看到没有,是不是它呀,对不对,就是我们的处理器,以及我们的处理器的方法,他都拿到了,后面还有什么东西呢?注意,正常情况下它还得有ception。
10:03
对不对?为什么现在只有一个呢?因为我们上午在讲拦截器的时候,大家应该都看到过,默认系统啊,不能做系统啊,默认spring VC是不是有一个拦截器的?OK,现在获取到的是就是它好,那么我们就知道了,所有的请求处理器以及我们的拦截器都在这个对象里面,而是由我们的潘德拉麦来获取到的。明白了吧,好,那为什么要由这个handle德ler maybe来获取呢?因为这个家伙里面是不是有我们的handleler呀,对吧?所以说你看了哈,我们再来看一下它是干嘛的,你点进来,鼠标搁上去,来,你看看这个位置。他说他是一个什么必须要被实现的一个接口,看到没有?对吧?呃,被实现了一个什么接口,然后呢,做了什么事呢?定义了一个mapping是不是映射呀,什么映射呢?诶在这个请求与handle了object,就是你是什么请求对不对?哎与什么呀,与你的请求的什么,这个处理器不是这个handle德的of,这不请求处理器吗?对吧?它这里面的定义了什么呀,请求与请求处理器的一个映射,那么大家来想。
11:18
注意了啊,大家来想,最终呢,我想拿到一个,看这个位置啊,我想拿到一个handler excu这个对象,诶,怎么又跑了呀,我想拿到一个这个对象吧,那么这个对象里面呢,会包含一个handler,但是呢,我们来想哈,我们将来是可以写出多个请求处理器的,对不对,那么我每次我都要把所有的请求处理器都给你拿回来吗?需要吗?不需要,你当前用谁我才给你拿谁,那么我怎么知道我当前要用哪个请求处理器啊?我得根据你当前的这个请求,再结合上我们的handle mapping,在它里面,我根据一个具体的请求去找到你对应的请求处理器,然后呢,给你返回回来,因为这个家伙主要就是来完成什么请求与哪个处理器之间是有映射关系的,听明白了吗?诶,是来做这个事的。好,OK,把这个解析完以后,你看现在我已经拿到这个对象了,然后呢,它一判断这个加空不等于空,那么接下来是不是要开始蕊称了呀?这个与水称written到什么地方了呢?是不是written到我们的get handle了这个方法的位置了,对吧?OK,那我们就来看一下啊,到哪来着?
12:35
我给你找一下啊,900多行是不是。是不是存到这个位置啊,你从这个位置调出去的嘛,对吧,那么它就把你的什么map的handle了,就是我们那个handle了,Excu这个对象了,就给你要返回回来了,好来我们断点往后走一下,OK,那么他就走到了这个位置,现在我们来看一下这个map handle德了,是不是我们希望的那个对象。
13:02
看到了吧,OK,就是它OK,拿到它以后呢,我们还要再去获取一个handler adapter,获取这个handler adapter干嘛呀。那我就得知道一下你是做什么事的吧,好,我们先来分析这个啊,你看他从map的handler里面的去get了一个handler来得到我们的一个什么东西啊,Handler adapter就是相当于我把你的这个请求处理器对象呢,传到这个方法中来得到一个处理器的一个适配器对象。对不对,你看了哈,在map的handle德ler中,它有一个什么handle德ler吧,这个handle德ler就是我们的handle德ler method哈,Handle德ler method里面不就是我们的这个对象吗?它把这个对象呢传到了这这个方法中来,拿到一个handle了对象,那我们就来看一下,你又是干嘛的啊,鼠标搁到这上面,我们来看看。
14:00
来吧,那你翻译一下吧,这里面是干嘛的呀。如果。是。六五。翻译过来了,没啥意思啊啊大概的看一下这描述了一个什么东西啊啊看一下啊说什么呀,说哎他也是个借口,然后呢,必须被实现的吧,啊被谁实现呢?被每一个handler tap啊什么呀,干嘛呀,实现我这个接口,你要干嘛呀,去什么呀,处理一个request是不是一个请求啊对不对,那你就来想一下,我具体请求的处理,应该是不是那个请求处理方法来做的呀。
15:23
是不是啊,你一个请求过来以后,最终我是要调到那个方法上面啊,那我们就来分析这个关系啊,你方法呢,是在我的handle了这个对象中的,那我将来是不是得通过这个handler。去调用这个方法吧,是不是啊,OK,谁来做这个过程啊,就是我们的handle了adapt去做的,能理解吧?哎,就是handle了adapter呢,去使用我们的handle了对象来去调用我们的这个方法的,所以说这个位置大家注意,我们为什么要拿到它呢?那是因为我们在后续里面呢,有这样一行代码,我拿到这个handle了adapter以后呢,大家注意往下看,我们能看到有个ha.handle看到没有,是不是通过ha对象呢去handle不就最终执行到我们的啊,你看map那盖着handle了,是不是又把我们这个对象就是请求处理器对象传进去了吧,传进来以后呢,最终呢,诶就能调用到我们的请求处理方法。
16:28
理解了吧,所以说呢,我们现在所看到的这几个对象,我们是必须得获取的,好那么也就意味着我们花了,诶正常的时间呢,主要就是来给大家去说明白,这三个对象我们必须得知道明白了吧,好,那么像接下来的过程,我们其实就比较简单了,我们以前已经看过了,我们来接着走,拿到这些对象以后呢,接下来干嘛呀,注意我们直接来到这儿,你看这一行是不是我们的调用我们的拦截器的普no吧,注意谁调的呀。
17:04
Map的handler吧,Map的handleler是谁啊?是不是handler excu对象啊,为什么它去掉啊,因为它里面包含了处理器和拦截器嘛,是不是啊,能明白了吗?现在对吧,我拿到你,因为你里面有处理器,有拦截器,那我要调用拦截器,那我不得通过你去调用吗?所以说呢,诶通过它去调用拦截器的不handle方法,接下来通过我们的handler adapter去调用我们的请求处理器方法,再接下来,诶通过我们的这个map handle去调用我们的谁呀?去调用我们的post handle这个方法,看到没有是不是啊?诶调用我们的post handle就是拦截器的诶post handle这个方法,好,那么这个完了以后呢,接下来我们就要去要处理我们的结果了,对吧?所以说这样这这几个过程的话,大家应该都很熟了啊,你看这一步来939行执行我的普HANNO940五行执行请求处理方法950。
18:04
54行执行我们的post handle,然后呢,959行就开始处理结果了,明白了吗?来代码接着往后走啊,走好,调用普handle,再走调用我们的请求处理方法,再走来到我们的请求处理方法了吧,OK,这个一执行我们再来往后走,那么你就能看到他要去调用我们的pass,还有这个方法对不对?OK,在执行完它以后呢,我们再往后走呢,诶,你就能看到他要帮我们去处理这个结果。是吧?能看懂了吗?OK,来,再接着往后走,当你去处理结果的时候,这个里面我们要做什么事呢?无非就是调用这一行代码,是不是要开始获取我们的试图对象了,你就去想着么?请求处理方法都调用完了,那就拿到猫东安的美容对象了吧,拿到以后不就是要开始处理这个model and的围了吗?所以说来,从这个位置我们进去好,代码先让拉过来,好来到这来进去,进来以后的话呢,这样一行代码是不是先拿到我们的视图对象啊?
19:12
对不对,来代码过来,好,过来以后呢,我们来往下走一行,你看一下他拿到我们的视图对象,叫做jstl VO,对不对是吧?OK,拿到视图对象以后再来往后走的话,那就是视图对象,诶表re的就是去开始整合输出我们的模型数据了,好,我们来Vo.render啊来到这儿,那么它又要往里面调了,在调的时候你发现这是一个抽象的,然后我们说过这个方法的实现在谁里面来着。在of里面吗?讲师图的时候收获吧,来吧,那么他就要进入到我们的of尾,You进来,进来以后呢,我们能看到这里面有一个很关键的代码,就是这一行对不对,他要干嘛呀,他要暴露输出我们的模型数据,OK,断点直接过来,来到这以后呢,他就要什么开始做处理了,那么注意啊,这一行代码也就是我们的,诶,转发与重定向就是从这个地方开始就不一样了,明白吧,不管你是做了转发操作也好,还是重定向操作也好,从这一行代码之前所有的过程都是一模一样的,而从这个地方开始就要不一样了,为什么呢?因为它也是抽象的,而我们要具体看的话,我就要到不同的视图对象里面去看了。那你就来想,在这个a resource维物中,它是做转。
20:47
发的,那如果我来到reduct为用呢,它就变成重立向了,能明白了吗?所以说从这个地方开始转发以重立向,它就有了不同的处理了,我们先来看当前是一个JSTL为U,然后呢,我们也给大家讲过,这里面你是找不到GSTL为U的,那我们找谁呀?找它的负类是不是a resource为U啊,对不对啊,哎,来,直接来到我们的a resource为U中,那么你就能看到这个方法,它的处理是什么呀?你看暴露模型数据到我们的request中,然后呢,获取我们的转发器。
21:25
看到了吧,拿到转发器以后呢,再来进行最后的一个转发操作,是不是来到这儿了,看明白了吧,OK,好,那假如说我刚刚并没有来到这个里面,而是什么呀,我想进行一个什么,比如说我现在做的是一个重递上操作,那我就要进入到redirect里面,你看同样的一个方法,但是里面的实线羊毛。你看一下,这是resource为用的这个方法,它里面这样的实现,这是duct为用里面的这个方法,它里面是这样的实现,一样吗?不一样好,那么如果你是重立项的话,进来以后的话,我就要什么,诶获取到我的重立项的地址,然后呢,开始进行重立项,在这里面的话呢,我们就要通过这样一行代码,诶,它就完成了一个重立向,明白了吧,所以说这个地方呢,我们就有了一个什么,哎,分水岭了啊,就是你来到这以后,我就要看你是从逆向还是转发,我要去不同的视图里面做不同的一个操作。
22:25
啊,但现在我们是做了一个转发操作,因此呢,它最后代码呢,还是会来到这个位置啊,在这个internal resource尾里面,我们断点往后走,走到这看懂了吧,来断点再往后走,来到这儿,好拿到我们的转发器断点再往后走,它就开始要进行什么了,干嘛了呀,开始转发了吧?OK,好,那我来问大家,转发以后就结束了吗?结束了吗?是不是我们的拦截器还有一个方法没执行啊,对不对?好,那我们再回去找一找了哈,拦截器方法要怎么知道执行呢?你注意在这个dispa solid里面,大家还还应该还记得是吧?就是当我们进入到那个方法,哪个方法来着,我来给你找一找是吧。
23:18
啊,这个不好不好找是吧,我直接往上翻了啊。900多行来注意当我从这个处理结果进来以后呢,来你看我们是不是一直从这个方法掉进去以后,是不是一直就走到我们那个转发的那个位置了呀,那么你转发一结束,也就代表着这个整个方法调用结束了,然后在它的下边你看一下是不是有一个trigger after啊,所以说大家注意,现在我断点呢,是停到了这个位置。啊,不是,它断点是在这个位置,好,我依旧让这个断点往后走来,注意走,你看它是不是来到了我们的这个位置了,有没有结束啊,还没结束,因为你的这个方法还没调用呢,而且我们来看一下,对于我们这个浏览器里面呢,它现在有结果了吗。
24:08
我点了以后,现在有结果了吗?没有了,你看这个家伙还在转着呢吗?看到没有?右右右边这。这嗯啊,是不是还在转呢,对吧,是吧,这还没结束嘛,因为什么,因为你整个的流程响应你还没有完成嘛,是吧,所以说呢,你看最后一个断点呢,就是我们刚刚加的这个调用我们的trigger啊,Accomplish这个方法啊,当我再把这个断点一放行,看结果是不是出来了。那么这个流程就已经结束了,好,刚刚走的就是我们后边的这个流程,当然啊,这里面异常的这个问题我就不再给你去演示了,因为这个东西我们也没有讲过,听懂了吧,来,你只要把这个正常的这个流程能给他明白了就可以了。听懂了吗?啊,这就是我们的哎RVC的一个,哎运行流程主要呢,还是后半部分呢,前半部分呢,其实。
25:05
可以说还没到Mac里面呢,就已经结束了,是不是啊,对不对啊,好吧啊,那么就给大家讲这么多啊。
我来说两句