00:00
啊来,那么接下来呢,我们就花一点点时间啊嗯,给大家去讲一下这个model and它底层的这个啊圆码是吧?啊那么这堂课的话呢,可能大家会有感觉到点不适是吧?啊,因为它有一点点难度是吧?啊就是底层的话肯定是比较复杂一点的啊,但是呢,我希望大家呢,都能跟着我把这个过程呢,完整的去走上一遍啊,不管你能不能具体听得懂,或者说呢,能把它什么记住啊,但是呢,你一定要跟着我走下去明白吧,然后呢,等到最后的话呢,我们只要能看到其中的一个结果,就是能验证出来我们的这个猜测,诶那么就行了,其实主要去走这个源代码的过程呢,不是说想让大家一定要把这个源码都把它搞明白对吧,而是呢,是帮助你去理解这个model安啊,或者说呢,帮助大家来理解这个Mac整个框架。
01:00
听明白了吗?能理解什么意思了吧?OK,来,所以说的都跟上我啊,犯困的同学呢,你就赶紧进清醒一下是吧?我们来点有挑战性的东西对吧?OK啊,那如果说我们想去阅读到它的源代码,那我们就得去跟踪它执行的过程,怎么跟踪呢?来,我就在我的这个位置加个断点,我就看一下,当你处理完这个以后,你把这个值return到了什么地方,然后呢,我跟踪到你到了那个地方,我再去从他这个代码的下一行开始去跟踪的执行,是不是就能看到它最后的一个执行过程了?能明白这个意思吗?所以说呢,我们现在明白啊,你要怎么去跟踪这个东西啊,来吧,那我们就加上断点,加上断点以后我来保存一下,我们把这个服务器给它停掉,停掉以后呢,我们通过什么呀,通过debug的方式给它启动起来。
02:04
啊,来启动起来以后呢,我们再回到这个位置来做一个访问点一下啊,他现在询问我是否要进入到这个debug视图,那当然是的啊,我们进来进来以后呢,我们能看到,哎呀。他去错地方了是吧,这个debug它有时候会出现这个问题,你看到没有,它现在打开的是W01的吧,对吧?OK,为了防止这个问题出现哈,我们需要先停一下,停了以后呢啊,我先找到我这个骚在骚va里面呢,我把原先的这个零一呢给它移掉啊,这样的话就不会再出现这个问题了,明白吧,只保留你当前部署的这个项目啊,来重新启动。啊,他这个bug经常会有这个问题啊,没关系啊。好,启动成功,成功以后呢,这个位置我们回去啊,我们重新再访问一次,找一下,OK,你看代码现在是不是停到这了,看到了吧,好,那么代码停到这儿的话呢,首先我要关心的是你这个代码是从哪个地方调用进来的。
03:08
我是没有去调用这个方法的吧,对吧,那我就得看一下是谁调的,我写好的这个方法怎么看呢?注意了啊,我们需要看这个debug的这个一个调用站啊,就在这里面去看它这个代码是从下往上开始执行的,能明白吗?从下往上开始执行的,每执行一行,这个地方就会出现一个调用站,再执行上面的,再执行上面的,再执行上面的,是这么去走的。好,那我们就来看当前代码呢,已经停到了这个位置,就是我们的po Mac handle,讲什么test model and没用,那我就看看谁调用了它呢,其实就是他调用的,它调用的,它调用的它调用的,反正就是从下面一直掉上去的呗。但是这些东西我们是看不懂。你看到没有,这些东西你是不了解的吧,你往下看,你会看到一个dispa sal,你看到没有,这个跟我们是息息相关的吧,所以说呢,你就能定位到一个的一个底派,这个方法好,那我们来点一下它点一下好进入到我们的,我们来把原代码给他加一下,外部MVC好来稍等一下啊,我把原码给他加上。
04:27
Web mvc。好,打开来进来,那么重新来点一下啊,就是刚刚我们提到的位置,就是dispa solid do dispa OK,来就是这一行,好,我把行号呢也给大家显示出来,来,你看一下是不是九百四十五行啊,看到了吗?OK,那么在这一行的话,我们能看到它有一个in work的handler,是不是调用我们的这个handler,而handler不就是我们的这个请求处理器吗?是不是啊,说白了也就是从这一行开始,他就要去执行我们的请求处理器中相关的这个方法了。好吧,那么你具体怎么调用的?其实我不管我能定位到这一行,目的是什么呢?目的是我要知道一下这个家伙written到哪了,那么现在我们来对一下,是不是就远程到这个位置了,你从这地方去调的方法,那方法的返回值不就远程到这了吗?
05:24
有疑问吗?没有,好,那我们就来看看MV是谁啊,点一下你发现它就是一个model and对不对,那么我给你原创的这个对象他能不能接受啊,可以啊,说说来我们再回到我们的,诶刚刚的这个945号,好说说呢,我们就定位到了将来那个model and就到了这个位置了,好到这以后呢,我们要跟踪的就是看一看接下来这个MV它会怎么进行处理,所以说我们接下来要看的就是啊这一行下面的代码,那么你一行一行去看,肯定是比较麻烦的啊,因为我是知道他要怎么执行的,所以说呢,第一次大家就直接跟着我来走,接下来我们要来到什么呀?九百四十五行下面的有一个叫做959行,为什么来到这呢?因为他要帮我们去处理,我们的结果了,看到没有啊,这rap结果,而且呢,这个方法呢,他把我们的MV传进去了。
06:24
看到了吗?是不是传进去了?好说说了,你看我提前在这个位置加上断点,然后呢,我们点击这个按钮,让断点放行,来到我们的下个端点的位置来点一下,你看代码是不是来到这了,而现在的话呢,我们其实已经拿到了这个MV了,你看一下MV里面就有我们的模型数据,看到没有,这是我们的视图名字,而我们的模型数据是谁呢?模型数据就是我们的username等于什么呀?你看一下啊,Username等于是不是都在里面保存着呢?看到了吧?OK,那么接下来呢,他就要把这个MV的传到这个方法中来,我们直接点到这个方法里面,好,那么代码呢,我先让他随便加个断点,让他先停到这来,代码先过来,过来以后呢,我们再看到这个里面,还是我们的一个数据,你看到没有,MV里面没有变吧,对不对,还是我们的数据,那么来到这里面要做什么处理呢?大家注意啊,它要去调用一个re的方法,你看是不是又把MV传进去了。
07:24
对不对,为什么要传进去呢?你看哈,他要去从这个地方开始要去,哎,解析得到一个视图对象了,能明白这个意思吗?啊,解析得到一个试图对象,这是我们下个话题要去讲的,现在我们先提前给大家去说一下来吧,那我们就让断点先过来,过来以后呢,我们要进去啊,进到这个方法中,在这个方法中呢,这个位置啊,我先让断点过来啊,来断点过来,那么来到这我们看一下啊MV呢,还是我们刚刚看到的success,以及我们的U3M等于什么呀,阿达me没问题吧,就是这个东西是一直传过来的,那么传到这以后干什么事呢?注意了哈,他说我们需要去解析一个视图名字,然后呢,得到一个视图,你看这个尾用是不是这个类型的。
08:16
对吧?哎,这就是我们的视图类型,也就意味着它需要根据你的视图名字解析得到一个视图对象,听懂了吗?诶,解析得到一个视图对象啊好,所以说我们就来看一看它这个代码执行完了以后是什么效果,那我就呃入代码呢,往下走一行来往下走一行是走到这了,走到这以后呢,这一行就执行完成了,执行完成以后我们来看这个MV.get name是吧,他拿到的就是我们的get model internal这个方法看一下用到没用到。是不是获取到我们的model数据了呀,对不对?哎,把这些东西呢,传到我的解析视图名字这个方法中,最终拿到一个视图对象,我们来看它叫做什么呀,这个视图对象叫做internal resource,为熟不熟。
09:07
好像在哪听到过是吧。啊。听没听到过呀,你想想你的视图解析器叫什么名字呀?啊,视图解析器叫什么名字啊,是不是resource when serve啊,对吧?那视图解析器不就是解析得到视图的吗?对不对?哎,那我的a resource VI server解析得到的视图对象不就是a no s斯百吗?听明白了吧,OK,好,那么我们现在拿到的是这个视组对象,而且大家注意了啊,在这个视组对象里面,我们可以去看一些信息啊,来你看一下它有哪些信息呢?注意name是什么size,而且呢,他已经把这个URL呢给你啊,拼接完成了,看看是不是我们自己分析的那个过程,外部减音for下面的success JSP,你看是不是拼好了,看到没有。
10:17
看到了吧,OK,那么这个值怎么表示的呢?啊,其实就在我们这个视图对象里面呢,啊,它来表示的,你来找找啊。哎,你看这里面是不是有个URL啊。看到没有对吧,通过这个URL呢,来去表示的,诶,我们最终要去往的这个啊页面它的这个位置,好吧,那么拿到视图对象以后,接下来做什么事呢?来接下来他会执行这样一行代码,1225哈,他要把我们的模型数据拿到,然后呢,你看了哈,是不是试图对象去扔的,去渲染我们的模型数据啊,对吧,你你现在来想一想,试图对象其实说白了它最终指向的就是我们的一个JSP吧,而我们的这个模型数据将来是要输出到这个GSP中的。
11:08
对吧,所以说呢,诶,这个视图对象呢,他就要去帮我们去处理这个模型数据了,明白吧,来吧,那我们点进来,点进来以后呢,你发现这个家伙是个抽象的,那我们就得去找到具体的一个实现来,我们在这个方法上面CTRLT一下,我们能看到这里面好像就只有他能看是不是啊来吧,那我们就进入到什么呀?诶QT一下,我们进入到这个obstract维用里面,那么我们就能看到认的方法的一个具体实现,那么其实代码它就会执行来到我们的这个位置,来吧,我把断点的加到这断点,放心啊,好,你看先来到这儿,就是我们刚刚去的那个地方啊,来再走,你看是不是来到我们刚刚加断点的这个位置了,对吧,来到这以后做什么事呢?注意。这里面最关键的一行代码,这个断点我可以把它去掉一会啊,最关键的一行代码叫做它你看了哈,Render manager up model。
12:01
我要去输出你的模型数据,而你输出了这个模型数据叫做man的model是谁呢?你看它是把我们的model传进来,然后呢又把model传到这,最终呢,拿到一个man的model,其实说白了都是一样的,你看啊,这里面是什么东西啊,来U的me看到没有,是不是我们的模型数据啊,然后呢,这里面呢,也是这里面呢,一样的啊,代码还在这呢,我让他放行一下,你看一下这里面是不是还是一样的模型数据啊。对不对,哎,就相当于做了一个什么倒换啊,就是把这个map里面的数据呢,导到了这个map里面了啊,最后再把这个数据呢,传到我们的这个方法中,因此我们再点进去又发现又是一个抽象的,那么现在我们要CTRLT。啊,选择困难症是吧?哎,我选谁好啊,是吧?所以说这个时候我们就要去回想一下,我们刚刚带着大家所看到的那个视图对象叫什么来着,A德resource斯韦欧吧,OK,那么我们现在所看的这个过程是不是通过那个恩格S韦用调了一个方法,然后开始走的后续的过程吧,那么你就要时刻保证你所调入的方法一定是这个对象所能调到的方法吧,对不对?所以说现在我们走到了这个位置来render manage after model,那么我们看到有这么多抽象的以及13类,我找谁呢?诶,其实你要找的就是resource备用。
13:31
你跟别的能产生了关系吗?产生不了,所以说我们现在看的就是resource u来吧,我们进去CTRT来进入到S,那么我们就能看到这个方法的一个具体实现,然后在这个方法中的话,我们主要是看这样一行代码啊,180行来吧,我先要断点的,我来来到这个位置,他还是把我们的model呢传进来了,你看我们的model是不是还是我们的右色内的密啊,对不对,所是这个模型数据呢,是一直往后传的,传到这个位置以后呢,注意他要干嘛呀,他要把我们的模型数据暴露到我们的request的这个attribute里面,你看是不是。
14:14
看到request了呀,对不对,来吧,进去进来以后我们看一看啊,代码来到这儿来,我加上断点,先上断点过来,那么我们看这个model是谁啊,还是我们的username of me。对不对,那么他要做什么处理呢?你来看好了啊,我从map部里面迭代你的NTRY,迭代出来每一个NTRY,然后呢,拿到K,拿到V,看到没有来,我把这个过程呢,带着你走上一遍啊,你看来断点往下走好,第一个entry就是我们的username等于的密码,因为这里面是只有一个entry啊对吧?拿到以后呢,Get key来这个model name呢,其实就是我们的username,而这个model value呢,哎,就是我们的a me对不对啊,然后再往下看它判断这个等于空吗?
15:10
不等于空吧,不等于空,这个判断就是满足的,那么代码会执行到这儿,你看看这是在干啥。是不是把我们的模型数据啊,设置到了request里面了呀。对不对啊,所以说你看我们这个。翻越了。是吧啊,翻山越岭的对不对啊,终于找到了最想让大家看到了一行代码,那你说你都看到这行代码了,我们刚刚的猜测得到验证了吗?啊,好多同学脑容量不够是吧,说你刚刚猜测了个啥来着,得到验证了吗?得到了吧?哎,来不着急,接着往后看啊,一会儿还能再跟你们去。
16:03
解释一点你们心里面的疑问是吧?OK,把数据放到request里面以后,那你想放到request里面,接下来该干嘛呢?是不是可以进行转发了呀,对不对?好,那其实这个方法我们就不用再去看了,让他执行结束,怎么执行结束呢?我们点这个叫做step,就是结束方法的一个调用,来又回到你看我刚刚是不是从这个位置调进去的呀,那么结束方法调用这个就结束了,结束以后呢,来断点就回到代码就回到这儿了,这个不是重点,我们往下看。代码来到这儿干了件啥事情啊,获取一个request dispa,然后呢,注意哈,这个dispa pass我们需要来看一看,就是我们刚刚视图对象里面那个URL,你看到没有就不是,然后呢,他在获取这个呃,Dispat的时候呢,应该是把这个路径传进去了呀,那么相当于就是我们获取到了一个RD,就是我们的request dispat吧,那数据在这个位置绑定成功的转发器在这个位置获取到的,那接下来不就应该rd.forward了吗?
17:21
是不是转发了呀,在哪转发的呢?往下看呗。R forward来代码来到这儿,诶直接来到我下面啊,代码来到这,你看一下RD forward是不是在这放着呢,是不是啊好来注意,那么一转发是不是就去往这个JSP了呀,那么应该我们的页面中是不是就开始有结果了呀,那么大家来注意啊,现在我页面中,你看我点完以后有反应吗?是不是还没有中,还没有反应的吗?来接下来你看,因为我在这个位置呢,已经加上断点了,所以说呢,我只需要让这个断点一放行,因为我后续是没有再断,没有断点了吧,那么整个代码它就不会再停住了,刷一下就执行完成了,我们就来看这个效果,我一放行这个断点,我们看这个地方的结果啊,来放行。
18:11
看到没有?看到了吗?所以说那一行代码一结束,一转发,那么它确确实实诶就来到了我们的这个页面中,并且把这个数据就从你的request里面给它取出来了。听明白了吗?能理解了吗?OK,所以说呢,刚刚的这个过程。对吧?啊,大家第一次看啊,你也就能看个热闹是吧?啊,你不可能看明白他具体是做什么事儿的,这个你肯定得慢慢的去啊,对整个的框架有了一定的了解啊,就是你用的次数很多的情况下,你才能把它看得懂明白吧,啊但是呢,刚刚那个过程我希望大家能听懂的是什么呢?就是里面我提到了几个东西,一个是视图,一个收解析器,对吧,最重要的就是让你们看到了那行代码,Request set tribute。
19:05
还记得吧,对吧?嗯,就是我们的猜测,我们得到了验证,所以说现在我们就不能把它叫成猜测了,而是要造成结论,对吧?我得到验证的,我就可以把它当成结论来对待了,所以说你就记住你放到model and中的数据就会给你存到request预上中。但是呢,这些工作不需要我们自己去做,人家的底层帮你去做的,听明白了吗?理解了吧,OK啊。
我来说两句