关键点解析
② 号线
DispatcherServlet 需要获取一个执行链
DispatcherSevlet:核心控制器。
实质也是一个HttpServlet。负责将请求分发,所有的请求都有经过它来统一分发。
HandlerMapping:适配器,处理器映射管理
作用:根据【请求】找到【处理器Handler】,但并不是简单的返回处理器,而是
将处理器和拦截器封装,形成一个处理器执行链(HandlerExecuteChain)。
Handler:处理器(Controller的Bean本身和请求Method的包装)
HandlerExecutionChain:执行链(handler 的二次包装,将handler与拦截器链关联到了一起)
小结:
为什么要引入适配器(HandlerMapping)?
因为处理器(Handler)有很多种,DispatcherServlet没办法统一管理,所以出现了适配器。
让适配器统一处理 Handler,而DispatcherServlet统一处理适配器(HandlerMapping)。
根据请求去找对应的 Handler注意:这里其实拿到的是 Handler(处理器) 的二次包装 HandlerExecutionChain(执行链)
③ 号线
DispatcherServlet 拿着执行链去寻找对应的处理器适配器
(HandlerAdapter),拿到处理后返回的 ModelAndView
当handlerMapping 获取到执行请求的 controller 时,DispatcherServlte会根据 controller 对应的 controller 类型来调用相应的 HandlerAdapter 来进行处理。
HandlerAdapter:处理适配器,调用具体的方法对用户发来的请求来进行处理。处理的结果是返回 ModelAndView 。
④ 号线
Handler 执行完成后,向 DispatcherServlet 返回一个ModelAndView对象
HttpMessageConverter
主要功能在于Java对象和Json Xml等Http消息格式之前的来回转换
HttpMessageConveter:Http消息转换器,将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息
- 数据转换:对请求消息进行数据转换。如String转换成Integer、Double等
- 数据格式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等
- 数据验证:验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中
⑤ 号线
处理器适配器(HandlerAdapter)将处理好的ModelAndView返回给DispatcherServlet
ModelAndView:是代表了MVC Web程序中 Model 与 View的对象
小结:
为什么要返回 ModelAndView?
只是方便你一次返回这两个对象 Model 与 View 两者仍是分离的概念。
- Model:模型,存储数据而且所有数据都是 model 中的 key,value 的关系
- View:视图,作用是渲染模型数据,将模型里的数据以某种形式呈现给客户
⑥ 号线
ViewResolver:视图解析器。结合Model和View,来渲染视图(Model+View合成)
小结:
视图解析器到底做了什么?
视图解析器的主要作用就是将逻辑视图转换成用户可以看到的物理视图。
下面举例说明逻辑视图和物理视图:
逻辑视图:success (例如你配了自定义视图解析器,返回时只用给页面名字)
物理视图:/WEB-INF/success.jsp
视图解析器将 success 这个字符串名字,进行前缀和后缀的拼接得到客户可以访问的页面完整地址名字 /WEB-INF/success.jsp
视图解析器和视图的关系是什么?
视图对象由视图解析器负责实例化。举例几个常见的视图实现类:
⑦ 号线
Model 携带后台封装数据到页面,让 View 解析渲染出来
小结:
SpringMVC 到底在做什么?
MVC是软件工程中一种常用的规范的设计模式,model(模型层)-view(视图层)-controller(控制层)。
模型包括了你的数据模型(pojo或bean之类的东西)和业务模型(比如登陆,注册操作等),而 controller 层就是将你的 model 层能在 view 中表示出来
执行流程
- 浏览器发送一个请求,核心控制器(DispatcherSevlet)拦截所有的请求
- 核心控制器(DispatcherSevlet)拿到不同的请求,通过映射适配器(HandlerMapping),获取处理器执行链
- 核心控制器找到处理适配器(HandlerAdpater),让它处理执行链
- 消息转换器(HttpMessageConverter )处理一些列数据、消息
- 执行完毕的处理器(Handler)返回 ModelAndView 给适配器(HandlerAdpater),由适配器返回给核心控制器
- 核心控制器拿到将 ModelAndView 给到 视图解析器(ViewResolver)进行逻辑视图到物理视图的转换
- 核心控制器将 Model 数据渲染到 View
- 将最终渲染了 Model 数据的 View 响应给浏览器