粉丝1.0万获赞5.3万


当你的面试官让你谈一谈对于 m v c 的 一个理解的时候,如果你一上来就照搬模型,试图控制器这三个词虽然说没错,但是却很难出彩。想拿出亮点呢?我们不妨先用一句话来概括本质,比如说 spring m v c 是 spring 框架对于经典的 m v c 设计模式的一种实现以及拓展, 基于 server-app 去进行构建,并通过前端控制器模式将 web 层开发标准化、自动化,显著地简化了我们基于 h t d p 的 一个请求的处理流程。 在传统的 mvc 中, model, view, controller 各司其职,而在 spring 的 体系中,这一结构将被进一步的细化。业务逻辑通常我们会放在 service 层, 而数据访问则交由我们的 repository 层,也就是我们的仓储层。而 control 呢,则由专注于 web 请求的一个协调以及响应。而这种分层虽然不属于 mvc 的 原始定义,但是在 spring 的 全家桶当中已经成为 一个事实上的一个架构约定。而 spring mvc 的 核心机制是前端控制器模式,它是由 dispatch service 担任总调度的一个角色,他统一接收所有的请求,再根据我们的配置映设规则将所有的请求 分发给对应的旁圈的注解进行一个处理。而控制器完成了之后,通常会返回一个 model and view 对 象,随后由我们的 view resource 去进行试图的解析,最终则渲染成为我们 html 的 一个页面,反 返回给客户端。不过要注意的是什么呢?如今大多数的架构已经转向了一个前后端分离的一个架构, control 呢?不一定返回我们所谓的页面,如果你使用了,比如说 rest control, 或者说我们的 converter, 自动地将返回值转换成为 jason 或者叉 ml 的 一个格 是直接响应给前端。可以说 three m v c 是 对于原生 sublet a p i 的 一个高级封装。开发者不需要手动地编辑多个 sublet, 维护繁琐的 u r l 的 映设参数,我们去进行提取, 而是借助了 dispatch serverlight 统一进行调度,它实现了请求分发、数据绑定验证、异常处理与试图渲染等流程的标准化。总结来看,如果回答这个问题的时候,我们如果机械地去重复性的描述 mvc 三个字幕,其实没有任何的意义。 你要讲清楚 springmvc 是 如何基于 serverlight 容器进行工作的,如何通过 dispatch serverlight 实现了解偶以及 拓展如何适应我们的一个现代的前后端分离的开发需求。那么理解了这几点之后,面试官就能看到你不仅懂概念,更明白他的一个设计意图以及实现的机制。

