00:00
前面我们通过快速的构建一个后台管理系统,掌握了一些页面开发技术,比如我们在开发期间,我们用到了重定向,还有页面的跳转,以及我们给页面里边放值取值,那么可以来看一下我们整个这个过程,就是我们说的是否解析的整个原理,当所有的请求呢,我们都是从dispaure开始的,我们还是给这一块呢,来打上断点,给他的这个1021行的dotypa方法来打断点,所有请求呢从这开始,那我呢,现在先来测试这个方法,测试我们的登录方法,我们这个登录方法呢,会有重定向,以及如果登录成功呢,会来到login页面,好,我们给这打一个断点,我们debug开始。看一下我们整个这个过程是怎么处理的,那么以前呢,已经帮大家讲了我们整个参数的确定过程,你返回值的处理过程,那现在来看一下我们整个页面的跳转过程,好,我们来发送请求,我们现在想要登录,我们来local host,现在来到登录页,好,我们现来发第一个请求,让它来到登录页,我们直接放行,这样呢也有挺多请求啊,现在我们直接放行,现在这是一个登录页,来随便用一个账号,密码123456,我先以登录成功为例,我点一个对号,我们现在要开始登录,登录呢来到我们dotypach方法,那我们现在来确定一下当年请求呢,确实是登录请求来杠lock没问题,然后呢,继续往下走,我们走到下边呢,我们来看我们熟悉的过程,首先第一个过程,那就是在这先找我们这个当前请求是由哪个handleler来进行处理啊,我们先来找处理器,处理器呢,现在最终找到是由index,呃,我们的这个controller的这个慢方法来进行处理的,然后接下来。
01:41
来,我们来继续往下走,接下来呢,我们再来找处理器的适配器啊,这个适配器呢,大家就认为是一个大的反射工具,好我们最终呢找到这个适配器,然后呢,适配器会在我们这一步into来执行我们的目标方法,在这好大家注意有一个ha.handle在这个目标方法执行里边,我们先来step into,拿到我们的这个handle德了,在step into真正的进入适配器执行目标方法,Step into点进来,然后我们再来step精step into,这个handle动特这一块呢,就是我们以前熟悉的这些流程,这个首先呢,有一个叫invo handler method,这叫执行我们的这个目标方法,怎么执行呢?Step into进来,然后呢,接下来就是大家所熟悉的流程,那前面的这一块呢,我们先不管,在这呢,设置参数解析器,将确定我们参数值的和返回值解析器,来确定我们这个返回值该怎么处理的好,他在这呢,先给我们准备好了所有的参数解析器及返回值处理器,这是我们前置的流程,我就不说了。
02:41
一直往下,往下以后呢,我们一直往下看,我们这还要执行目标方法,大家注意啊,我还是来到我们的这一块好,现在呢,来到执行目标方法,那我们就不看它是如何确定每一个参数的值的,因为这一块呢,我们前面已经看过了,这个U的对象呢,封装是页面的值,然后呢,这个三对象呢,这就是拿到我们啊真正的这个session,我们后来要操作,还有我们这个model model呢,我们说这是这个东西呢,我们写model和写map都是一样的,我们前面都演示过了,好,现在呢,我们来到这一块方法,我们现在判断正确,因为我们这个登录的这个账号密码判断正确,也一切成功,如果是正确的情况下,那接下来想要去我们这个慢慢页面readyre,现在要重新向,那接下来我们来怎么做,我来放行,放行以后呢,接下来我们来看我们的这个目标方法一执行完怎么做啊,目标方法执行完,目标方法执行完必然会有一个返回值,那返回值呢是一个字符串叫redire冒号双斜杠啊,我们慢。
03:41
HTMMR,而返回值该怎么解析,那接下来呢,我们在这又是我们前边说的这个流程,那返回值的解析呢,是用所有的这个return value handler在我们返回值的这个处理器来进行处理的,我们这个处理器里边呢,又有非常多这个处理器,那么现在来看一下我们的这个返回值应该是什么,有哪个处理器来进行处理,好我们来step into进来,那现在呢,相当目标方法会给我们返回一个字符串,字符串我们现在来让它来选择我们的这个handle德ler来看他选哪个handle德ler来进行处理,那么现在呢,返回值处理器有一堆,现在我们来看第一个返回值处理器在下边我们来找一下啊,那这个处理器叫model and view的这个返回值处理器,来看一下,它呢能不能支持,不能,接下来我们来看第二个反回值处理器,叫handler method的这个反回值处理器,然后呢,它在这来判断是不是支持我们这个反回值,它怎么判断支不支持step into进来看一下,它是来判断我们这个。
04:41
返回值是不是返回了一个model类型,我们不是,所以呢它也不行。接下来来到又一个返回值处理器,叫view method,呃的这个返回值处理器来看它支不支持step into来看它是来判断我们这个返回值是不是一个view类型的对象,也不是,所以呢我们也不行。接下来呢,来到我们这个response body,那那我们这个返回值呢,也没有response body,所以也不行,然后呢,接下来看streaming,那我们这个呢,是不是流式的,那我们也不行,然后呢,接下来来到我们这HTVNT返回值也不是这个,所以也不行,那最终我们来确定,这又来看我们返回值是不是htv header也不是,然后呢,还有一个叫cornerb,是不是异步的cornerable,也不是,然后呢,接下来看是不是dier result也不是,然后呢,最终再来看我们这个,好,我们来看一下啊,再来看它是不是solid model attribute,它是来判断我们这个返回值呢,是不是标注了model attribute注解的,然后呢,它也不是简单属性的,所以我们这个判断呢,也失败,它也不是然后。
05:41
那我们会看到我们最终在不断的确定过程中,它给我们选了一个handleler,这个handleler呢叫view name muscle view handleler,这个handleler呢,我们可以来看一下它怎么判断要使用它来进行处理,Will method啊,Return value handle德ler啊,Will name method,它的这个判断呢是非常简单,它就看你的这个返回值是返回为空,或者呢,你返回的是一个字符串啊,就是叉sequence是一个字符序列,那我们现在呢,由于返回的是字符串,所以呢,它是由这个含到了来进行处理,这个看到了怎么处理返回值带星图进来,它能判断,如果我们这个返回值是一个字符串,就把我们这个返回值转成字符串,那么这个返回值呢,叫redire man htm Mr,所以呢,然后把这个啊返回值放到这个叫mav container,就是这个model and view container里边,所以我们在说视图处理的首先所有的核心流程就是我们整个方法处理的过程中目标。
06:41
方法处理过程中,所有的数据都会被放在目标方法处理的过程中,所有数据,所有数据都会被放在这个model and view container,就是我们这个model and view的这个容器中,放在这个里边,放在这个里边包括我们这个数据和咱们这个视图地址,就是我们想要去的路径,所以我们可以来看一下他把我们这个视图名呢,相当于放到model and view container里边的这个属性,属性叫view name的这个属性,我们可以看一下model and view container,看一下它里边呢有一个view name,那就是它来我们想要去这个页面,然后呢,在接下来我们来一直往下翻,它呢,还是在这判断我们当前这个视图isdirect of your name是不是要重定向的视图,它怎么判断,点进来可以看一下它呢,就非常简单,使用它来进行匹配判断,来判断你们有没有这个。
07:41
Direct的这个路径啊路径,然后呢,在下边在或者在下边它用这个加你的这个视图名是不是start with read right,所以我们为什么能重进项,你就必须你写一个以read right开始的,那我们相当于就能重立项,所以呢,我们接下来判断,如果是以重庆项目为开始的,那相当于呢,它就在这会设置一个我们这个redire这个转发的这个相当于呃,这个传感器啊整了一个处,所以这一块呢,我们后来再说,那相当于我们呢,最终感知到我们这个方法呢,是一个啊string类型的返回值,所以我们最终呢,方法执行完以后,把我们这个叫get model and view来into进来,那么整个方法执行完以后呢,我们都知道放执行完以后,所有的东西都放在model and view container里边,放了什么呢?我们可以来看一下,在model and view container里边有我们要去的页面地址,这个页面地址其实就是我们方法的返回值,还有我们的这个defat model,相当于呢?
08:41
我们在方法执行过程中,我们会给我们的这个model里边放一个这个有转对象,我们可以来看一下啊,我们方法执行的过程中,只要我们一切执行成功,我们会给session里边啊放一个东西,但是呢,呃,我们我们现在给session里边放的是logo in,但是大家会看到我们这个model里边呢,有一个这个东西叫user,叫user,这个user呢,从哪来?这个user的内容大家明显能看到是我们提交的页面的值,所以呢,只要我们这个方法的参数是一个对象,这个对象呢,最终也会被放在放到这个model中,所以大家这一块呢,也注意一下,就是呢,如果我们方法入参方法,方法的参数是一个啊,这个自定义类型对象,自定义类型对象,因为自定义类型对象呢,它的值是从请求参数中确定的,它呢,还会把它把它也。
09:41
放在把它重新放在咱们这个model and view container里边,所以呢,也就是说你整个请求处理过程中产生的各种值,它呢最终都会放在这,不管你响应有没有用,它都会放在这,然后呢,接下来它在这调用什么update model,相当于更新model,把这个model and view container拿过来,然后呢,大家注意它会model and view container,它会把里边的真正的model拿过来,像这个model里边有什么数据,它会拿过来,而这个model里的东西就是我们在给这个model里边放的,所以呢,大家会看到这一块呢是零,大家一定要注意我们的这个model对象,它呢是6844,包括呢,我们来看一下我们这块位置的这个model对象,我们可以来一直看目标方法的这个执行,目标方法执行的那个model对象,它呢是多少,我们来看一下啊,哎,这个已经已经执行完了,所以呢,这两个model对象是一个对象,他呢就拿回来了。
10:41
但是因为我们给这个model里边没放东西,因为我们是登录成功的,所以操作这登录失败才会给里边放,所以呢,我们这个model登录成功,那没放东西,没放东西以后呢,它把这个model注意还把这个view name view name就是mav container的里边的视图名,这个视图名是我们当前方法的返回值,就是它相当于它把这个东西和我们的这个model对象全部呢,最终封装成一个model and view,然后呢放进去,然后呢,这个model and view,然后呢,他还判断我们这个东西呢,是不是redirect attributes,相当于我们操作的这个model是不是redirect attributes,也就是说我们的这一块不仅能写model,还能写redirect和重词,就是这个玩意,我们可以给大家注释在这,这是重定向携带数据的,我后来再说,所以如果你是重定向携带数据,会把你重定向携带这些数据,然后呢,重新啊给你又放进去啊,我们后来再说,所以呢,整个方法一返回以后,大家会看到。
11:41
大家看到啊,我们把这个呢给大家执行完,执行完以后呢,叫work handle method,现在我们整个方法一执行完,会返回一个东西叫model and view,所以大家一定要注意,无论你是任何方法,任何目标方法,目标方法执行完成以后,都会返回这个model and view对象这个里边呢,有我们的数据和视图地址,因为这里的数据呢,原来是被放在container里边的,然后呢又从container里边抽取过来,所以任何方法的返回都会返回一个model and view啊,那返回model and view以后,我们来看一下它该怎么做好,接下来呢,我们这个方法,目标方法执行完,现在返回一个model and view呢,就是我们目标方法的返回值,我们要去哪个页面地址model,就是我们来操作目标方法的时候,当我们传的这个model给model里边放了哪些东西,我们什么也没放,所以呢,里边什么都没有,整个方法呢,有返回值以后,接下来。
12:41
再来往下看,而且呢,如果你的这个方法没有返回视图名,它在这儿还有一个叫apply default view name,像默认用看你返回的这个model,呃的无U,如果是空的,然后呢,那就给你一个默认的时头地址,相当于呢,我们你就算方法没有返回值,它也有一个默认的跳转页,而这个默认的跳转页是什么呢?你可以点进来看一下,这个默认的跳转页是用这个translator拿到原生的request,相当于呢看request当前请求,当前请求的路径是什么,像你当前请求呢,是login这个路径,那如果我们返回的是空,那我们最终还是要跳转到页面,那就叫log这个页面,所以呢,这是这个匹配原则,大家知道一下就行,咱们直接放行,然后呢,来到这一块,这一块呢,有一个叫process dispatch result,大家一翻译呢,就叫处理派发结果,所以我们最终的整个视图的跳转处理,因为我们至此呢,页面还没跳过去,大家看到。
13:41
这呢还转着,所以呢,我们整个视图的跳转呢,都在这一块,第四步叫process啊dispatch result,就是呢处理派发结果,处理派发结果也就是说呢,它是最终来决定我们页面该如何响应,该如何响应,它怎么决定页面该如何响应的,我们就啊在它里边,我们来一步一步来分析,首先第一步我们看一下啊,它如何处理派发结果的,所以呢,整个视图解析的原理就在这个方法里边,Step into,我们来进来看一下它如何处理的,他先判断我们整个处理期间有没有失败啊,至于他为什么拿这个能判断失败,我们后来再说,如果有失败的话啊,如果有异常,他在这一块要该怎么做,那我们后来再说,那接下来看这我们的这个model and view model and view不等于空,哎,我们现在呢,Model and view,我们确实不为空啊,有一个MV就是这个model and view,我们这个model and view。
14:41
那不为空,而且呢,Model and view也没有被清理过,所以接下来它调一个方法叫render render呢,我们翻译过来就叫渲染,所以试图该怎么处理,它是来调这个渲染方法的,这个render render呢,大家注意这里边呢有一个MVMV呢就是我们说的model and view里边既有我们的这个视图地址,我要去的页面地址,也我们的给model里面放的数据,所以呢,它调用这个方法进行页面渲染,页面渲染逻辑,那页面渲染又是怎么做的?们来看第二步们来看一下页面渲染里边的逻辑,那这个里边的逻辑呢,我们就来这么来写好,这是render里边的逻辑,Render里边的逻辑我们来S代北京图进来,首先呢,如果有国际化,它前面这些local,大家一看跟local有关,都是国际化的,我们不用管,然后呢,他从model and view这个东西里边拿到视图名,所有的视图名就是我们刚才方法的返回值,叫readdire my HTML没问题,然后呢,接下来。
15:41
他做的第二步,关键一步就是为need啊,我们应该去来解析这个视图名,然呢把我们这个视图名拿到了,然后呢,并且从model and view里边把这个model呃拿到,然后呢再把request对象传进来,它最终呢解析得到一个视图对象,所说要做的第一步就是得到视图对象,根据我们方法的返回值,根据方法的啊string返回值得到咱们这个VU对象,这个VU呢,在我们这个spring mvc底层呢,它是一个这样的设计来点进来这个view呢是一个接口,这个接口里边呢,规定了一个方法叫render,这个方法呢,就相当于你写的这个方法是怎么样渲染,那就怎么样渲染,这个方法里呢,给你把model也传过来了,把request和response都给你传过来了,比如你可以把model里边的数据全部提取出来,所以model里边的数据就是我们这个controller里边给model里边放的这些。
16:41
出去,你可以提取出来,然后怎么做呢?你想要怎么渲染,比如你想要把这些数据以接S方式写出去,你就可以使用response get writer把这些写出去,所以呢,相当于我们这5U对象规定的行为是什么样,那最终页面就是什么样,所以这一个5U对象很关键,它呢相当于规定了,它相当于定义了,定义了咱们这个页面的渲染逻辑,所以呢,我们现在关键的第一步就是要得到我们的这个尾诱对象,我们可以看一下它是怎么得到的,那怎么根据我们的这个视图名,视图名呢?我们现在是想要readdire冒号,想要去这个一块,那怎么得到视图对象,Step into进来,然后呢,再出去,再进来,然后呢,大家会看到有一个叫this view,叫所有的视图解析器,大家会看到呢,有这么多视图解析器,所以呢,怎么得到视图名就是呢,大家看又是这么一个写法。
17:41
遍利所有的视图解析器,挨个视图解析器尝试能不能解析,按照相当于按照这个呃字符串得到一个视图对象,如果能就用你的,如果不能就是下一个视图解析器,所以呢,我们关键的这个作用就是我又有一个东西叫维refer,然后呢,所有的视图解析器尝试是否能根据当前返回值,能能根据当前返回值得到得到咱们这个VU对象,所以呢,相当于你的这个视图解析器,它能解析得到什么,那么这个无忧对象就写什么,而我们默认呢,又有这么多是否解析器,所以它挨个给我们来看,那当然是否解析器能不能得到这个无忧对象,所以我们就来看一下,首先第一个视图解析器,然我们叫content negotiation view receiver这内容协商的这个视图解析器,来看它能不能解析视图名。
18:41
Step into进来,这个视图解析器呢,它先拿到一些东西,我们不用管它先呢得到我们request media types,相当于我们要内容协商得到我们请求啊,发过来的所有他们接收的内容类型,然后呢,接下来他调用一个叫获取我们候选的这个视图来,Step into进来,我们发现呢,它在这返回,它能给我们得到相当于在内容协商的这个呃,管理器里边,它也能给我们得到我们能呃能适配的这两个视图,所以我们把这个呢,断点打到这,我们一会看可以看它是怎么得到,然后呢,再来找一个最佳匹配,因为相当于要按照内容协商找最佳匹配,那我们最终要返回哪个页面,它就在这决定了,诶我们现在相相当于要跳转到我们一个慢点HTML页面,我们要重新上到这个页面,只过我们得到的这个视图对象叫redirect you,所以大家注意啊,我视图对象呢有很多,所以呢,最终他在这确定的时候呢,第一个视图解析就确。
19:42
定了,它是根据返回值,根据返回值得到了一个,得到了一个咱们这个redirect view,因为我们的返回值是redirect,然后冒号斜杠慢点HTMMR,所以呢,它最终就得到了一个视图对象,叫redire view view,当然你的返回值不同,肯定得到的view u对象也不同,我们可以来参照一下,对于view u呢,这个接口CTRLH,它实现类有很多,我们的redire view也只是里边的一个而已,我们可以看一下这个redire view是里边的哪个东西,来找一下抽象的view里边啊,抽象的view PDF啊,这这哎,这是其他的view,我们来看一下这个redire是在哪,Control n redirect没有这个视图对象,我们得到的呢,是这个实图对象,它是抽象的URL base啊,就是在这基于路径。
20:42
啊,这个来由我们这个readdire view,那就是它,所以呢,我们相当于根据返回值最终得到了这个redire of view,那这块又是怎么得的,我们可以给它放行,我们重新进来看一下,好,我们来重新登录进来看一下,因为我们这个请求众多,好,我们现在来重新登录进来看一下。
21:03
走,来到登录页,我们直接放行,好,我们来重新登录,我们来看它是怎么得到的,我们来123456走,那我们现在来到我们这目标方法要执行好,目标方法执行,执行完有一个返回值,这个返回值呢是read right,慢们来看它是怎么得到,我们要去哪个视图地址,Step into进来,来我们会发现我们在这里边呢,也是一样,是来判断所有的view receivers,相当于我们这个视图内容协商管理器里边,它相当于也是这个操作,用所有的视图解析器,大家就会发现内容显然管理器里边相当于包含这几个视图解析器,所以呢,它还是挨个尝试哪个视图解析器能解器。首先来看第一个视图解析器叫be name view receiver,我们按照B名字的视图解析器能不能解器step into进来,来看它怎么解析它的这个解析逻辑呢?很很简单,就是他拿到IOC容器看。
22:03
你容器中有没有你这个名字的组件,像如果你给容器中放一个B,放一个组件,这个组件名叫rediit漫画啥,那我们最终呢,就会用它解析,而我们不是,所以呢,我们这个呢,返回为空,那接下来我们来看第二个,那么这个不用管了,那么接下来直接来到这,好,我们再来看第二个不用receiver,叫SIM live SIM live呢相当于我们模板引擎的这个视图解析器,那SIM的这个解析器,它怎么能判断我们的这个redirect my htm Mr能不能解析呢?它step型图进来,进来呢,它是这么来做的,它呢相当于是这么来做,它先来创建一个view u来,它在这调用一个创建view u来,Step图进来,这是我们simli的视图解析来看它,它能,它怎么判断我们能不能处理这个视图,它会调用这个砍handle方法来step into,看它怎么调用的好,它呢是来判断这个视图start with,你呢,有没有?
23:03
以re redire开始来,我们确定以redire开始了,所以我们进入这个逻辑,既然以redire开始了,它给我们来截串,截串呢,现当得到我们最终的这个视图MYHTMMR,所以呢,我们会看到好,原来是simlif的视图解析器直接给我们拗了一个redire v u先来到这,所以呢,SIM雷判断啊,那就是相当于这样啊,我们最终呢,就是这样,SIM雷的这个视图解析器,它是帮我们直接拗了一个它啊,我们这个SIM雷直接给我们了一个它返回了,SIM呢拗了一个这个readdire of you怎们来返回了,而我们的相当于是用第一个视图解析器就解析出来了,但第一个视图解析器大家应该注意的就是这个content negotiation content and negotiation就是内容协商的这个视图解析器,它里边已经包含了下边所有的视图解析,它里边包含了下面所有的。
24:03
视图解析器在它呢,相当于视图解析器相当于呢,它在内部呢,内部还是利用下边的所有视图解析器,还是利用下面所有视图解析器得到视图对象,下面所有视图解析器得到视图对象,所以我们现在呢,知道一点,我们这个视图解析器它只有一个作用,就是得到我们这个VU对象,得到这个VU对象,那我们这个内容协商管理器里边呢,得到VU对象以后,它来进行内容匹配用的,所以我们现在可以不用管那个内容匹配的环节,那个环节呢,大家已经都啊都OK了,我们都是整个在这来进行匹配,那前面说response body的那一块内容写上的过程跟这一块是一模一样的,我们直接来放行吧,相当于呢,我们现在第一步就按照我们的这个,已经找到我们的这个内容啊,找到我们的这个视图了,我直接来放行到这儿他给我们来反。
25:03
回我们的这个视图,直接返回啊,返回我们的这个视图,好相当于呢,我们视图解析器,我们要做的第一步就是返回视图,我们这个解析器大家注意content negotiation它里边呢,大家看啊,我们的这个content negotiation view receiver在它里边呢,已经包含了所有的视图解析器就在这啊,引截个图啊,所以呢,其实都轮不到下边我们直接内容协商就给你。在这个环节已经给你解决掉所有问题了,它就在这儿包含了来,我们现在还用的是这个内容协商的这个视图解析器走过来,我们把关键的几个截图,截图放在这,所以呢,我们相当于第一步由视图解析器得到视图对象,然后呢,接下来怎么办?接下来呢,就是视图对象我们一旦得到以来看一下啊,现在返回的这个视图对象是拗了一个readdire of you,好,然后视图对象得到了以后,假如视图对象会调用它的render方法,那为什么呢?因为我们之前就说过视图这个这是一个接口,CTRL f12,它规定了有这么一个方法叫render,所以呢,视图对象得到以后呢,最终会调用这个render方法来决定我们最终如何响应页面出去,所以我们来可以看一下视图对象的定义,视图对象的定义在这好得到视图对象。既然得到视图对象。
26:33
看了接下来我们走到了这一步,就是视图对象调用它的render方法来进行页面渲染就结束了。好,没有render,那翻译过来就是视图对象,视图对象调用,调用我们这个自定义的自定义的render逻辑进行页面线渲染,稍等一下render进行页面渲染工作,而这个页面渲染工作呢,我们可以来看一下我们当前的这个view,是一个read right view来看它怎么render的step into进来,进来呢,先获取model internal我们出去再step into进来,进来呢,它是这样的,首先呢啊从把这个model先拿过来,这个model呢,就是我们以前给给model里边放的东西,他给我们拿过来,我们之前啥都没放,所以不用管,这model呢,都是空的,我们啥都不用管,注意我们最后有一个叫render out put model,好,我们来,Step into step into进来。
27:33
之后呢,接下来我们来看一下啊,它先会来到这个get request to expose,那这个方法呢,直接放行啊,他呢刚才来到这,那们再来step to,进入这个真正的逻辑step平行图,好,大家会看到render,呃,相当于我们的这个readdire of you,它在这里边如何渲染的,它是这样做的,首先第一步target给URL,先获取我们的目标路径,所以呢,我们来看一下我们的这个redire view如何渲染,如何渲染,它是这么来渲染的,第一步先获取目标目标URL地址,我们现在呢,返回的这个值叫readdire,这这个我们返回值呢叫readdire,慢HTMMR,那我们想要真正去页面怎么去呢?我们来看第一步,第一步呢是什么?我们来step into进来,它先获取目标URL,目标URL是怎么获取,他先拿到URL这个ul呢,就是慢页面这个URL怎么。
28:33
获取的,哎,我们之前已经放进来了,所以呢,我们现在相当于拿到我们的这个URL地址,拿到URL地址,然后呢,还会添加它给aend,把这个UR填进去,而且呢,它还在这来准备上一些编码格式,好把这些编码也都设置好,然后呢继续往下边,它在这目标URL和目标ul在这儿啊,我们没没问题,我们一直往下放吧,好,如果呢,我们有一些model attribute,像然我们有一些属性要重定向,它呢会把这些重定向的属性以查询参数的方式再来拼接到URL的后边,所以如果我们想要重定向企间的属性,它有可能还会这样给MYHTML后边问号谁等于谁按谁等于谁相当以咱们这个参数的方式填后边,只不过我们现在没有带任何参数,好们第一步先拿到我们目标要去的路径,拿到以后呢,接下来第二步叫readdire重定向,怎么重定向呢。
29:33
带北to进来,大家看啊,还是拿到我们的这个URL,而他在URL呢内部也会进行编码,如果有一些中文也会编码好,那接下来我们来看它怎么做,它呢在这这么来做,大家注意调用了我们so编程里边最原生的一个方法叫response senddire,所以呢会非常简单获取目标UR地址,将来第二步叫senddirect,这就是我们以前使用S的时候,我们以前想要重定向就是调用的这个方法,所以相当于呢,我们的这个为redire view u它的目,它最终的这个渲染效果就是重定向的一个页面,好,那我们这个重定向呢就OK了,我们直接给它放行,重新放行好,我们这个页面呢,最终就重定向过去了,我们那个方法也不用管了,那个方法只要一执行完,我们都已经调到原生最底层的这个redire啊,重定向了。
30:33
所以呢,我们只要这个方法一完,我们最终呢,就是重定向到我们指定的地址,然后呢,我们可以再来看一个请求,再来回顾一下整个过程,那么来看一下这个请求,既然现在重新项过来了,来看我们的如何把这个页面里边的内容放进去,我们可以大概来快速的来看一下,那是advance table,来点一下,好,来到我们这个请求,我们来直接放行,来到我们的目标方法,我们让他来到目标方法,好,目标方法呢在这。
31:00
在这把所有的东西大家注意,我们现在呢,这个model大家来记一下,编号7898。这个7898,这个7898的这个model。我们现在呢,相当于又做了一个效果,又做了一个什么效果呢?我们现在来返回5U对象,返回5U对象的这个效果呢,我们以前是返回的是一个咱们这个,呃,是一个叫readdire view,我们来看现在,现在呢,我们没有加相当于readdire的权缀啊,我们直接叫table什么什么,所以我们这个目标方法返回,我们来看一下会是什么样的效果,好我们来让它目标方法直接返回,直接返回了以后呢,我们让它来到视图处理的过程,好视图处理呢,咱们直接在这来解析,来看一下它解析到什么样的视图,Step into进来,还是尝试用所有的视图解析器,所有的这个视图解析器呢,默认有be name的SIM的view reserver,还有internal resource view receiver这个东西大家以以前肯定用过,好,我们来挨个解析,首先第一个b name的肯定不行,它是按照我们的试空名,然后叫table杠去容器中找这个be应的,哎,我们不是这个规则。所以我们接下来来到第。
32:16
第二个视图解析器,第二个视图解析器呢,是SIM live的,SIM live的这个视图解器,我们来看他怎么做step into,他呢还是来先来创建视图step into来看看怎么创建的走他呢判断是不是以readdi right前缀开始的,我们不是以这个前缀,然后呢,他还判断是不是以forward前缀开的,我们也不是以这个前缀,所以如果是forward呢,它还会给我们创建一个视图叫特resource为用,所以呢,在这一块呢,它有两个逻辑。如果呢,是以redire前缀开始的,好,我们来重新在这分析一个视图解析试图解析的几个啊关键点第一个,如果我们返回值以redirect开始,返回值我把这个总结呢,放到这返回值以把这个拿过来,返回值呢,以我们的这个forward开始。
33:21
值哎,我们这个前面啊定位过来,返回值呢,以我们的这个forward开始,那我们呢,现在就会是一个啥效果,诶现在呢,来到inser,好,返回值我们以forward开始,For那们就叫返回值以forward开始,以forward开始的话,然后呢,它会给我们new一个叫internal resource view,有把我们的这个相当于要去的页面地址拿过来,然后呢,如果返回值我们以前还见过这个返回值以咱们的redire开始,Redirect开始,它呢又会给我们new另外一个东西叫direct view,这都是SIM的啊,内部规则啊,我们把这个呢来加粗。
34:22
而我们现在都知道呢,Redirect的这个视图它在底层呢,他来写render方法的时候就是直接重立项的,所以它在底层,它的这个render就是重定向逻辑就是重定向,重定向,而我们的这个internal resource view,它的底层是什么呢?如果我们以forward开始,我们可以大概看一下step into进来,我们就来找它的render方法就行了,来找它的render,这个render呢,这有一个重写了的render模式out,它的呢是从view u里边一层一层继承过来的,那我呢,也就不从view u里边层层分析了,这个方法呢,相当于就是我们最终如何渲染的,它这么来渲染的,大家注意,这有一个叫get request dispature来拿到它这个request dispature是什么呢?就是大家以前的request get,所以呢,在internal resource view view里边它的底层就是就是什么呢?就是request。
35:22
Geture,然后呢,大家肯定会发现这么一个逻辑,看一下啊,Internal resource为you它的这个渲染方法,拿到这个转发器以后,RDRRD,最终调用forward,把request response拿过去,大家有没有非常熟悉这一句话呢?看一下啊,Request get requestpa forward,其实它就是转发,所以呢,这就是我们so以前写的转发,所以这个的功能就是转发,如果你以forward开始,那就是转发,以redire开始,那就是重定向。而我们现在呢,既不是forward,也不是redirect,来看我们现在的这个自己的这个逻辑,我们看是什么样的,好,前两个呢,都不是,接下来呢,我们similar就开始进行判断,叫load v u来进行页面加载,Step into,怎么加载呢?它来先拿到IOC容器工厂,然后呢,它来判断当前这个。
36:22
呃,视图存不存在,它是先从容器中按照这个东西找这个B应的名字,那肯定不存在,我们相当于是要有一个页面的,所以如果不存在的话,它来看我们的这个视图类型是什么,好,我们这个视图类型它并不是容器中的任何一个东西,所以接下来呢,最重要的就过来了,来到这儿以后呢,如果我们在容器中不存在它呢,接下来就准备一个视图对象,诶,它在这个视图对象里边,刚才在前面会有一个创建,我一不小心呢给过去了,在这它会呢,哎,在这啊如他会呢,在这准备一个视图对象,这个视图对象呢,如果我们刚才不是在容器中有的,然后他在这准备一个视图对象,然后呢,这个视图对象就是在这儿创建出来的,最终呢,它会从容器中得到一个SIM live viewu,想让他利用模板引擎自己创建一个SIM live的view u,然后呢,创建完了以后大家看一下啊,然后呢,设置好。
37:22
我们这个模板的名字,然后呢再来设置上一些东西,所以呢,最终我们如果是SIM live引擎解析最终返回的这个VU对象,那就是什么叫SIM内U,所以呢,如果是SIM内返回值普通字符串,返回值是普通字符串字符串字符串,然后呢是普通字符串,那呢它就直接给我们会扭一个SIM类用,所以呢,Simlif接下来是怎么声明渲染逻辑的,那就怎么渲染,而simli怎么声明渲染逻辑呢?我们可以直接复制CTRL看一下这个simli无U,我们就直接来放行吧,好,直接放行,既然这个SIM live5u我们就都得到了,我们直接看一下它的这个view u的render方法,好,只要你得到view u对象就会调用它的render,我们来看它render怎么来渲染,大家注意啊,我们这个渲染之前,因为我们这个呢,相当到页面要遍利取出东西,我们这个页面的这个。
38:22
东西啊,这个叫model map model map里边呢,放了一些users,这个user,这个model map呢,变成8144,这个8144呢,由于前面啊已经创建了新的,它变成8144,好我们不管它了这个了,Step into进来来看啊,它叫这个叫render fragment s5u的render方法叫render啊我们来相当渲染页面片段,怎么渲染呢?接下来就是SIM live自己拿到SIM模板引擎,大家看到拿到spring里边的SIM live模板引擎,拿到这个模板引擎以后呢,接下来模板引擎就开始来解析,先拿到我们要输出的这些数据,这些数据呢,相当于我们来看啊,它准备了一个这个空model,然后呢,把我们如果有一些静态变量,它也放到里边,这些我们后来说这个跟这个没啥关系,然后呢,主要就是把我们想要给页面渲染的数据,想要给页面渲染的数据来稍等一下啊,稍等一下。
39:20
好,他来到模板引擎的配置,然后呢,想要给页面渲染的数据,最终呢,它会放到我们这儿有一个model里边来看一下,我们前边的这个model,就是这个墨GE的model来看啊,给页面渲染的数据,其中就有users这个里边,当然还有其他它给里边放的一些其他东西,那我们现在给页面渲染的数据,既然有了,将来走到这一步,他呢,拿到我们这个SIM live模板引擎的一些配置,然后判断我们这个模板这个页面地址是不是以双冒号开始的,如果双冒号开始它呢,哎,这不就是我们TH英刻漏的,相当于我们相当于要包含什么东西嘛,啊所以呢,他接下来就啊,就要做一些我们的包含工作,否则呢,他拿到我们这个模板引擎要响应的内容类型,那响应HTML页面,然后呢,包括我们的整个字符编码,字符编码呢是UTF8,然后接下来最重要的就在这儿了,最后一步呢,那就是利用模板引擎响应所有的设。
40:20
设置好以后,然后利用模板引擎我们来往下走,这些呢,我们都不用管,我们直接来到模板引擎,好,这是模板引擎调用process方法,怎么process呢?那就是一大堆的writer writer writer,我们来把这个new过程来放放行出来,把这个new过程呢,我们就不要了,来看它的这个process方法,走process step into,好,Process的逻辑就是在这,这相当于拿到我们SIM的模板引擎,然后呢,模板引擎给我们来进行处理,哎,这有writer,现在我们要对接输出流,把最终的所有的内容,哎,我们处理的所有的页面的内容,HTML para,他利用HTML的页面解析器,把所有的页面内容最终呢,给我们刷到这个writer里边,所以这相当于就是他在这自己,诶,Write flash,哎,他呢,自己相当于把页面的内容就刷出去了,而页面刷出的内容呢,我就可以在这个buffuff里边应该就能找到,我可以看一下我U。
41:20
And string,这就是我们的整个HTML页面,我们就能看到,所以呢,这就是我们整个视图解析的过程,那一句话总结,那就是我们视图解析里边有我们视图解析器,视图解析器呢,会按照你返回的不同规则,不同规则给你得到不同的视图,只要你不同的视图足够强大,我们就能找出不同的功能,所以呢,大家可以在后边呢,可以自定义视图解析器,视图解析器,然后呢,以及自定义视图加自定义视图,我们可以完成更复杂的功能,比如我想把我的这个数据,我们现在呢,这个数据是呢给页面直接编列出来,比如我想把这个数据导成一个Excel表格,所以呢,我们就可以写一个自定义视图,我在自定义视图里边,比如我来写他的这个render方法的时候,我自定义视图写render方法的时候,我就可以在这创建好所有的表格,然后给他response。把这个表格。
42:21
Excel给它响应出去,这就是我们说的整个视图解析原理,那当然整个自定义视图的过程呢,我们就不在这儿多说了,大家可以关注我们的这个大厂学院,更多所有深入的这个细节,我们都在大厂学院里边,大家慢慢来讲解就行了。好,这是我们说的整个视图解析,当然大家第一次整个听这流程可能有点懵下去,下边呢,多对bug几遍就清楚了。
我来说两句