哈喽呀!这里是你们的老朋友小米~
今天继续咱们的“社招面试故事系列”,有趣又涨知识的那种~
这次聊的题目是—— Spring MVC的主要组件?
是不是看到这个题目,一瞬间头大,觉得自己背过,但又好像记不全?
别怕!小米给你讲个真实发生在我身边的故事,让你轻松记住Spring MVC的核心组件,面试场上轻松回答,拿下Offer不是梦~
故事开始|面试官的灵魂拷问那天,我的朋友阿辉,接到一家大厂的社招面试邀请。
阿辉技术很强,就是有点紧张,生怕自己一上来就被问懵。
面试官笑眯眯地开口了:
“能跟我聊聊,Spring MVC里面主要有哪些组件吗?它们分别是干什么用的?”
阿辉脑袋嗡一声。
幸好,他想起了小米我曾给他总结过一个记忆口诀:
“前端收集、后端分发、中间解析、视图渲染”
于是他稳了稳心神,开始答题!
我们就跟着阿辉的回忆,一起来复盘吧!
小板凳准备好,我们开讲咯~
DispatcherServlet(前端控制器)阿辉开口:
“首先,Spring MVC有个最重要的核心组件,叫DispatcherServlet。它是前端控制器,整个请求的入口和出口。”
面试官点了点头,示意他继续。
阿辉解释:
客户端发来的所有请求,都会先被DispatcherServlet拦截。
DispatcherServlet不是做业务处理的,它更像一个“交通指挥员”,负责把请求转发到正确的地方,处理完再把结果带回来。
统一流程控制,实现请求的集中处理。
一句话总结:
DispatcherServlet,统一请求入口,分发请求,收集响应!
小米补充一个小Tips: DispatcherServlet是通过web.xml里配置的拦截路径(比如/),或者用Spring Boot时自动注册的。
HandlerMapping(处理器映射器)阿辉继续说:
“接着,DispatcherServlet拿到请求后,它需要知道,这个请求应该由哪个具体的Handler(处理器)来处理。这时候,就需要HandlerMapping登场了!”
HandlerMapping是什么呢?
简单来说,就是建立请求和处理器之间的映射关系。
它根据请求的URL、请求的方法类型(GET、POST等),去找出对应的处理器。
在Spring MVC中,常见的有:
RequestMappingHandlerMapping(最常见,处理@RequestMapping注解)
SimpleUrlHandlerMapping(早期使用,配置路径和处理器映射)
一句话总结:
HandlerMapping,给请求找到它的Handler!
小米小课堂:理解HandlerMapping的核心,就是理解URL到Controller方法的路由规则,面试官很爱追问哦!
HandlerAdapter(处理器适配器)讲到这里,阿辉稍微停顿了一下。
他知道,很多人到这里就模糊了,HandlerMapping找到处理器了,那怎么执行呢?
阿辉笑着说:
“找到Handler之后,还得执行它呀。但Handler可能是各种各样的对象,不好直接调用,所以需要有一个HandlerAdapter,来适配各种类型的Handler,调用统一的方法进行处理。”
HandlerAdapter的作用:
适配不同类型的Handler。
执行处理逻辑,返回一个ModelAndView对象。
常见的HandlerAdapter有:
RequestMappingHandlerAdapter(配合@RequestMapping使用)
SimpleControllerHandlerAdapter(配合早期的Controller接口使用)
一句话总结:
HandlerAdapter,适配处理器,负责调用!
小米友情提醒:很多时候,HandlerAdapter+HandlerMapping是成对出现的,处理同一套逻辑的不同环节。
Handler(处理器/控制器)终于到了最熟悉的主角——Handler了!
阿辉笑着补充:
“Handler,其实就是咱们熟悉的Controller,负责具体处理业务逻辑。”
比如:
这里的HelloController就是一个Handler。
方法sayHello()就是处理请求的方法。
一句话总结:
Handler,具体处理请求,返回结果!
小米吐槽一下:有些同学一听Handler就懵了,记住,它就是你的Controller本Controller!
ModelAndView(模型与视图)阿辉继续接着说:
“Handler执行完业务逻辑后,会返回一个ModelAndView对象,包含了处理结果和要跳转的视图名。”
ModelAndView包含两部分:
Model:封装了数据(比如userList、errorMessage)。
View:指定了要渲染的视图名字(比如home.html)。
当然,在现代开发中,如果是接口返回JSON,Model部分更重要,View可能是空的。
一句话总结:
ModelAndView,带着数据和目标视图一起走!
小米小知识卡:Spring Boot里,很多接口直接返回对象(比如@RestController),这时候Spring MVC内部会做简化处理,自动封装成JSON返回~
ViewResolver(视图解析器)业务数据处理好了,下一步,咱们是不是该准备返回页面了?
这时候,ViewResolver(视图解析器)登场了!
阿辉解释:
“ViewResolver的作用是根据View的名字,找到实际的物理视图文件,比如JSP、Thymeleaf模板等等。”
举个例子:
Controller里返回了"home";
ViewResolver把它解析成 /WEB-INF/views/home.jsp。
常见的ViewResolver:
InternalResourceViewResolver(解析JSP)
ThymeleafViewResolver(解析Thymeleaf模板)
BeanNameViewResolver(解析View Bean)
一句话总结:
ViewResolver,找到要渲染的页面文件!
小米小科普:Spring Boot里,默认会根据你用的模板引擎自动配置ViewResolver,比如Thymeleaf或FreeMarker。
View(视图)最后一步了!
找到页面文件之后,就该真正渲染页面啦~
阿辉总结:
“View就是最终展示给用户看的界面,比如一个HTML页面,或者一个JSON数据。”
View负责:
接收Model里的数据;
渲染成最终的页面输出到客户端。
比如:
Thymeleaf模板渲染数据;
JSP页面输出结果;
返回JSON对象。
一句话总结:
View,展示数据,完成响应!
小米再唠叨一句:前端看见的页面,就是View渲染的成果!
一张图总结Spring MVC组件关系小米给大家画了一张流程图:
是不是清清楚楚了!
小结|一口气背下Spring MVC七大组件!最后,小米帮你总结一下,Spring MVC核心组件口诀:
“前端收集 DispatcherServlet,映射HandlerMapping,适配HandlerAdapter,执行Handler,返回ModelAndView,解析ViewResolver,渲染View。”
再简单版一句话总结:
DispatcherServlet + HandlerMapping + HandlerAdapter + Handler + ModelAndView + ViewResolver + View
面试官要是继续追问:
DispatcherServlet的职责?
HandlerMapping和HandlerAdapter分别干嘛的?
ViewResolver能不能自定义?
ModelAndView什么时候用?
放心!听完小米今天这期故事的你,已经能胸有成竹地回答啦!
小彩蛋|面试官偷偷告诉我偷偷告诉你,面试官其实更在意的是:
你能不能画出Spring MVC流程图?
你是不是理解组件之间的配合?
遇到问题,能不能灵活应用,比如自定义HandlerMapping?
所以呀,今天的故事不仅要看,还要自己画画流程,理解组件职责,做到融会贯通哦!
END好啦,今天的故事到这里啦!
如果你觉得小米的分享有帮到你,记得点个【赞】【转发】【在看】支持一下呀!
咱们下期继续讲社招面试故事,比如——
“Spring Boot自动配置原理?”
“分布式系统的CAP定理?”
超有料,不见不散!