suprem vc 的工作流程,那么这个问题呢,在我们这个 surrymvc 的这个面试中啊,他是一个核心啊,一般呢问到 supermvc 呢,都会来问这个啊问题, 当然呢,可能会以其他的方式啊,或者是比如说问什么四分 mvc 处理请求的流程,对吧?实际上就是他的工作流程啊, 我们来看一下这个第四排的,呃,这个十分 vc 啊,他是怎么来处理这个工作流程的?那么在十分 vc 中呢,他有一个最最核心的东西啊,就是这个第四排的时候那条,就是我们所说的这个前端控制器啊, 那么要来呃,明白这个 spmvc 的这个工作流程的话,实际上呢,都是围绕着这个迪斯派的时候类的在转,那么呢,主要是这样图啊,那这样图了可能呃不太好放大,我们直接来看这里面的韩非老师给大家的这个描述啊,那么呢,首先呢,是这个用户的发出一个请求到这个前端控制器, 也就是我们迪斯派的时候类的,那么我们知道迪斯派的 suv 类的,他也是一个 surp 类的啊,他是用来了接收请求的,然后接收请求了之后呢,他会去调用一个叫做开的 marpy, 那么这个开的 marpy 是什么呢?开的 mai 品呢?在我们 spamvc 中呢,它是一个处理器映射器, 处理器应声器是什么意思呢?这个东西啊,主要是用来维护什么呢?有维护我们的 url 到这个啊,看到了的一个应射关系,一个应射啊,看到了 他这里边呢, uio 这个看到了麦饼呢,他实际上是一个接口,他可以有不同的实现内,包括我们用户呢,也可以自定义的去实现,他这个是可以去自定义这个实现内啊,但是你这个实现内要做的事情呢,就一,就一个,就是要维护这个 uil 到这个 ctrl 的一个映射, 这个跟着老了。就是具体的就是啊,用来处理请求的这个方法啊,也叫处理器,也叫处理器啊,就是用来处理请求的这个方法啊,或者 之类啊。好,那么呢不同的时间内了,他有不同的这个处理方法啊,比如说我们可以通过 id 去定义这个 ul, 对不对? 你也可以呢,通过注解,比如说我们的这个艾特瑞克斯麦饼,通过这种方式去定义这个 ul 也可以,对不对?还可以了,在我们的这个,呃,他没有文件里面,通过这个 k k o k 啊,通过这个卖火的方式,这个 k 的方式去定义这个 ul, 然后呢个外流呢,就指定这个,看到了这种方式都是可以的啊, 那么在四百五 vc 中呢,他这个开的卖品呢,有很多种,我们都可以去自定义啊,也可以呢去指定,那么如果不指定的话呢,使用的是这个默认的,应该是这个带注解的呢,肯定是会有的啊, 那么呢这个是第二,这个第二步啊,他收到了请求之后,那么相当于就得到了这个 uio, 对不对?然后呢就会去便利你这里边呢?嗯,就是你示范微信中引引进来的这个开头卖品,也是看你这里面呢有哪些出色器啊?处理器应射器,如果有多个的话,那么进行便利 啊,进行便利,然后呢一个一个去找,只要在只要在其中的一个处理器应射器中的这个脉谱里面找到了这个杆子了,只要找到了,那么就结束啊,只要找到一个就结束啊,好, 也就说去便利这个所有的处理器设计中的这个麦啊,每一个处理器设计中都会维护这么一个东西,这么一个因素关系啊, 根据 ul 找到了这个片子了,找到了片子了之后呢,那么这个处理器呢?他就相当于找到了这个这个迪斯派的时候来的,找到了助理的具体的这个处理器,对不对?我们刚讲了这个助理具体的这个处理器呢,可以通过三秒去配置,或者通过注解啊,都可以啊。好,那么找到这个看到了之后会把这个看到了呢,返回给我们的这个迪斯派的时候来的, 那么这个迪斯派就稍微累,他拿到了这个处理器之后呢,他会去调用一个叫做看到了啊,大夫条,这个看到了和大夫条了,跟我们上面这个看的麦比一样,他也是个接口,也可以了,有不容的实现。那么四万 mvc 呢,也对他有一些 默认的时间啊,我们也可以自定义啊,也可以通过这个啊参配文件去指定你采用了哪些试配器,那么你如果不指定呢,他会有一些默认的试配器。这个试配器是什么意思呢? 就在 summvc 中的这个处理器啊,就是个 kellow 啊,他有很多种类,比如说我们可以呢去实现这个 ctrl 接口啊,注意啊,这个是 ctrl 的接口,不是我们的 ctrl 的注解,他有一个这样的接口,当然你也可以使用这个艾特 redows 的 mape, 对吧?艾特 redols 的 mape 呢?这个可可以可以呢,去定义很多的方法,对吧?每一个方法就是一个处理器, 那么实现这个接口的话呢?他有个接口方法只有一个方法,那么这个接口呢?他相当于是整个内作为一个处理器啊,那么还有呢,比如说我们还可以呢,使用这个生物类的, 就是我们这个啊,普通的这个生物类的啊,那么是 mvc 了,也可以了,有一种机制可以将你这个生物类的了,也可以当成一个处理器啊,一个 普通的处理器,那么比如说针对我们这三种处理器,对不对?那么我们拿到这个看头了,怎么去执行呢?对不对?也就是我们第四排的时候来的,现在呢,已经拿到了这个看头了, 现在呢,你只需要去触发这个看头脑的一个逻辑就可以,对不对?触发他的这个里面的这个业务逻辑代码,就可以相当去触发我们这个真正的业务逻辑了,那么怎么去触发呢? 比如说我实现的是这个坑圈的接口的话,那么也肯定是要执行这个接口中的方法,对不对?那么如果我采用的是这个注解了,那么就意味着呢,我要去找到这个方法名,然后去反射执行,对不对?因为我只是拿到了一个注解啊,这个 注解,那么我还还有知道这个注解的这个方法是什么?这个跟着这个为快是迈不赢了,修饰的这个方法是谁?然后呢去执行这个方法啊,那么这个方法明这个时候就不一定了,对不对?那么如果是设为死了,那么就要去执行这个设为是中的这个啊,设为类的,如果是设为类的的话,那么就要去执行这个设为类的中的这个设为是方法,对不对?也就是说不同的处理器啊,他的执行方, 方法呢,是不一样的。好,那么应对这么多种方法,那么到底怎么去执行呢?这个第四派的时候来拿到了这个片子了之后怎么执行?那么这个时候呢,什么 mvc 呢?采用了一种一种叫做试背器模式的一种方式啊,试配器模式, 也就是说根据这个看到大朋友,这个看到大朋友呢,他提供了很多种啊,有很多种类,你可以有不同的这个试配器针对他呢,有一个试配器针对他呢,有个试配器针对他呢,有个试配器啊,不同的模式有一种呢不同的试配器,那么这个试配器里面呢,他提供了这个三个方法,一个呢叫做适配方法,就是这个 四倍方法。应该是啊,射破的,就是一个射破的方法,就是射破的,那么首先呢,他会来了掉这个射破的方法啊,就是把这个示备器全部掉一遍,那摩斯半目 vc 中你定义了多少射破器,他都会去变另一边,变另一边啊,每一个示备器都去掉下来的。射破的,说白了就是去判断 你这个偏导啊,你这个偏导到底是这下面哪一种类型?比如说你是因斯坦斯奥夫,去判断一下是不是这个 ctrl blog 的类型,或者是因斯的时候 flow flow 类的,看你是不是了。 solo 类的类型, 或者是呢,比如说是 marbing 这种类型,对不对?去判断一下,看你到底是哪种类型,那么如果判断出来了是或者判断出来了之后,那么的直接呢去看着了, 那么这个看的了就是就不同的这个示背器了,就有不同的实现,对不对?那比如说针对这个 ctrl 啊这种类型这种接口的,那么直接进行的强制转换,然后就调查接口中这个方法就可以了,那么收不累的。同理啊,强制转换,那么如果是终结了,那么就需要要采用这个反射了,对不对? 使用这个反射,然后呢去获取这个注解中的一些参数啊,根据这个注解中的参数啊,然后配合这个反射去执行这个方法,那么这个是这个示备器的一个含义啊,那么这个第四排的时候来的呢,会根据了这个射破的,根据这个射破的方法去判断啊,把这个 ctrl 了,根据这个 ctrl 去调这个识破的方法,找到他这个他找到他的一个适配器,然后呢根据这个适配器呢去调这个 ctrl 方法,调这个 ctrl 方法,这个 ctrl 方法实际上调的就是我们这个处理器中中啊真正的这个啊业务逻辑,真正的业务逻辑啊,好,调完业务逻辑之后,那么我们这个业务逻辑呢就会 给他啊处理,处理完了之后呢,返回一个 model you, 对不对?就是我们知道答案,在这个 ctrl 中啊,会返回一个 model i love you。 然后呢我们这个看到大不了了,会将了这个 model i love you 了,返回给这个第四拍的时候来的啊,然后第八步啊,第八步这里没换好啊,就这个第四拍的时候来的呢,他会将这个 model i love you 呢,会传给一个叫做 vivo 社保的一个啊,试图解析器, 那么这个呢,也是四个 mvc 中的一大呃组件啊,试图解析器,他会把这个莫代恩的 vivo 传给他,然后这个试图解析器拿到这个莫代恩的 vivo 之后,他呢会采用 这个视图解析技术,比如说我们的这个什么 g a s t l 啊,采用这种视图解析技术,将我们这个 modan 的 vivo 呢解析成具体的一个 vivo 具体的一个视图 啊,最后呢这个迪斯班是收类的了,然后根据这个 vivo 去进行这个试图渲染,比如说渲染成我们的这个 gsp 啊,那么这里呢,如果是建渲染成这个 gsp 了,那么还要使用这个 gsp 的一个引擎啊,那么 js 跑的引擎啊, 就将它呢渲染成这个结实皮页面,然后最终呢将这个页面呢响应给前端用户啊,那么这个就是我们这个是 mac 的整个的一个工作流程啊,以及它里面的这个呃, 这个什么啊,处理清新设计以及了这个示备器啊等等这些东西,要要明白这些东西,那么这个处理流程呢啊,回答起来就不怕这个面试官去进行这个扩展了啊。

