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