这篇博客主要是文字表达,至于源码部分我之前的三篇博客有详细的源码分析;只不过是三个部分,整合一下即可,另外,这里文字部分也借鉴了一篇博客(那篇博客我感觉文字表达的挺好的,建议学习):
我的博客:一个*.do 请求的执行过程 自定义视图的执行过程 拦截器小结 借鉴博客:SpringMVC工作原理
图1
注意:该图的数字并不是执行步骤,而是为了说明特此标识;另外,为了便于理解SpringMVC的运行原理,我们姑且这样认为:可以先判断自己是否设置 Handler 处理器,如果没有,则往上走红色部分,如果有,则往下从 绿色部分;即把判断是否有处理器提到前面了。
组件:(该部分搬运借鉴博客的,方便了解各组件的名称和作用)
1、前端控制器DispatcherServlet(不需要工程师开发),由框架提供
作用:接收请求,响应结果,相当于转发器,中央处理器。有了dispatcherServlet减少了其它组件之间的耦合度。
用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。
2、处理器映射器HandlerMapping(不需要工程师开发),由框架提供
作用:根据请求的url查找Handler
HandlerMapping负责根据用户请求找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。
3、处理器适配器HandlerAdapter
作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler
通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
4、处理器Handler(需要工程师开发)
注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler
Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。
由于Handler涉及到具体的用户业务请求,所以一般情况需要工程师根据业务需求开发Handler。
5、视图解析器View resolver(不需要工程师开发),由框架提供
作用:进行视图解析,根据逻辑视图名解析成真正的视图(view)
View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。 springmvc框架提供了很多的View视图类型,包括:jstlView、freemarkerView、pdfView等。
一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由工程师根据业务需求开发具体的页面。
6、视图View(需要工程师开发jsp...)
View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf...)
图2
一、前端控制器 DispatcherServlet 收到请求,之后调用 HandlerMapping 处理器映射器,处理器映射器找到具体的处理器并生成处理链对象返回给 DispatcherServlet ;对应 图1 的 1、2部分 和 图2 的 a部分;其中 a 中方法的代码:
二、前端控制器(DispatcherServlet)调用处理器适配器(HandlerAdapter)去执行处理器(Handler),即 图1 的 3 和 图2 中 b部分;
三、若配置拦截器,则执行 图2 中 c部分代码,对应 图1 的 4;详细可以看我的博客:拦截器小结
四、处理器适配器去执行Handler,并将 ModelAndView 返回给 执行链对象,即 图1 的 5 和 图2 中 d部分;
五、同三,即 图1 的 6 和 图2 中 e部分 代码;
以布源码在我上面链接的博客中有详述,因此不再截图。
六、进行 图2 中 f部分 代码进入 processDispatchResult 方法;进行判断是否有异常;对应 图1 的 7、8;
七、若没有发生异常则进入 render 方法解析 ModelAndView 得到指定视图并执行其中的方法;对应 图1 的 9;
八、渲染视图并响应客户端,若配置拦截器,则接着执行 AfterCompletion 方法释放资源;对应 图1 的 10、11、12.