好,那我们再来看下一个 spring miss 一是怎么处理一个请求的啊?请求的流,处理请求的流程是怎样子的?嗯,这也是一个中高级开发工程师的一个面试仪啊,十五 k 到二十 k 的时候基本上都会问到。 呃,那么 spring miss 一,嗯,相当于我们肯定是先启动 tomcat 啊,然后呢, tomcat 他就会接收到一个请求,这个请求啊就会交给 dispatches several 的来进行处理。 对,那么呃, dispatches several 的,它会根据请求的 pass 找到对应的 handler, 那什么是 handler 呢?其实像我们代码里面像 加了这个注解的,或者说统一啊,加了我们 request mapping, 注解的方法就是一个汉的了,就相当于这就是一个汉的了,它是一个方法,但是在 spring m e c 里面,它会把它封装成为一个 看的了。对,就是说当接上一个请求的时候,会不会根据请求的 pass 先找到这个方法啊?找到这个方法之后,应该接下来呢就要去执行这个方法了,只不过只能在执行方法之前,大家注意,因为我们通常来说肯定会接收一些参数, 对不对?比如说你这样这么呃,这么写啊,包括你可能写着 request head 呀,呃等等都有可能。对, re, 呃啊一 q u e s t request head 呀啊什么什么的,或者更复杂一点的参数等等都有可能。所以说,那么我 spring missy 我真正在执行这个方法之前,其实我就需要去解析这里的参数,比如说我先解析第一个参数,我就要从请求里面拿到叉叉叉 所对应的那个值,然后传给这个参数。对,从请求的 parameter 里面去拿,对同样的第二个参数我要去解析,可能我 这里写的是什么呢?我给他写了个周瑜,那么我就要从当前这个请求的请求头里面去拿到周瑜所对应的 vanue, 然后把那个拿到的 vanue 传给第二个参数,对,就一个一个参数我都要去解析, 都相当于要从请求里面去拿到对应的值,然后呢就传给这个方法,从而才能来执行这个方法啊。执行方法执行完了之后,我就会得到一个结果,那么得到,比如说这里得到一个诗句,那么其实,呃,我接下来还有逻辑的,比如说像我这边写的,就是 他会进一步的去对返回值进行解析,因为像我们当前啊,我是整个类上面加了瑞斯邦斯玻璃柱解,我们知道瑞斯邦斯玻璃柱解,其实你也可以单独的加在某个方法上面,所以相当于说我现在在真正返回这个思郡之前, 我回去判断一下你这个方法上面有没有加瑞斯棒数玻璃注解,如果加了,那我就直接把思俊返回给浏览器,如果没有加,但前提是你那上面也没有加瑞斯棒数玻璃注解的话,那么他就会根据你返回的这个支付串,比如说这里返回的是周瑜,那么会干嘛? 他就会去找到对应的页面,找到你的 g s p 文件,找到你的 smooth 文件,找到你的 free mark 文件,然后再去进行 我就是页面的渲染啊,试图的渲染,就是服务端试图的渲染啊,所以这里的返回值啊,返回之后啊,他其实还会有不同的处理逻辑的,对不对就看有没有加瑞士方式玻璃注解, 在这里额外讲一点啊,像我们刚刚说的,如果说你加了瑞斯邦斯玻璃柱解,其实你就要把这个返回值返回给浏览器,这个工作其实是 是由一个叫做 h t t t p message convert 它负责的啊,在 spring miss 里面其实有很多的呃各种各样类型的 convert, 而其中有一个 convert 大家应该都比较熟,就是我们 mapping jackson two h t t p message convert, 它的作用呢?其实就能够把一个对象转换成为制服,节省格式的制服串,然后写到 response 里面去返回给浏览器。 就说如果说我们这里返回的是 user 对象返回的是 map 啊等等,那么你就需要用到这个 convert 才能够把它 呃返回给浏览器返写到 response 里面去,因为他能够把你一个复杂的对象转成接成格式,要接成格式的这幅串啊,然后再返回给呃浏览器,懂吗?所以说这里额外有一个概念,所以这个笔记大家也可以去领取一下吧,因为这里写 其实很详细啊,怎么领取,大家可以在评论区留言或者说私信我,我到时候都可以发给大家好吗?好,然后就是这一个。

