00:00
好,那下面呢,我们来看一下这个SPVC,它的一个具体的执行流程。然后这个东西呢,我希望大家呢,就是理解一下啊,然后呢,大家不需要去死记硬背啊,然后咱们只需要知道它大致的一个流程,能用自己的话把它给描述出来就行啊。好,下面大家来看第一步啊,然后用户向服务器发送请求,请求被SPVC的前端控制器dispat solve light来进行补货,这个应该都没有问题,对吧,为什么呢?因为我们在web的XL中去配置SPAVC的前端控制器的时候,咱们把它的URL pattern呢?然后来设置的是斜线,这个斜线呢,然后咱们来表示的是除点GSP请求以外的所有的请求,对不对?好,然后下面呢,我们再来看咱们的第二个,然后叫dispatch of对请求的URL来进行解析。得到请求资源标识符,然后判断请求U对应的映射是否存在。
01:01
那首先大家要知道在这咱们的请求URL是什么,然后还有一个就是我们当前咱们请求资源标识符是什么,这个叫做统一资源定位符,这叫统一资源标识符,然后这个里面它是带协议,带IP地址,带端口号的,然后带我们当前资源的具体路径,然后这个里面是不带协议端口号和IP地址的,能听懂吧,所以说大家可以把这个URL认为是我们当前这个资源在我们网络上的一个路径,然后这个呢,它表示的是这个资源在服务器中的一个路径啊。好,然后下面呢,我们就要来判断这个URL是否有相对应的请求映射了,然后呢,大家注意,那咱们就有两种情况,第一种情况就是存在这个映射的情况,然后呢,第二种就是不存在这个请求映射的情况,那咱们先说不存在。好,如果说不存在的话,那我们之前咱们在没有讲这个默认的solve的时候,大家注意,那你不存在,那就是404呗,对不对,但是如果我们现在呢,咱们讲了默认的solve,那我们就要去判断我们当前在spring VC的配置文件中有没有去配置默认的solve,如果说我们要配置了的话,那咱们的dispartch solvele没有找到相对应的请求映射,那我们当前的请求是不是还要被我们的默认的solvele来处理,对不对,对吧?好,然后呢,如果我们当前咱们默认的solve它也是处理不了的,那这个时候那就只能404了呗,是不是啊,好啊,然后那如果说我们当前咱们要是没有配置默认的solve,那我们当前咱们的请求就只会被谁进行处理,Dispa solve来处理,那如果说他要是能找到映射,那咱们就处理,找不到的话,那也是404。
02:50
OK吧,所以说咱们在这呢,其实就是加了一个步骤,然后如果我们没有去配置默认的solve,我们当前的请求只会被前端控制器dispat solve来处理,而如果说我们去配置了默认的solvele,对吧?当然呢,这里面还有一个细节问题,大家注意啊,如果你只配置了它,那我们当前所有的请求都要被默认的solve处理,而如果说我们配置了它,我们还配置了开启MVC的注解驱动,它所代表的意思就是我们当前请求先被前端控制器处理,若处理不了,再交给默认的solve来处理。
03:27
知道吧,啊,但是呢,他如果说都处理不了的话,那肯定就是404啊好OK。那行,那下面呢,我们再往下看,那如果说我们当前的请求,然后能找到相对应的请求映射,这个时候怎么办?我们会根据咱们当前的U对吧,然后来调用咱们的handler mapping,大家还有印象没有,这东西叫什么叫做处理器,叫做处理器映射器,然后这个东西它专门就是将我们当前的请求和我们的请求映射,也就是request mapping标签进行匹配,对吧?好,然后来获得我们当前该handle了配置的所有相关的对象handle了,就是咱们的处理器,其实就是我们当前控制层中的控制器方法。
04:14
对吧,然后它配置的所有相关的对象,啥叫相关的对象,记好啊,在这呢,说的这个对象就是我们之前在源码里面看到的那个map handle的对象。就是我们的那个调用拦截其中各个方法的对象,大家注意在这呢啊,来咱们找到dispats of that,就是这个知道吧,叫做map handler,然后它来表示的是我们当前的一个处理器执行链,叫做handle,着exq生Cha,对不对?里面包含三个内容,大家回顾一下,第一个是我们当前的处理器方法,第二个是我们的拦截器集合,第三个是咱们的拦截器索引,还有印象吧。是不是啊,好,然后大家注意,你看它包含handle着对象,以及咱们handle着对象对应的拦截器,对吧?然后最后以handle着excution恰执行链对象的形式返回,OK,然后这一行咱们也是能从咱们的源码里面看到的啊好,然后第四个步骤dispatch,根据我们所获得的handler handler就是我们的控制器方法去选择一个合适的handler adapter handler处理器,Adapter叫适配器,叫处理器适配器干啥的?
05:26
那我们既然现在已经根据咱们的请求信息来匹配到了相对应的控制器方法,那我们下一步的任务是不是就要来执行控制器方法来处理具体的请求了,对不对?而我们执行控制器方法需要用到的是哪个组件?就是咱们的handler adapter,这个大家注意好,再往下如果成功获得handler adapter,然后此时将开始执行谁拦截器的什么handle方法。然后正向,那这不就对应我们之前,然后咱们所看到的咱们源码里面的哪个位置啊,咱们在这儿获取完ha之后,大家注意这是不是获取ha,然后这个就是咱们获取了,选择一个合适的handler adapter,然后之后呢,然后我们是不是直接就跟大家说了,下面要执行的就是咱们拦截器的handle方法,按照正向执行。
06:18
OK吧?按照什么的顺序执行?按照我们众多的拦截器在spring VC中配置的顺序执行,这就是正序。是不是啊好,下面呢,我们再往下看。好,然后提取,那下面大家看这一步第六个步骤啊,叫做提取request中的模型数据,然后填充到咱们handler的入参。什么叫做提取request中的模型数据啊,Request来表示的是我们当前的请求嘛,对不对,表示的是我们当前的一个请求报文,那所以说大家想想,我们在获取我们当前的这个请求报文中的信息的时候,我们是不是都可以干嘛把它给放在我们当前控制器方法的行参位置来获取,就比如说你说你这里面都有什么一个完整的请求报文,有请求头,有请求体对不对,然后还有请求参数,像这些,其实请求参数它也是属于请求报文中的一个内容,对吧?然后我们获取请求参数,我们是不是可以直接在控制器方法的行参来设置一个行参,和请求参数的名字保持一致就可以了。
07:27
如果说我们要获取请求头信息,大家还记不记得用什么注解叫it request header,大家如果说忘了的话,一定要回去看看啊,然后还有一个就是咱们获取cookie数据用的是a cookie value注解,如果我们要来获取这个请求头,我们用的呃,请求题,我们用的是a request body注解,对不对?对吧,这些东西都是在哪用的,都是在我们控制器方法的行参位置来使用的,对不对,所以说啊,然后那你说它是怎么来实现的,那不就是dispatch of that在调用我们当前咱们的控器方法的时候,由handle the adapt在调用控制器方法的时候来为我们的控制器方法的行参进行了复制。
08:10
OK吧,他在这叫做填充憨豆的入参。是不是好,然后下面呢,我们开始来执行handlera,也就是咱们的控制器方法来处理请求,然后再填充handlera的入仓过程中,根据我们当前的一些配置,咱们的spring呢,也会帮助我们做一些额外的工作,就比如说。大家看这个叫做http message convert啊,这个东西叫什么呢?虽然说咱没有见过啊,但是我可以跟大家说一下,大家其实都已经学过了,知道吧,然后httb message convert http叫做情,叫做报文,叫做HTTP协议,它对应的就是咱们的报文信息嘛,对吧?然后message是信息,然后convert叫转换,叫做报文信息转换器,它可以将什么呢?将咱们的请求信息,然后转换为一个对象,然后将对象转换为指定的响应信息,大家注意啊,这个其实指的就是我们之前咱们学习的it request body这个注解。
09:14
有印象吧,然后将我们当前的请求体,然后来转换,为什么转换为我们Java中的一个对象,对不对?然后或者说还有一个就是咱们的a response body注解,也是我们的http message convert中实现功能的一个注解,它可以将我们的控制器方法的返回值直接作为响应报文的响应题响应到浏览器。对不对,大家注意,这个其实咱们都已经学过了啊,当然还有一个叫做response entity,大家记不记得我们在实现文件下载的时候,咱们就是把它来作为控制器方法的返回值,来表示一个完整的响应报文的,有印象吧,好。这个大家注意,当然还有一个叫request ntt这个东西咱们没有讲,因为它没有什么,就是怎么说呢,它没有什么一,它没有一个比较重要的功能啊request entity,它也是用在我们当前控制器方法的行参位置,但是呢,它是作为一个类型的,跟咱们的response entity一样。
10:15
咱没有讲对吧?当然这个东西不重要,为啥?因为它是用来获取一个完整的想完整的请求报文,对吧?大家说你获取一个完整的请求报文有什么用吗?没有用吧,我们是不是一般也是需要来获取请求报文中的请求头啊,或者说请求题啊,对不对?像这些,所以说我们可以直接干嘛,用咱们的it request header来获取指定的请求头,用咱们的a request body注解直接来获取请求体,这不就完事了吗?对吧?你如果说你要来获取的是一个什么呢?Request entity。这个东西大家可以去试一下啊,然后这个来获取的就是一个完整的请求报文啊啊。下面咱们在这儿还有一个叫做数据转换,对吧?对请求信息,然后来进行一个数据转换,如string转换为inter转换为double,这个大家应该也都见过吧,你就比如说呀,然后虽然说咱们见的咱们就是平常咱们在做案例的时候,可能咱们看到的不多,但是其实啊,我们也都遇到过。
11:19
比如说我们在做咱们的这个rest案例的时候,对吧,然后我们做的是员工的增删改查,然后呢,我们在这个实体类中,咱们设置的是不是有int类型,设置的有string类型。而我们从浏览器传输到服务器中的请求参数,大家都知道,它用的肯定是request get parameter方法。或者说request get parameter values,或者request get parameter map,但是大家不要忘了他们的返回值,你所获取的请求参数的值全部都是string。但是当我们在spring VC中,当你以spring VC的方式来获取这些请求参数的时候,我们是可以直接将它设置为in t方in泰类型来获取,或者说double类型来获取的。
12:05
对吧,这个时候,那这个中间数据类型的转换就是由谁来完成的,就是由咱们spring VC来完成的,知道吧,好啊,就是在这个过程中完成的啊,好再往下还有一些什么数据格式化,比如说对请求信息进行数据格式化,然后将咱们的字符串转换为格式化数字或格式化日期,这个咱们用的不多,然后再往下数据验证,验证数据的有效性,比如说长度格式,对吧,然后呢,验证结果存储到帮ing result中,我记得这个东西反正我之前是用过,但是呢,基本上如果我们要进行一个数据验证的话,我们现在用的都是咱们的前端GS的技术来对我们用户输入的一些数据进行验证,对吧?要不然的话,那大家想一想,我们现在是不是还要把这个数据传输到服务器中验证,你传输到服务器中验证之后,它是不是也有,它是不是还有可能验证不通过,那验证不通过,那我们是不是就得需要干嘛,你再把这个错误信息响应。
13:06
到浏览器,然后在浏览器告诉用户要重新输入,用户输入完,用户重新输入完之后,是不是还要再经过一次这样的过程来进行验证,所以说大家注意啊,我们现在的验证一般都是在咱们的浏览器端完成的,知道吧,好啊。好,然后再往下,大家看咱们的第七个过程,叫做handler执行完成后,然后我们向dispatter of let,然后返回一个model and view对象,这个大家应该也都能看到吧,就是咱们的1061行,当我们去调用了咱们的控制器方法之后,咱们返回的对象是一个固定的对象,就是model and view,这个咱们之前说过,你不管你用的是什么方式,然后封装的模型数据,就是咱们的model功能,也不管你用的什么方式来设置的视图,也就是view功能,我们最终咱们都会把这些数据封装到model and view中,OK吧,行,然后再往下,然后此时将开始执行拦截器的post handle动,那咱们的控制器方法执行之后,来执行的不就是它吗?然后这一句话不就是来调用咱们拦截器的post handle动吗?按什么顺序啊?按照反序执行,为什么源码咱们看过,因为里面它写的是A减减。
14:20
有印象吧,来咱们可以再打开让大家看一下啊,大家注意这里面写的是A减减啊,所以说它的顺序是反序,好,然后下面呢,我们再来看,然后呢,根据返,根据我们当前所返回的model and view,然后呢,此时,当然此时还有一个过程,因为我们现在咱们讲过这个异常处理器,所以说在此时呢,这个异常处理器大家注意它也会起作用,就比如说此时会判断是否存在异常,如果存在异常,然后执行handler exceptionover来进行一个异常处理。对吧?好,然后这个时候大家要注意啊,就是说我们当前根据返回的model and view,你这个model and view它是有两种情况的,首先没有异常的情况,那就是我们的控制器方法执行之后,将我们的控制器方法中所设置的模型数据和视图封装为封装之后所产生的model and view,而如果说我们当前有异常的话,大家记不记得咱们是怎么来设置的这个东西啊?
15:24
这个接口,这是一个接口,这个接口里面只有一个抽象方法叫resolve exception,还有印象没有,而这个接口里面的这个抽象方法返回值就是model view。能听懂吧,所以说大家记好,这个Mo有两种情况,要么就是你的控制器方法没有任何的异常,咱们最终返回的就是控制器方法中所设置的数据封装的model and,如果说有异常的话,那就是我们的异常处理器,异常解析器解析之后返回的一个新的model and view,能听懂吧,这个大家注意,但是最终呢,它的处理方式都是一样的。
16:01
因为毕竟都是一个mode view嘛,对不对,所以说他需要去选择一个适合的,什么叫做view controller,叫视图解析器来进行视图解析。对吧?那大家说它是怎么来进行视图解析的?咱们说过视图的解析只跟谁有关系,视图名称有关系,也就是我们在view中所设置的这一个视图名称叫做view name。也就是我们。这个控制器方法所返回的字符串。如果没有任何前缀,那它就会被我们的stemli view reserve解析来创建一个simli view,如果说我们用的有指定的前缀,比如说forward冒号,咱们创建的就是internal resource view,如果我们用的是for ready RA的冒号作为前缀,那它创建的就是一个重定向视图,OK吧,行,这个大家注意,叫做ready direct view啊,行,那我们现在呢,大家再来看,然后那我们现在通过view reserve进行视图解析之后,视图解析之后,然后呢,我们是不是可以根据它的model功能和view功能来渲染视图model,大家要注意这里边放的是什么?
17:11
大家一定要记好啊,这个model你想想它是什么功能,你看我们平常咱们在这个实现功能的时候,控制器方法里面,你怎么往请求域中共享数据,对吧?我跟大家说,我说这个model是最简单的,所以说我们一般都是在控制器方法的行参来设置一个model。Model类型的型材,然后直接在我们的控制器方法中使用model来往请求域共享数据,所以说大家以后看到这个model,你要知道这是网域对象共享数据的,你看到这个view,你要知道它是来设置咱们的逻辑视图,实现页面跳转的,能听懂吧,好,然后那我们现在呢,咱们是不是就可以由STEM,然后来渲染我们当前咱们的视图,然后最终来实现一个页面跳转,OK吧,行,这个大家注意,这是咱们的第九个步骤。
18:00
好,然后再往下第十个步骤,渲染视图完毕之后,然后我们要干什么,咱们就要来执行咱们拦截器的after completion方法了,其实它对应的就是我们的哪一行代码呢?大家注意,就在这个方法中,然后咱们的render这个方法它就是干嘛的,它就是来处理咱们的model和view的,就比如说我们没有看过怎么处理model,但是我们一定知道它的底层一定是request.set attribute,它不可能是别的东西,大家想想是不是万变不离其宗嘛,对不对,对吧,我们目前学习过的往请求域共享数据,那就是request set attribute,所以说你放心,然后在我们这个方法的底层,它怎么来处理model中的数据,用的是一样的方式,也是request set attribute OK吧,行,那至于咱们的视图,咱们之前在看这个创建的视图的种类的时候,大家记不记得咱们就是从这个方法进去的。然后进去之后,我们就看到了咱们创建的视图,有个方法名叫做reserve view name,叫做解析视图名称,然后来获得一个视图对象。
19:09
OK吧行,所以说这一句话就是渲染视图的方法,然后我们渲染完视图之后,最后,然后我们就要来执行咱们拦截器的after completion方法,OK吧行,这个大家一定要看好啊,然后after completion方法是按什么执行的?也是按照一个逆向的顺序,也就是跟我们在Mac的配置文件中,你所配置的这个拦截器的顺序相反的一个顺序,啊好,然后最后咱们的最后一步,那就是将渲染的结果呢,返回给客户端行,这个大家注意,这就是我们当前spring m VC的一个完整的执行流程。好,然后大家一定要注意这里面比较重要的这几步,你只要把这几个步骤说出来就可以,比如说浏览器发送请求被dispatch solve来处理,对吧?然后呢,我们的dispatch of在处理请求的时候,然后呢要来找到这个请求所对应的请求映射。
20:06
然后那我们就有两种情况,存在或不存在的情况,不存在的情况我们再去找谁啊,找找我们有没有配置默认的solvel,如果说你要是没有配置,那页面直接404,如果说咱们要配置了的话,那咱们是不是就交给谁啊,默认的solve let继续来进行处理,能找到静态资源,那咱们就那咱们是不是就能够找到静态资源,如果找不到的话,也就是说默认的solve能处理更好,处理不了呢,页面还是404,对不对,好,然后再往下呢,然后我们下面咱们如果说有这个请求映射怎么办?那我们就要通过handler mapping,然后去匹配我们当前的控制器方法,然后匹配到控制器方法之后再由我们的handler adapter,然后handler mapping是匹配控制器方法的handler adapter是来调用我们调用执行控制器方法的,知道吧?好,那我们在执行控制器方法之前会按照这个SPAVC的配置。
21:07
配置文件中所配置的拦截器的顺序,去执行拦截器的handle方法。OK吧,然后再来调用咱们的控制器方法,控制器方法执行之后,然后我们来调用拦截器的posts handle动方法,对不对?然后posts handle方法执行之后,那我们是不是就需要来干嘛了,来处理我们的model and view,然后来渲染视图了,然后渲染完视图之后,我们最终要来执行的是拦截器的after completion方法,然后最终再将这个结果响应到浏览器。OK,大家注意,这就是我们spring VC完整的执行流程,一定要记好,把我刚才给大家第二次跟大家说的那个比较短的那个过程啊,那里面比较重要的那几个步骤,大家一定要把它给记住。大家只要能把这几个步骤给说出来,就是里面包含咱们的每个组件的作用,向dispas of let统一处理请求对不对?然后像咱们的handle了,Mapping来匹配控制器方法handler adapter,然后用来干嘛的?
22:08
然后用来调用,用来执行我们的控制器方法的,对不对,大家只要能把这几个给说出来就没有问题啊,行OK,那这是咱们spring VC的这个执行流程啊。
我来说两句