00:00
大家好,我是上硅谷Java意义学科的韩延冰,接下来和大家分享一道面试题,这道面试题是简单的谈一下spring Mac的工作流程。我们都知道spring在处理模型数据呢,有两种方式,第一种方式是将handle方法的返回值设置为model and view,第二种方式是在方法的入参里边传入map model或者是model map,当然了返回值还是string类型,不管是将方法的返回值设置为model and view,还是将还是在方法的入参里边传map,传model或者是传model map spac都将转换为一个model and view对象。那下面啊,我们就把这个来测试一下。处理方式一和处理方式二最终的结果哎都是一样的,C最终呢,会把这个模型数据呢,给它放到request域里边,我们从REQUEST1里边呢,都可以拿出来,我们来看一下。在第一种方式这块呢,Mode的view这一块啊,我往mode的view里边放了一个user,诶这个值能是admin,我在这个成功页面呢,从request域里边取了一下user,我们来看一下效果,刷新一下来点test more than view,哎最终呢,能拿到in,那第二种方式,哎,我们传的是这个map。
01:16
在这个方法入参里边传了一个map,最终呢将这个模型数据,我们是用了一个in play,把in play放到了这个map里边,那最终呢,它也会放到request域里边,我们也来测一下。哎,Test map,最终呢,我们在request中的用户呢,可以拿到这个play,那么。这个流程到底是怎么样的呢?哎,我们来看这样的一张图。诶,当我们向这个smartc发请求的时候,诶,当我们发送请求中呢,由这个中央控制器,也就是前端控制器dispa,也就是我们在web的叉ML里边配的这一个dispatch so,哎,由他。拦截我们这个请求,然后呢,调用这一个对应的处理器来处理,我们来继续看这个流程啊,第一步,当我们PASO,也就是中央控制器接到请求之后呢,它会调用处理器的映射器,找到对应的处理器,也就是我们这个handler mapping,如handler mapping呢,会得到一个handler excution change对象,这个对象里边包含了所有的处理器以及所有的拦截器,就是这个对象啊,里边包含了所有的处理和。
02:22
拦截器,它返回给这个dispa so,然后这个handler excu,然后干什么呢?第四步会返回处理器的一个示威器,就是handler adapter,就是它会返回这个handler adapter处理器的适配器,也就是说我到底调用哪个处理器来处理请求得。找到这样的一个适配器,适配器当然了啊,返回给这个中央处理器。再往下。拿到这个呃,处理器,那适配器之后呢,我们就要当然了,就要调用对应那个处理器来处理请求了,就是调这个handle来处理请求,那处理请求之后呢,最终会返回model and view,你像我们这一块,当我们这个点这个超链接的时候,不管是第一个还是第二个,比如以test map为例,点test map时候呢,最终呢,诶。
03:06
处理器适配器会找到这个spring handle的这个处理器,呃,调用这个test map这个方法来来处理我们的请求,最终呢,虽然我们里边传的是一个map啊,最终呢,它还会返回一个model and view对象,等一会儿呢,会给大家通过源码的方式来给大家走一遍,返回这个model and view,当然了这一块啊,如果你这个处理。气函数里边出现了异常,它就是呢,也会返回一个mode view对象,也就是说不管你是否发挥异常,发生异常啊,都会返回一个mode view,那这个mode view对象里边就包含了模型数据,比如我们new的那个play,也包含了所有的视图啊,所有的视图,比如我这块啊返回的success,这就是一个视图名,哎,这这模型more的view里边啊,包含了模型数据以及这个视图。好,再往下,那我拿到这个中央处理器,拿到摸的view有对象之后呢,诶,第八步它要调用我们的视图解析器来解析得到视图,视图解析器就是我们spring Mac配置文件里边配的这个视图解析器叫internal resource view reserve就是它由这个视图解析解析得到视图,嗯,得到视图还是返回我的中央处理器,那得到视图之后,第十步我就需要调用视图里边的render方法来渲染视图,诶渲染视图也就说我从这个request,呃,这个呃,把它放到request域里边啊,最终呢,我到页面之后呢,呃。
04:23
到最最终的这个JS页面,然后呢,就能从页面里边得到。模型数据也是我们那个in play对象,这是整个的一一个过程啊,SPA的一个流程一到十一一共这么多步,那下面啊,我们就通过源码的方式给大家把这个过程呢给走一遍。好,那现在我们就以这个test map为例,我在第38行呢,来打个断点,然后我们来debug运行一下在。开会,我们来debug运行。当然啊,我看一下这个断点里边有没有其他的断点,我把其他断点呢先清空。好,这里边有好多断点来啊,我我先把它都清空,我们来重新打一下断点,在38行打一个断点,好,现在呢,程序在debug运行,下面呢,我们来发一个请求,来点test map。
05:08
好。诶,现在呢,我们停在了debug透视图,现在停在了第38行,好,我们来往前翻,找到我们的中央处理器dispat。然翻PA里头呢,有一个九百四十五行,我们来找到那一行,哎,就这一块读PA方法好点开它这一块呢,没有导源码,我们来导一下源码啊spring Mac外Mac里边的源码好来们找一下。跑下这个源码。啊来在我的圆盘呢,在我的G盘。这块有一个大数据。Spring,好。Web Mac找到我们的源码,Web Mac的一个源码。South。上面这个啊。打开OK,好,来找到我们的九百四十五行,九百四十五行是干什么呢?就是调用我的目标方法这一块啊,来九百四十五行我们来在这打个断点。
06:05
然后打个断点之后呢,我们来往前翻。啊,年939这块啊是调用。这个拦截器的普hand方法,那这个我们就不看了啊,诶,我们来找到这个map的handler,诶我们选中它往上翻这一块啊,这块这个map handler得到就是handler def就是我们的适配器,929行来选中它,当然呢,这块啊,有个哈,这就是我们的适配器,那适配器呢,我们再往前翻这块map map handle了,看怎么得到的map handle就是我的handler execution对象,里边包含了所有的处理器和拦截器,好,我们来把919行也打过短点,那怎么得到的这个handle了execution change对象呢?哎,我们这个通过这个图发现是通过handle了mapping才得到的handle了excu对象,那我们看一下怎么来得。这个handler mapping在哪来啊?我们往前这块呢,调的是get handler这个方法,所以呢,我们来打开它的实现在这块啊,这块有handle了,Mapping handler mapping HM,然后这块有循环便利,它在1101行这块hm.get handleler得到的是我们的handleler excu change对象,在这一块啊,得到了一个excu change对象。
07:11
好,那得到这个之后呢,我们来,哎回去回去,哎,这是往前九百四十五行这块是调用目标方法,往前这块分别得到handleler adapter,啊handleler正对象,那我们往下来945,再往下来第959这一块呢,是处理结果,我们来点开它。点开它之后呢,来看这块啊,就是来判断是否有异常了,刚刚我也说过了,根据这个图哎,不管你是否调用目标方法的时候,哎,这个handle de适配器找到对应的处理器调用目标方法时候,不管你是否有异常啊,都会返回一个摸端的没有对象,那这块在这块呢,就是判断是否有异常,当然了,我们刚刚这个方法没有异常,所以这块我就不打断点了啊,如果你这块有异常的话,你看最终呢,得到的还是MVMV呢就是我们的摸的无有对象,就是这个MV啊,它就是一个mode端的V对象,我们刚刚945瓦,你选中它有这块,选中MV往上翻。
08:02
它就是一个摸的对象啊,就是它啊,就是它好来再回到刚刚的位置好这一块。哎,如果没有异常,哎,如果这个有异常得到的还窄,这个模MV对象当然了没有异常,哎,我们来看,如果MV不等于闹在这块呢,第1001张啊,这块是渲染视图,渲染视图哎,我在这来打过断你我们来点开它。点开它在这块啊,这块就是解析视图名了,就是解析我们那个success success好得到这个真得到这个view对象,第1204啊,得到view对象,那得到view对象之后呢,哎,来再往下翻,在这个一千二百二十五行用view.r的就是得到视图了,我们该渲染视图了,一千二百二十五行好渲染视图这里边呢,我们来点开。点开之后呢,这块啊,抽象方法,诶,所以呢,我们需要CTRLT一下。唐T找到这个abstract view。啊,找到它,找到它之后呢,这块注意啊,有一个range Mo,呃呃,Render Mo的output model这块呢,我们就是将要输出这个模型数据了,我们来把这个打开,打开之后呢,这块我们还得CTRLT找到我们那个,因为我们用的是internal source view reserve那个视图解析器,那解析到的视图就是internal source view,点开它,点开它来往下翻这一块啊这块有一个什么呢?Ex暴露我的模型数据作为request一个attributes来在这打个断点,我们来啊把它打开,打开之后呢,为什么我们map里边。
09:23
那个数据会放到request域里边呢,因为这块啊,要遍历map里边那个值,诶370行,诶遍历完之后呢,在这块啊,有一个很关键的地方,request.set374行这块呢,就是将map里边我们放的那个employee放到request域里边,放到request里边好,我们在这也打个断点,然后回去。第180行呢,是将模型数据拿出来放到request词语里边,再往下,诶第100。89行这块呢,就是获取转发器RD获取转发器再往下这块。209行就是进行请求的转发,也就最终呢,就去我们的success.H这个JSP页面,哎,这是整个的一个过程啊,我们先过,然后呢重新再来一遍。
10:09
好啊,都过了好,哎,我们把这个该停的地方呢,都打了断点,下面呢,我们再来发一次请求,回来来点一下test map。好,现在呢,啊,这个断点呢,就停在了第900。第916行,916行这块呢,这个map的handle了,现在呢,还是闹还是闹,那么现在来过走走完之后呢,在这块啊,就是由HM,就是我们的handleler mapping,因为handleler mapping呢,它是一个接口,所以我这款HM是request mapping handler mapping它是它的一个实现类,就是说这是我们的这一块啊,请求到到中央处理器之后呢,调用处理器的映射器,找到处理器,也就是调用我们这个handler mapping来得到返回这个handler execution对象,这就是到第三步了,我们来。走一下。我们先走一步啊走一步诶来看这块呢,就得到了这个handle了CU对象handle了CU,诶就得到了它,这就是我们这个,呃,图片的这块啊第三步,那这个里边呢,包含了所有的处理器以及这个拦截器啊拦截器啊,那当然了,这块我们也可以自己看一下啊handle德了,嗯,找到这个变量handle德ler,看里边有没有这个处理器。
11:10
韩德,诶,来点开。哎,Handleler,诶里边呢,有supreme handle了,这就是我们那个处理器啊,我们的处理器,因为它里边包含了所有的处理器,还有这个拦截器,好,这是这块得到它,那得到了之后呢,下面我们干什么呢?该得到什么呢?通过这个处理器适配器呢,调用这个具体的一个处理器,也就是我得得到这个handle adapter了,得得到这个处理器了,哎,硬是这个处理器的适配器,好来再过。过了之后来看这块就是handler adapter,我再走的话就得到了这个handleler adapter,就是我的这个处理器的一个适配器,就在这块,好诶下面呢,再过,那过完之后第九百四十五行MV,现在是闹我这个。要用这个handler adapter呢,调用handle来执行目标方法,也就是我们这个处理器里面那个test map那个方法了过。好,诶,来到了我们目标方法test map,那现在在这个方法里边呢,我们就往这个map里边放这个数据了,放了个user case user值的就是一个play对象,好过那过完之后注意往上翻,你来看我们这个MV,得到这个就是一个more than的view对象,More than view对象里边呢,有我的视图名是success模型数据呢就是我们放的那个play k是U的值是play。
12:19
就放到这里边了啊,在map里边好下面呢,再过下面呢,该这个处理结果里边的渲染视图了,哎渲染视图那我这个拿到之后呢,哎,这个得到这个视图嘛,视图解析器解析完之后呢,得到这个视图,哎这个视图我们来往上翻一下啊。啊,这块这渲染视图还没呃过过了之后才能往上翻好view,你看这个view,呃,View,这个gstl view是为什么啊,这个STL view跟我们那个s view呢,嗯,它这个是它的一个子类,它继承了,它继承的了,因为我这个导GSTL炸包了啊,所以呢是这个gstl view可以这给你搜一下啊ctrl shift的T有GSTL。没有。诶,它这个继承了s view,由于我这个现在这个工程里边导了这个GSTL的炸包,所以呢,它默认装备是g s TL view,嗯,其实呢,这个Internet s view能干的事他都可以,他都可以做啊,他都可以做好啊,我们再回到我们刚刚的位置,刚刚位置再回来,好在这块呢,我得到view之后呢,下边就是渲染视图了,我得把这个模型数据呢,就能响应到用户啊,所以呢,哎,来再走在这之后这块啊,我就是要要输出这个模型数据了,再过过完之后在这块我要暴露这个模型数据,放到request域里边走。
13:31
好在这里边注意啊,我要往request里边来放了这个map,哎,这块这个传过来这个便利,这个map entry里边,就是我们在map里边之前在处理器函数里边放的这个in play key后边是值,后边是值,好下面我在这块走一步啊,走一步之后我们来看require里边放的这个model name,就是我们在map里面放的那个key model value,就是我们那个play对象,所以呢啊,确实它最终呢,放到了request域里边,好来再过。哎,再过过了啊,过完之后呢,下边189行就是获取转发器。
14:03
好,209行就进行请求的转发,好这过完之后呢,我们在页面上就从为快速里边就可以拿到。我们那个模型数据了,这是整个的一个spac,一个流程啊,一个流程,我们再对这个组呢再说一遍啊,请求过来之后呢,先到达我们的per so列的中央处理器,然后这个中央处理器呢,会调用这个处理器映射器来找到处理器,就是候由我们这个调用这个handler mapping的一个方法来得到这个handler execution对象,这个对象里边包含了所有的处理器以及所有的拦截器,然后再往下是我得到这个处理器的一个适配器handler adapter,由这个handleler adapt去找对应的一个处理器来处理我们的请求,诶下边这个处理请求调用我们处理请求里边的方法之后呢,得到一个MV,就是摸的的view对象,得到Mo端M对象之后返回中央处理器,中央处理器会这个通过我们配的视图解析器,就是在smart Mac配置文件里边配的视图解析器叫internal resource view reserver得到视图叫internal resource view。得到视图之后呢,调用里边的方法来进行渲染视图,渲染视图最终呢,将我们模型数据在用在这个页面上给用户呈现出来,相应的用户好,这是我们这个SPA的整个流程,哎,我们就说到这里。
我来说两句