sbmec 是怎么处理一个请求的?哈喽,大家好,我是图宁课堂大肚肚周瑜。我花了三个月时间给大家准备了一套加瓦面试题深度解析系列视频, 为了本视频的文档,我已经整理好了,并且与往期内容一起汇总成了二零二三年最新加法面试文档,放在了视频的最后面,坚持看完一定对你有帮助。改新的视频涵盖框架原码性能调优,分布式微服务等等。面试经典必问面试题, 希望大家学完之后都能够拿到高薪 offer, 想要面试题配套笔记的同学可以在评论区留言,视频制作不易,也希望能够得到大家的一键三连,谢谢!嗯,那么 spring miss 一嗯,下面我们肯定是先启动 tomcat, 嗯,然后呢? tomcat 他就会接触到一个请求,这个请求呃就会交给 dispatches 设备来的来进行处理。对,那么呃, dispatch service, 它会根据请求的 pass 找到对应的 handler。 那什么是 handler 呢?其实像我们代码里面像加了这个注解的,或者统一啊,加了我们 request and mapping 注解的方法就是一个 handler, 就像这就是一个 handler, 它是一个方法,但是在 spray mvc 里面,它会把它封装成为一个 panda 了。对,就是说当接到一个请求的时候,会根据请求的 pass 先找到这个方法啊。 找到这个方法之后,应该接下来呢就要去执行这个方法了,只不过只是在执行方法之前,大家注意,因为我们通常来说肯定会接收一些参数, 对不对?比如说你这样这么呃,这么写啊,包括你可能写着 request head 呀,呃,等等都有可能,对 rea 啊, e q u e s t request head 呀啊什么什么的,或者更复杂一点的参数等等都有可能。 所以说那么我 spring mic 我真正在执行这个方法之前,其实我就需要去解析这里的参数。比如说我先解析第一个参数,我就要从请求里面拿到叉叉叉所对应的那个值,然后传给这个参数。对,从请求的 piratemate 里面去拿。对 同样的第二个参数,我要去解析,可能我这里写的是什么呢?我可能写了个周瑜,那么我就要从当前这个请求的请求头里面去拿到周瑜所对应的 vanue, 然后把那个拿到的 vanue 传给第二个参数。对,就一个一个参数我都要去解析, 都相当于要从请求里面去拿到对应的值,然后呢就传给这个方法,从而才能来执行这个方法啊。执行方法执行完了之后,我就会得到一个结果,那么得到,比如说这里得到一个诗句,那么其实,呃,我接下来还有逻辑的,比如像我这边写的,就是他会进一步的去对返回值 进行解析,因为像我们当前啊,我是整个类上面加了威斯邦斯玻璃柱解,我们知道威斯邦斯玻璃柱解,其实你也可以单独的加在某个方法上面, 所以相当于说我现在在真正返回这个思骏之前,我会去判断一下你这个方法上面有没有加瑞思报时玻璃注解,如果加了,那我就直接把思骏返回给浏览器,如果没有加,但前提是你那上面也没有加瑞思报时玻璃注解的话,那么他就会根据你返回的这个字符串,比如说这里返回的是周瑜,那么会干嘛? 才会去找到对应的页面,找到你的 g s p 文件,找到你的 smooth 文件,找到你的 freemak 文件,然后再去进行 我就是页面的渲染啊,试图的渲染,就是服务上试图的渲染啊,所以这里的返回值啊,返回之后啊,他其实还会有不同的处理逻辑的,对不对?就看有没有加瑞士 boss body 注解,但这里额 外讲一点哦,像我们刚刚说的,如果说你加了威斯邦斯玻璃注解,其实你就要把这个返回值返回给浏览器,这个工作其实是由一个叫做 http message convert 他负责的 啊,在 spring miss 里面其实有很多的呃,各种各样类型的 comfort, 而其中有一个 comfort 大家应该都比较熟,就是我们 mapping jackson two http message comfort, 它的作用呢,其实就能够把一个对象转换成为支付节省格式的支付串,然后写到 response 里面去返回给浏览器。 如果说我们这里返回的是 u 的对象,返回的是 map 啊等等,那么你就需要用到这个 comfort, 才能够把它呃返回给浏览器,返写到 s response 里面去,因为它能够把你一个复杂的对象转成接成格式,要接成格式的这幅串啊,然后再返回给呃浏览器,懂吗?所以说这里额外有一个 概念,所以这个笔记大家也可以去领取一下吧,因为这里写的其实很详细啊,怎么领取,大家可以在评论区留言或者说私信我,我到时候都可以发给大家好吗?好,然后就是这一个 nice。

