00:00
下面呢,咱就通过源代码来分析一下VC这个运行流程,我们为了更清楚的来说这个流程,我们新建一个动态的外部工程spring。MVC3。我们把这个环境呢再搭建一下,首先我需要架包,我们找到spring的架包一盘。Java open source,找到spring。我们直接导入所有的record ctrl c。然后呢,我需要来配这个web文件是吧,Ctrl shift f。奥斜杠找那个depat。路径pass下的spring mvc点苗。
01:02
CTRLC拦截所有资源。在src下新建一个。Spring mvc的配置文件next导入context beans还有哪个啊?MVC对吧,Next finish。新建一个包,Com点硅谷点spring mvc。第一步自动手放的包,Com点艾特硅谷VC是吧,然后呢,配置试图解析器对吧。B class。Internal。
02:02
Resource view需要配两个属性,一个叫前缀。Prefix value web infos。这来配一个后缀,Property value.jsp。视图解析器,这写错了是吧,视图好的,有了这样两个配置之后的话呢,下面我们就可以来写这个hello world了。我们这个程序呢,还挺有意思的是吧,我们以hello world开始,以这个hello word结束,不过开始的时候纯是一个hello word而结束呢,我们是为了说这个MVC运行流程是吧。写一个hello a hello world hello。
03:06
新建一个hello world这样的一个类。Request controller public street hello retain,一个success out。Success request mapping,然后呢,我们需要新建一个S。文件夹吧,是吧,这下边来新建一个success JSP。H4,好的,走起看看效果。
04:14
先跑起来是吧,然后的话呢,我们来说hello world点一下。哎呦,Views差点什么呀,大家看我这个里边,我在映射的时候的话呢,这块没加斜杠,我返回这块的话,我也没加斜杠吧,所以说连起来就是view success.JSP保存。重新启动就可以了。刷新找一个好的,这个效果是OK的。现在呢,我们在这个基础上去说spring VC的运行流程,我们来看这个图。我们首先说这一阵。说说这一招,我请求匹配这个没问题是吧,就是说我现在啊,我配的是可以响应任何请求斜杠嘛,好,那我们先来看,现在的话呢,我并没有配这个mvc default handler OK,我们看一下效果。
05:11
回来注意,我写一个hello world two,走一个,大家看,这个时候会给我一个404吧,同时在我控制台打出一个no mapping fund for http request with uri。就是我们这样的一个效果,这个呢,就是这个流程发请求过来,然后看Mac里边有有没有对应的这个映射,没有也没配default handler,那于是呢。就控制台做一个打印,同时给了我一个思慕页面是吧。好的,下边那我如果要是有配这个mvc default solid handle这个时候的话呢,就帮我去找这个目标资源,当然了,我刚才请求这个,呃,这个值啊,是没有的是吧,我现在我来整一个,有的比方说我在这个。
06:10
Web content,下面我来写一个HTML。呃,ABC.htmlh4HTML配置保存,大家看我如果去访问这个。ABC.hkl会怎么样走,我们看也是什么呀,也是这个no mapping放的吧,好的,现在我如果配了这个,配了这个。Mvc default handler,再看效果。周琦。这个时候的话呢,这个页面就会给我这叫什么呀,这就去找目标资源是吧,看这个过程诶没有对应的映射,因为我是要请求ABC.html没映射过是吧,这个时候要看是不是配了这个defa handle,要是没配的话。
07:15
控制台打一个信息给我一个四乘四页面,如果要是配的话,就去找这个目标资源好了,这一圈呢就完了。下一圈比较重要,如果要是有对应映射的话,我们先需要由handler mapping获取一个handler execution对象,Handler mapping跟handler execution chain都是神马东西。再往后看一下哈,下一个呢,我们要获取一个handle adapter这三个对象,在我们spring mvc生命周期过程中啊,思路MVC运行过程中是三个非常重要的对象,好在下边就是掉了这个拦截器的pre handle方法,好,我们先看到这儿回来,现在呢,我需要给它debug一下,Debug之后的话,我为了看那个源码,我怎么办呢?Hollywood。
08:11
11行,我加上一个断点。好,回退。点一下,哎哟。这个断点我已经加了呀,哎呀。怎么回事,这个时候的话呢,这样的,我要是加了这个mvc default handler的话,我一定要加哪个啊叫MVC。Drive吧,这要是不加的话,那个request mapping就不好使了,对吧,好走起。回馈点。好的,我们看这个时候呢,停住了,我往前去翻这个源代码,我们找到depetol,我们看到do盖的方法,这应该是很靠前的一个方法,去关联源代码哪个呀,MVC关联。
09:11
找到spring。E盘,Java open source。Spring。Lips mvc。Sources。点开好的,哎,这个时候这个代码停住,这样往前来再来。再来到这个位置的话呢,呃,在这个方法里面,PA do dispatch,这个方法里面包含了这个核心流程,我们往前看。往前看,我们看这个方法呢,叫do dispatch,传递对象request response,往后翻,往后翻我们看比较重要的一步,哎。
10:01
这一步916行,我会先获取一个map handler,这个map handler呢。就是这个叫handler execution chin类型,Handler execution chin是什么呀?叫处理器调用链是吧?叫处理器调用链,我们点一下它。点它看看这个处理器调那是个什么东西啊。过来看johndo。他是叫。处理器调用量。这里面包含了。处理器对象,以及跟这个处理器相关的。Intercepts就是拦截器是吧,就是说我在调处理器目标方法之前,我可能需要调拦截器的方法,之后的话呢,可能还需要调拦截器的方法,那我现在这个handler execution chin实际上就包含了。拦截器,还有目标处理器以及目标方法。
11:04
我们点过来看看是不是这样。代码这拿过来哈,刚才我们说停在了这个916行,我们看一下这个map的handle。Map的handler拿一下,哎,在这点开,这里边的话呢,包含了两部分内容,我们说一部分叫interceptors,那我现在的话呢,我没有额外的去配interceptor,它只是有一个默认的interceptor,还有一个handle,我们看。是不是说hello,这个hello方法呀,是吧,所以说这里边的话呢,我们说了一个叫。什么东西像handler execution chin,这里边儿包含了拦截器以及。Handleler,还有那么多方法,好的好的这块还有一个比较关键的就是我这个。Handlercution这是如何获取的呢?我点一下这个get handler点过来,我们看到这个时候我用的实实际上是这个叫什么呀?叫handler mapping获取的,看到了吧,Handleler mapping叫handleler映射,用那个handleler mapping我来获取这个。
12:17
Handlecution,如果要不是空的话,把它返回,那问题出来了,这个handle mapping是什么呢?我点一下,我们看它的账号do。惠来。照doc它是什么呀?它是,呃,这个对象呢,定义了这个请求到处理器之间的映射,看见了吧?哎,定义了请求到处理器之间的映射,就是说。我想把那个请求找到处理器的话,就需要用这个handler mapping,看见了吧?好,代码到了这种情况的话,我们刚才到哪了。
13:00
啊,代码刚才到这到这了是吧,我再回来这块的话呢,有可能会返回这个什么呀,有可能会返回这个叫。Map handler,现在我们可以来提一个问题,我如果我发这个请求是没有经过映射的,你觉得我这个map handler是不是空呢?我再说一遍,如果我发这个请求是没有经过映射的,那这个map的handler是不是可以为空呢?我们试一下。这已经过了哈。这经过了,好了,我们看它,我整一个hello hello world two,走起。917行也打一个断点走。走。走这块的话呢,循环大家看这个时候呢,返回这个。Map的handle并不是空,就handle ex它不是空,为什么不是空呢?因为啊。因为啊,我在这个配置文件里边,我配了什么东西啊,我配了这个叫呃,MVC,呃这个这什么default service handler,我把这个助调的话,我们能够看见这个效果。
14:14
停掉我的助教一下,我们看我们看看啊。保存。再进行debug。刷新。这个不对哈,这个不是。刷新好的我们注意看,走起我们这块的话呢,我们看一眼这个handler mappings都什么东西,Handler mappings。Death。往后翻有一个这个属性叫handler mapping,点开。注意到handle mappings这边它有什么呀?有个b name ul handler mapping,还有一个default not handle mapping,看到了吧,这个时候的话呢,是只有他们俩。
15:10
好了,走。走这个时候的话,我们看这个返回这个map handler是个空是吧,就是说我没有对应的映射,于是。下一步怎么了,这个就进行return了吧,方法就进行return了,我们给到的就是一个404页面。是吧,好了我们再回来,这里边呢,有一件比较神奇的事情,就是我要是把这个加上的话。我这样写。这样都加成,我要是把这个加上的话,它会怎么样。为什么它返回就不是空了呢?不是空,那个是怎么回事儿呢。我们也来做这个请求,走起,哎。
16:03
过来我们想看一下什么呀,我们想看一下目前的这个。Handle myins。点进来。点开我们注意这个时候的话呢,这里边是有了呃,三个对象,其中有request mapping mapping看见了吧。它是干啥用的,这个的话呢,是搞那个request mapping映射的,还有一个叫simple ul handle mapping,这个就是去搞那个。静态请求的,就是说我这个时候啊,我要请求那个ABC的HTML,靠的就是它,那现在呢。我们看一眼穆前的是谁啊,目前的是。Request mapping,这个时候这个值应该是空。空没有吗?好,下一步看这个时候的话呢,这个HM应该是b name这个也是空。没有好,再下一个,诶我们注意到这个时候的话呢,是simple URL handler mapping过来,这个时候它不是空,为什么呢?这个时候他认为你请求的是一个静态资源。
17:08
懂了吧?这就是我们配置这个MVC。Default service的作用。配置这个的作用好走起。好的,这个时候不是空,不是空的话呢,但他也不是一个什么呀,他也不是一个正常的请求,那我们这个过程的话呢,我们就过了,我们想看带正常请求的这个走起好了。这个时候我们这个代码呢。这块看一下吧,这块看一下吧,这个时候啊,我们这个呃,Handle excution,这应该是由谁获取到的,由我们这个叫什么request mapping handler mapping能理解吧,因为你搞的不是个request mapping映射吗?这个时候它不是空看到了吧。回来好,回来,回来之后的话呢,下一步很关键,Q 23行,我们会来获取一个handle adapter。
18:02
好了,这个handler adapter怎么解释它?我们下一步我们想看一眼这个handler adapter adapter是什么意思啊?叫适配器,我来问大家,我们在什么情况下接触过这个适配器呢?举一个例子啊,某个同学啊,这个笔记本的这个。网口可能坏了,然后的话呢,我需要通过USB去连网线,USB插不上网线呢,是吧,就用USB口怎么办?这个时候我会买一个适配器,这个适配器能够诶一边连着这个USB口,另外一边的话呢,连着网线,它就是一个USB转网线的一个。适配器。那我现在的话呢,我实际上到了这个就本23行的话,我们同学可能想,哎,该轮到我去掉目标方法了吧,实际上在调目标目标方法的这个过程中,还要发生很多很多事情,比方说。
19:01
表单,表单数据类型的校验,数据类型的转换。格式化,再比方说我们使用那个http message converter,哎,这样的一系列事情交给了什么呀?交给了这个handle德适配器,当然他最终会去调目标方法。懂了吧,这就是我们说的,这个叫handle adapter,我们看一眼它来。叫ha,这里边的话呢,我们能够看到。Ha打开,哎,我们比较熟悉的是什么呢?是这个叫。Message converts在这个里面,我们前面我们搞过这个东西是吧,还记得它吧,那我们还看见什么,还看见那个叫什么AB,我们实际上的话呢,我们那个表单。到B的这个赋值已经。以及这个参数的这个复制过程,我们靠的是web data b,实际上web data b这个初始化过程这块的话呢,也有对应的属性,看到了吧,行不再一个一个说了哈。
20:06
然后下一步往后翻,往后翻,诶到了939行。Apply这一步的话呢,是去调。拦截器的pre handle方法,点进来看一眼就知道了。看掉了拦截器的。什么方法呀,Handle方法回来。好的,再下一步。九百四十五行掉了目标方法,为了说这个调目标方法的话呢,就这一行完事之后啊,会到哪呀,会到这好了,返回一个model view,再下一步。这一步954行,掉了什么呀,掉了。Post handle动方法,调用拦截器的post handle动方法,好,再下一步我们看959行处理视图点进来。OK,这块的话呢,我们要看是不是有异常,如果有异常的话,怎么处理的,有异常大家看这一步处理异常什么处理啊。
21:10
异常解析器啊,Handler exception recover,因为我这边没有异常,我们看一下就可以了哈,好,下一步呢。处理视图有个render。好了render,一会我们点进去看啊,我们再往后再往后翻,我们看到在这块的话呢,掉了拦截机的使用方法呀,叫。After,看到了吧?这个我们在讲兰亭系的时候呢说过。好,我们再看如何渲染视图的,点进来。哎,我们先会搞到这个。六对象怎么搞的?使用视图解析器看到了吧,这个过程的话呢,需要说一下。对,放在这是吧,放在这回回退读到view以后,我们需要去渲染视图,调到view的的方法点进来CTRLT。
22:06
第一个再来我们看用的是266行,叫re mer output model,再点进来CTRLT,我们现在用的是internal resource view。好了,这个时候我们看能看到页面转发的代码。Requestpart往后翻rd.forward行,这样的话呢,就是整个的流程好了回来目前还是。先过。调pre handle方法,调目标方法,好回来去调post handle方法,然后呢处理视图。呃,处理视图。要干什么呀?解析视图就是把这个逻辑视图变为物理视图,点进来我们看到这块的话呢,要返回一个view这块,我们会看到这个view view reserve,就internal result view,我们配的那个是吧,过来。
23:05
渲染视图,我们看到了这个呃,Request for的方法,再过来调用拦截器的。After completion方法,这样的话呢,整个这个过程就完成了,大家可以把这个过程像我这样呢走一下,这个对你理解Mac非常有好处。好吧,重点去理解一下这个handle mapping handle excution Che handle handle adapter,以及我们这个视图解析器,还有这个异常解析器,哎,等等等等过了。
我来说两句