Spring MVC中各组件初始化过程已在上篇分享
:初始化过程
一、SpringMVC罕用组件
- DispatcherServlet:
前端控制器
,对立解决申请和响应,整个流程管制的核心,由它调用其它组件解决用户的申请 - HandlerMapping:
处理器映射器
,依据申请的url、method等信息查找Handler,即控制器办法 - Handler:
处理器
,在DispatcherServlet的管制下Handler对具体的用户申请进行解决 - HandlerAdapter:
处理器适配器
,通过HandlerAdapter对处理器(控制器办法)进行执行 - ViewResolver:
视图解析器
,不须要工程师开发,由框架提供,进行视图解析 - View:
视图
将模型数据通过页面展现给用户
二、DispatcherServlet(前端控制器)的继承构造
IDEA中快捷键Ctrl+Shift+Alt+U
可查看继承图
从上图中能够看到DispatcherServlet的顶层接口是Servlet
三、调用组件解决申请过程
$\color{#F00}{尽管咱们看的是不同类中的调用过程,如果通过继承或者实现放到同一个类中}$
$\color{#F00}{其实咱们就是在同一个类中来查看办法的调用。}$
1.Servlet接口
从Servlet接口开始步步剖析,在Servlet接口中存在下图中的5种形象办法。
快捷键: Alt+7
用户每次发送申请时,Servlet容器都会调用service()
办法对申请进行解决
public interface Servlet { public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException; }
2.GenericServlet抽象类
public abstract class GenericServlet implements Servlet, ServletConfig, java.io.Serializable { //能够看到并没有对Servlet中的service()办法进行实现 @Override public abstract void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;}
GenericServlet没有对Servlet中的service()办法进行实现,那么依据继承构造持续向下梳理
3.HttpServle抽象类
能够看到又调用了service(request, response)
办法,如下图
申请形式有以下几种
依据req.getMethod()
获取申请形式调用对应的doGet,doPut等等
办法,持续向下看
4.HttpServletBean抽象类
能够发现HttpServletBean没有重写service()
办法,用的是父类HttpServle中的办法
5.FrameworkServlet抽象类
FrameworkServlet中重写了doGet
等办法,则应用本类中重写后的办法
能够看到无论service中的那个逻辑,都执行processRequest(request, response)
办法,所以咱们只需查看该办法即可
6.DispatcherServlet类
6.1执行流程图
为什么说doDispatcher()是整个流程管制的核心,由它调用其它组件解决用户的申请? 那么看下文流程即可明确
用户向服务器发送申请,申请被SpringMVC 前端控制器 DispatcherServlet捕捉。
执行流程图
大家能够对照图来看接下来的流程
6.2图中第的2,3
步处理器映射器
就是这一步返回处理器执行链蕴含拦截器
以后类重写了父类中的doservice
()办法,又发现该办法的外围是doDispatcher
办法,重点来了
咱们来看该办法实现
6.3图中第的4,5,6,7
步处理器适配器
1.蕴含拦截器的执行逻辑
接下来就到拦截器的前置办法,首先看下拦截器的执行程序,不便了解接下来的代码流程
请观赏源码流程:
紧接上图中的适配器办法
拦截器的前置办法
对应上图的逻辑解决(对上图详解)
正序
下来是理论调用处理程序办法 返回ModelAndView对象
拦截器的后置办法
6.4图中第的8,9,10
步
>进入该办法查看
看拦截器的最初执行办法
返回用户
五、总结
1.简略总结
1
. Spring MVC所有的申请都通过DispatcherServlet来对立散发。DispatcherServlet将申请分发给Controller之前,须要借助于Spring MVC提供的HandlerMapping定位到具体的Controller。2
. HandlerMapping接口负责实现客户申请到Controller映射。3
. Controller接口将解决用户申请,这和Java Servlet表演的角色是统一的。一旦Controller解决完用户申请,则返回ModelAndView(数据和视图)对象给DispatcherServlet前端控制器。从宏观角度思考,DispatcherServlet是整个Web利用的控制器;从宏观思考,Controller是单个Http申请处理过程中的控制器,而ModelAndView是Http申请过程中返回的模型(Model)和视图(View)。4
.返回的视图须要通过ViewResolver接口(视图解析器)在Web利用中负责查找View对象,从从而将相应后果渲染给客户。
2.具体总结
1
. 用户向服务器发送申请,申请被SpringMVC 前端控制器 DispatcherServlet捕捉2
. DispatcherServlet对申请URL进行解析,失去申请资源标识符(URI),判断申请URI对应的映射3
. 依据该URI,调用HandlerMapping取得该Handler配置的所有相干的对象(包含Handler对象以及Handler对象对应的拦截器),最初以HandlerExecutionChain执行链对象的模式返回。4
. DispatcherServlet 依据取得的Handler,抉择一个适合的HandlerAdapter。5
. 如果胜利取得HandlerAdapter,此时将开始执行拦截器的preHandler(…)办法【正向】6
. 提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)办法,解决申请。在填充Handler的入参过程中,依据你的配置,Spring将帮你做一些额定的工作:
6.1. HttpMessageConveter: 将申请音讯(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息
6.2 HttpMessageConveter: 将申请音讯(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息
6.3 数据转换:对申请音讯进行数据转换。如String转换成Integer、Double等
6.4 数据格式化:对申请音讯进行数据格式化。 如将字符串转换成格式化数字或格式化日期等
6.5 数据验证: 验证数据的有效性(长度、格局等),验证后果存储到BindingResult或Error中
7
. Handler执行实现后,向DispatcherServlet 返回一个ModelAndView对象。8
. 此时将开始执行拦截器的postHandle(...)办法【逆向】。9
. 依据返回的ModelAndView(此时会判断是否存在异样:如果存在异样,则执行HandlerExceptionResolver进行异样解决)抉择一个适宜的ViewResolver进行视图解析,依据Model和View,来渲染视图。10
. 渲染视图结束执行拦截器的afterCompletion(…)办法【逆向】。11
. 将渲染后果返回给客户端。