SpringMVC常见面试问题
# Spring MVC
# 1 说说对MVC的了解?
MVC是模型(Model)、视图(VIew)、控制器(Controller)的简写,其核心思想是通过将业务逻辑、数据、显示分离来组织代码。降低了视图与业务逻辑的耦合。
Model:数据模型,提供要展示的数据,包含数据和业务(dao和service)。
View:负责模型的展示,一般就是我们见到的用户界面。
Controller:接收用户请求,委托模型进行处理,处理完毕后把返回的模型数据返回给视图,视图负责展示。
Model 1时代
在Web早期开发中,主要分为两层:视图层、模型层
优点:架构简单,适合小项目开发;
缺点:JSP职责不单一,职责过重,不利于维护。
Model 2 时代
Java Bean(Model)+ JSP(View)+ Servlet(Controller)
- Model:系统涉及的数据,也就是dao和bean
- View:展示模型中的数据,只是用来展示
- Controller:处理用户请求,返回数据给JSP并展示给用户。
Model 2的抽象程度和封装程度远远不够,无法避免重复造轮子,大大降低程序的维护性和复用性。
# 2 Spring MVC 主要组件
1)DispatcherServlet
是一种前端控制器,由框架提供。
作用:统一处理请求和响应。除此之外还是整个流程控制的中心,由 DispatcherServlet 来调用其他组件,处理用户的请求
2)HandlerMapping
处理器映射器,由框架提供。
作用:根据请求的 url、method 等信息来查找具体的 Handler(一般来讲是Controller)
3)Handler(一般来讲是Controller)
处理器,注意,这个需由工程师自己开发。
作用:在 DispatcherServlet 的控制下,Handler对具体的用户请求进行处理
4)HandlerAdapter
处理器适配器 ,由框架提供。
作用:根据映射器找到的处理器 Handler 信息,按照特定的规则去执行相关的处理器 Handler。
小结:
Handler 是用来干活的工具;
HandlerMapping 用于根据需要干的活找到相应的工具;
HandlerAdapter 是使用工具干活的人。
5)ViewResolver
视图解析器,由框架提供。
作用: ViewResolver 负责将处理结果生成 View 视图。 ViewResolver 首先根据逻辑视图名解析成物理图名,即具体的页面地址,再生成 View 视图对象,最后对 View 进行渲染将处理结果通过页面展示给用户。
6)View
视图,工程师自己开发
作用:View接口的职责就是接收model对象、Request对象、Response对象,并渲染输出结果给Response对象。
# 3 SpringMVC 工作流程
- 用户通过浏览器发起 HttpRequest 请求到前端控制器 (DispatcherServlet)。
- DispatcherServlet 将用户请求发送给处理器映射器 (HandlerMapping)。
- 处理器映射器 (HandlerMapping)会根据请求,找到负责处理该请求的处理器(handler),并将其封装为处理器执行链返回 (HandlerExecutionChain) 给 DispatcherServlet
- DispatcherServlet 会根据处理器执行链中的处理器,找到能够执行该处理器的处理器适配器(HandlerAdaptor) --注,处理器适配器有多个
- 处理器适配器 (HandlerAdaptoer) 会调用对应的具体的 Controller
- Controller 将处理结果及要跳转的视图封装到一个对象 ModelAndView 中并将其返回给处理器适配器 (HandlerAdaptor)
- HandlerAdaptor 直接将 ModelAndView 交给 DispatcherServlet ,至此,业务处理完毕
- 业务处理完毕后,我们需要将处理结果展示给用户。于是DisptcherServlet 调用 ViewResolver,将 ModelAndView 中的视图名称封装为视图对象
- ViewResolver 将封装好的视图 (View) 对象返回给 DispatcherServlet
- DispatcherServlet 调用视图对象,让其自己 (View) 进行渲染(将模型数据填充至视图中),形成响应对象 (HttpResponse)
- 前端控制器 (DispatcherServlet) 响应 (HttpResponse) 给浏览器,展示在页面上。