你的。

spring mac 中的 m 到底对应代码的什么部分?这个问题啊,百度百科讲的都是错的,你可以去看百度百科,它上面挂的视频呢,讲得非常明确,它认为 m 呢对应的是代码中的 service 啊和 entity。 虽然视频里给你扯了一通什么 servilent, 什么 dispatcher servilent, 但是啊,他很明显对 mvc 啊并不理解,而且这并不是个例,你去看 b 站视频一样的都是错误的理解。实际上 mvc 就是 一个桌面 g u i 应用时代架构思想,后续呢,才被引入到外部领域。 在外部领域呢, mvc 啊,说的就是 controller 和前端 view 这两个不相关的事物呢,如何联系起来的一种思想 就是通过这个 m 啊进行联系。说白了呢,就 ctrl 了给 view 的 这个返回值啊,就是 m, 它就是 model, 你 去看当时前后端不分离的时代,也就是还在用 gsp 的 时代,当时 ctrl 了呢,返回的类型啊,它就叫 model and view。 而到了现在这个前后端分离的时代呢,这个 m 啊,指的就是 control 了,访问给前端的这个 json 数据。其实你把 java web 应用啊看成一个整体,你就会发现呢,它上面需要跟前端交互,下面需要跟数据库交互。和前端交互的这个部分呢, 就是 mvc 框架和数据库交互的这个部分呢,就是 o m 框架。所以啊,你把 o m 框架里面所对应的 entity 啊 归到 m v c 里面去理解啊,是两头呢,都没理解。对,真传一句话,假传万卷书,学习就跟修仙一样,你拿个错误的秘籍去修呢,迟早走火入魔。