00:00
好,然后咱们的最后一个呢,就是在这儿给大家总结了一个spring VC的运行流程,然后我我说然后大家看,然后看对不对就行,OK吧,好,当然呢,我也希望大家呢,通过咱们在这儿所写的这个执行流程啊,然后自己呢,能够去总结一份,你自己能够去总结一份啊,因为咱们以后面试的时候有好多问题,可能都是会问一些概念性的问题,对吧?像什么什么是买be,什么是spring,什么是spring VC,那你怎么回答是不是啊,你怎么回答,你说我提前去百度百科上去搜一下对不对,那你百科百度百科上搜的这些东西大家看过没有啊,有的时候那里面好多词咱们都看不懂啊,是不是啊,你看不懂的时候你怎么办?你要么你就不看了。是吧,你要么呢,你就会把这个词儿,然后重新在百度百科里面再搜一次,是不是啊对吧,那不就相当于我是面试官,我问你问题一样吗?我问你这个是什么,你呱呱对吧,给我说了半说了一说了一堆,然后呢,我有几个词儿我听不懂,那我不还得问你是啥意思吗?万一我也听不懂怎么办,是不是吗?
01:14
不相信有这种情况是吧,不相信就算了啊啊行,那大家以后遇到这些问题都怎么办?都百度百科先查一遍,先背下来。啊。啊是吗?啊,大家大家怎么办呢?就比如说这些概念性问题,你怎么办,就百度百科查呗。啊,你面试的时候,你当着我的面,你拿出来手机查,这有点不合适吧?啊,你是在侮辱我吗?啊。行啊。
02:05
什么是面向对象啊?啊,那你百度给我百度百科一个啊,什么是面向对象啊网呢,面向对象是吧,好来。你告诉我面向对象是软件开发方法,一种编程反射。什么叫做编程反射?面向对象的概念和应用已超越了程序设计和软件开发,为什么超越了呢?扩展到如数据库系统交互式界面,你用过交互式界面吗?然后应用结构,应用平台,分布式系统,网络管理结构,CAD技术,啥叫CAD技术?然后人工智能,你你涉及到过人工智能吗?然后面向对象是一种对现实世界理解和抽象的方法,对吧?然后现实世界理解和抽象有什么区别?
03:16
然后是计算机编程技术发展到一定阶段的产物,它发展到了什么阶段的时候,然后有了这个产物呢?对吧,好,然后评说老师,那我会啊,我面向对象,那不就万物皆对象嘛,对不对,那你说的废话对吧?现在没听说过加va的人都知道万物皆对象,那你这说的等于说没有,等于说跟没有回答一样的效果,是不是啊对,所以说刚才我说的大家都听不明白吗?就是你说你回答问题一定要有总结性啊,你不能说你回答了一个问题,引出来了更多的问题,这听不懂吗?听听得懂咋的不说话呢?他感觉这好像就是这个就不可能在你的生命中就不可能会出现这种情况一样,是吧。
04:06
所以说呀,有些东西建议大家呢,就是从用自己的话呀,把它给描述出来就行,我也跟大家说过,你如果说你不知道这个东西是干什么的,你就从它的功能和特点去说就OK,知道吧,知道吧,啊行,然后下面大家看spring VC的执行流程啊,用户向服务器发送请求,然后请求被SPAVC的前端控制器dispatch of that所捕获,因为咱们的dispatch of that咱们是不是URL patternon设置的是斜线,所以说它会对我们当前所有的请求来进行处理,是不是啊,啊行,然后再往下dispats of that,然后来对请求URL来进行解析,是吧?然后URL解析完之后呢,得到咱们的请求资源的标识符uri,就是统一资源,统一资源定位符嘛,是不是啊,然后再往下判断咱们的uri对应的映射,看存在不存在,怎么来看存在不存在。
05:07
咱们刚才是不是讲组件的时候讲了一个handler mapping,对不对,对吧?这个东西不就是将咱们的请求去匹配它的请求映射的嘛,是不是啊好啊行,那它就存在两种情况啊,第一种情况存在的情况,第二种情况是不存在的情况,那不存在的情况咱们一般咱们用到的都是存在的情况,而且其实我们需要来处理的,咱们就是要把我们当前的请求找到一个相对应的请求映射的,对不对?那如果要找不到的话怎么办呢?大家看好好,这个时候咱们需要再判断一下是否配置了mvc default solve handler这个东西都认识吧,对不对?默认的solve处理静态资源,如果说他要没配置的话,那我们当前所有的请求只会被谁进行处理,Dispa solve处理能听懂不好,OK,那所以说这个时候咱们的控制台来报映射,找不到客户端来展示404大家。
06:07
看,这就是我给大家截的图,然后大家看我现在来写了一个请求,叫做test,哈哈,能看懂不,能看懂吗?好,存在不存在呢?No mapping for get privacy test,哈哈,然后我们当前报的就是404NOT found,能看懂不?这是我们页面中的这个问题啊,好,然后下面大家再看来啊,如果我们当前有配置咱们默认的solvele,那大家那大家说这个时候咱们的请求是怎么被进行处理的?首先咱们的请求发送过来之后,是要被咱们的dispatch solve that进行处理,对不对?然后处理完成之后,然后怎么办?是不是如果说他找不到相对应的请求映射,是不是会紧接着交给咱们的默认的solvele来进行处理,对不对?那如果说咱们当前访问的是一个静态资源,那咱们通过默认的solvele能找到相对应的资源,那咱们就可以访问,那如果说找不到的话,那咱们的客户端是不是同样会报404是不是啊,好,那大家看,那因为我们当前咱们的SPAVC中的,咱们的VC中用的是不是有日志功能,所以说在这个地方大家来看一下咱们的日志输出的咱们当前的get spac test,哈哈,没有,那上面这个是由我们的dispartch solve that来处理之后找不到报的是这个错,如果说我们当前默认的solve that来处理的时候,找不到大家看报的是这个是default http request handlera,能看懂吧,哎,是这样的啊好,这是他们之间的一个区别啊,当然咱们的页面中是不是也是同。
07:51
样是404对不对,对吧?好啊,行,那下面大家再来看看啊,这是一种情况,这A是一种情况,这B是一种情况,OK吧,好,如果说存在的话,则执行下面的流程,大家看,根据uri来调用handler mapping,获得handler配置的所有相关对象,什么所有相关对象啊,大家说这东西就是咱们的执行链,知道不就是咱们的调用链,大家说什么叫做所有相关对象?那不就是咱们的控制器方法和咱们的拦截器集合以及咱们当前的拦截器索引吗?是不是调用链里面不就这三个方法吗?大家说对不对,对吧?好,OK,然后最后呢,以咱们的一个调用链执行链的对象来进行返回,好,再往下dispatch of that,根据我们所获得的handler来选择一个合适的handler adapter。
08:51
因为我们刚才咱们看源码的时候,咱们就说了,咱们的handler adapter也是拥有各种不同的类型的,比如说咱们刚才咱们所看到的就是request mapping handler adapter OK吧,好,OK,来,再往下,如果成功获得了handler adapter,此时将开始执行拦截器的谁pre handle方法没问题吧?好记好啊,是先执行它,再通过handler adapter去调用谁啊,咱们的控制器方法啊,所以说正向来执行pre handle方法,然后再往下来提取request中的模型数据填充到哪儿handler的入参,也就是行参,Handler指的就是咱们的控制器方法,能听懂不?好,OK,来,再往下开始执行handler,也就是controller方法啊,处理请求,在填充handler入参的过程中,根据你的配置spring呢?
09:51
将帮你做一些额外的工作,就比如说HP message convert,将请求信息转换成一个对象,将对象转换为指定的响应信息,大家说这东西咱们学过吗?
10:08
学过没有学过,咱们讲过这里面的两个注解和两个类型是不是对吧?好,然后这两个注解和两个类型,那分别对应的一个注解和一个类型的请求和一个注解和一个类型的响应,对不对?请求的话是将咱们的请求报文信息转换成Java对象,而我们的响应是把咱们的Java对象转换为咱们的响应报文,对不对,对吧?好,OK,来,再往下数据转换,对请求消息来进行数据转换,如string转换成in转换为double,这是不是?咱们刚才也说过是不是啊,好啊,现再往下数据格式化,对请求消息来进行数据格式化,比如将字符串转换为格式化数字或格式化日期,这个咱们虽然说没用过,但是大家想啊,如果我们浏览器传输过来的数据,咱们在行参里面以其他方式来接收的,那咱们是不是也要来进行处理,对不对,对吧,好再往下输。
11:09
数据验证这个东西呢,咱们也没有讲,但是呢,因为数据验证其实就是啥呀,咱们的数据验证其实就是来验证一下它的长度符合不符合规则,或者说它的格式符合不符合规则,能听懂吗?那这个东西为什么咱们不讲了,大家在前端的时候是不是学过正则表达式啊,是不是对吧?那咱们在前端里面,咱们用这个GS中的正则表达式是不是就能处理啊,对不对,好啊。那为什么不在这儿用呢?大家学GS的时候,应该咱们的PPT上是这样写的啊,就在N年前拨号上网网速很慢,然后呢,这个数据需要传输到服务器中进行验证,然后呢,非常的麻烦,是不是啊,所以说就有人想了,能不能呢,把这个数据啊,然后提前到提前在咱们的客户端中验证之后,如果验证成功了,再提交到服务器中是不是啊,对吧?好,所以说我们现在咱们没有必要把它放在咱们的服务器中验证,咱们直接在咱们的浏览器中验证是不是就OK了,对不对,对吧,你传输到服务器中为什么不好使,首先呢,它会增加我们当前的一个网络传输网网络传输的负担,对不对,对吧?还有一个就是大家想你是验证的,那验证就有可能它一次是验证不通过的,对不对,所以说咱们当前如果你把验证的过程放在了服务器中,那所以我们当前咱们这个验证的过程就有。
12:43
可能会重复去执行,大家说对不对,是不是啊,所以说咱们直接把它放在客户端验证可不可以啊,可以啊,正则表达式嘛,是不是啊,是不是啊,啊行啊好,然后呢,这是我们当前这个控制器方法在执行的过程中做的一些额外操作啊好,然后再往下呢,这个handle了,执行完成之后,向dispa返回一个model and view,对象就是咱们的那一句1061行MV等于ha.handle动,能听懂吧,啊好,再往下,此时将开始执行拦截器的post方post handle动方法是逆向的,OK吧,然后再往下,根据返回model and view,此时会判断一下咱们是否存在异常,如果存在异常,则执行handle exception receive进行异常处理。这个东西咱们也是看过的啊,来在哪呢?看在这个地方。
13:39
能看懂不能看懂吧,就在咱们的process dispatch of result中,看懂了没?好,根据返回的model and view是不是要对model and view进行处理了,然后在处理它之前呢,咱们会判断是否存在异常,如果存在就会通过咱们的handler exception resource进行处理,OK吧,好啊,然后再往下选择一个适合的view receive进行视图解析,根据model and view,然后来干嘛渲染视图,OK啊,这个知道什么是适合的view overver,不知道不加前缀SIM SIM live view overver加ready RA,前缀是ready RA view对不对?然我说咱们当前咱们用的是forward冒号,就是呃,这个internal resource viewor对吧?这样的啊,好,再往下咱们渲染视图完毕之后来执行什么拦截器的after completion方法,然后是逆向最终。
14:40
公章将咱们渲染的结果呢,返回给客户端,OK吧,好,这个就是咱们SPAMVC整个的一个执行流程啊,好,然后大家再去看这些内容的时候,大家也可以去想一下,看是不是跟我们在这儿所写的这个过程啊是一样的,大家可以看着把我们的这个源码给打开,然后呢,在这儿呢,打一个断点,多打几个断点,然后看看咱们呢,每走每大家每看一步之后啊,然后希望大家都能够在咱们的执行流程里面去找到我们当前咱们所对应的这一行代码,OK吧,然后呢,这样去看啊,好OK。
我来说两句