![9aaee0263344eab5f93592050e5e3bc5.png](https://i-blog.csdnimg.cn/blog_migrate/bec6e095c964794dcc1d770b7c7930e7.jpeg)
SpringMVC执行流程
SpringMVC概述
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的Spring MVC框架或集成其他MVC开发框架。
SpringMVC执行流程概括
SpringMVC框架固然强大,但是其执行流程更是妙不可言。所以我们这次要用一个简单的例子去深究一下SpringMVC的底层执行流程!
如下是SpringMVC的执行流程梗概图,我会在后面的底层流程剖析中重点提到梗概图中的这几个零件,以及它们的作用!
SpringMVC执行流程梗概图(切记:该图只是梳理思路,并不特别严谨,请谅解)
![06160e23bd24fa49d5db493f8905cd92.png](https://i-blog.csdnimg.cn/blog_migrate/178aa01a0067a8951c90760480853d6f.jpeg)
springMVC执行流程
SpringMVC的重要组件(可视化组件)
既然,我们要选择剖析SpringMVC底层执行流程,那肯定是要先分析我们能所看到表面的MVC重要组件。这样我们分析完可视组件后,就能找到分析SpringMVC底层执行流程的入口,所以分析它的重要组件显得更是重要!
SpringMVC的重要组件是由核心的前端控制器(web.xml)、后端控制器(Controller)和spring-mvc.xml配置文件组成。
- 核心的前端控制器: 作为MVC框架,首先要解决的就是如何能收到请求。所以MVC框架大都会设计一款前端控制器(入口或者说起点),选型在Servlet或Filter两者之一,由前端控制器来最率先的工作,接收请求。在SpringMVC中,也不例外,前端控制器的选型确定为Servlet(DispatcherServlet),此前端控制器在接收请求后,还会负责SpringMVC的核心调度管理,所以既是前端又是核心。
- 后端控制器: 后端控制器为Controller,等价于之前定义的Servlet。MVC框架中,后端控制器也是必不可少的重要组件之一。因为它接收了用户请求的大量数据参数对象(或Json)存储在域中方便页面(JSP)取值,或是携带着这些数据返回所需要跳转(重定向或请求转发)的页面。这里值得注意的是,后端控制器本质并不是一个普通的Servlet,也不是BaseServlet,它只是一个普通的类,里面却像曾经的BaseServlet一样可以拥有很多个方法,这些方法在SpringMVC中成为一个个Handler(换汤不换药,本质仍然)。所以在MVC模式的执行流程环节中,后端控制器控制着页面的跳转和数据的传递,在这里也有着很高的地位。
- spring-mvc.xml配置文件: 该配置文件配置着许多在执行过程中需要加载的组件,比如:注解扫描器、注解扫描驱动、试图解析器、静态资源处理器、异常解析器、拦截器、上传解析器等等,如果我们要使用这些组件,就需要在该配置文件中注入这些组件的相关配置,注入配置后由SpringMVC工厂在执行过程中加载这些组件,以达成我们使用这些组件的目的。所以这也是它受人青睐的原因。
SpringMVC执行流程剖析
上述得知,我们执行流程剖析的入口既是核心的前端控制器,即web.xml,那我们有资格了解该前端控制器中配置了什么!如下:
前端控制器
![f61ee445fcdeefcea5b5693595d3c800.png](https://i-blog.csdnimg.cn/blog_migrate/ec5d412146f962ad38cf356191d82569.jpeg)
由上图所知,前端控制器中所包含的即是同时启动SpringMVC工厂和Spring工厂,让两个工厂同时运作处理请求,并作出响应。既然要剖析SpringMVC的底层执行流程,那我们要从加载SpringMVC工厂的DispatcherServlet说起。首先进入到DispatcherServlet中,查看源代码所有方法,如下图所示:
DispatcherServlet源码所有方法
![d213dfec5abdb082e46ef8f78d88145d.png](https://i-blog.csdnimg.cn/blog_migrate/33cd2cec3eb73c6109e08b0597dbdd7e.jpeg)
Di