SpringMVC是使用Spring进行web开发的一个重要模块。
可以这样来看待MVC的职责,M(model)可以对应于service层或dao层,负责对实体类或者说数据进行处理;V(view)对应于jsp文件,负责向用户显示各种视图;C(controller)对应于controller层,负责对请求进行转发。
下图是SpringMVC的工作流程图。

流程图一目了然,但是相对比较抽象。下面就结合源码说明一下流程中的各个步骤。
因为整个处理流程是以DispatcherServlet为核心运作的,所以首先看一下DispatcherServlet的核心方法doDispatch。图一和图二都是doDispatch方法的代码,由于一张图截不完整,所以截成两张图。
从上面两张图中可以看出,DispatcherServlet的doDispatch方法控制了SpringMVC的整个工作流程,这与开篇的SpringMVC工作流程图是吻合的。
下面就贴近底层看一下更多的细节。
首先来看DispatcherServlet是如何从HandlerMappings中获取handler的。

从图中可以看到,DispatcherServlet是持有一堆HandlerMapping的,一个HandlerMapping是对一个URL和一个Handler的封装,并且HandlerMapping中的handler并不一定就是handler对象,也有可能是handler的名字。如果只是handler名,则从applicationContext中拿对应的Handler。
DispatcherServlet拿到HandlerExecutionChain之后,还要获取与HandlerExecutionChain中的Handler的适配器。如下图所示。
DispatcherServlet拿到HandlerAdapter之后开始调用它执行相应的handler中相应的方法。对于如何执行相应的方法,先不去深究。
总之,最后会拿到一个ModelAndView,ModelAndView在processDispatchResult方法中被处理。下面四张图是按照执行顺序给出的各个方法的源码。

可以看到,经过层层调用,最终由ViewResolver(DispatcherServlet持有一个ViewResolver列表)根据ModelAndView中的viewName解析出View对象,View对象再根据ModelAndView中的Model对View对象进行渲染(说白了,就是将Model中的数据填充到View对象中)。
讲完了SpringMVC的工作流程之后,我们也能够看出配置文件的一些端倪。
配置文件的目录结构如下图所示。
SpringMVC在启动时,首先要读取web.xml文件,读取关于DisptcherServlet的配置,如下图所示。这里配置了哪些请求要走DispatcherServlet,配置了从哪里读取上下文配置信息。
spring-mvc.xml文件的配置信息如下:
从扫描的路径配置可以推测,在扫描的过程,会将Handler存入applicationContext对象中,以便AbstractHandlerMapping能够从applicationContext中拿到真正的handler;同时还会将Handler类中的方法上配置的RequestMapping信息存入HandlerMapping中。
从视图解析器的配置中可以推测,所有的解析器对象最终都会存入viewResolvers对象中,用于视图的解析。
大概就是这样了。
有兴趣想深究的小伙伴们可以继续深入追踪源码看看。
我这篇文章的目的是要抓住SpringMVC的主脉络:)
欢迎关注博主个人微信公众号~~~
