SpringMVC原理探究

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

下图是SpringMVC的工作流程图。


image.png

流程图一目了然,但是相对比较抽象。下面就结合源码说明一下流程中的各个步骤。

因为整个处理流程是以DispatcherServlet为核心运作的,所以首先看一下DispatcherServlet的核心方法doDispatch。图一和图二都是doDispatch方法的代码,由于一张图截不完整,所以截成两张图。

图一
图二

从上面两张图中可以看出,DispatcherServlet的doDispatch方法控制了SpringMVC的整个工作流程,这与开篇的SpringMVC工作流程图是吻合的。

下面就贴近底层看一下更多的细节。

首先来看DispatcherServlet是如何从HandlerMappings中获取handler的。

image.png
image

从图中可以看到,DispatcherServlet是持有一堆HandlerMapping的,一个HandlerMapping是对一个URL和一个Handler的封装,并且HandlerMapping中的handler并不一定就是handler对象,也有可能是handler的名字。如果只是handler名,则从applicationContext中拿对应的Handler。

DispatcherServlet拿到HandlerExecutionChain之后,还要获取与HandlerExecutionChain中的Handler的适配器。如下图所示。

image

DispatcherServlet拿到HandlerAdapter之后开始调用它执行相应的handler中相应的方法。对于如何执行相应的方法,先不去深究。

总之,最后会拿到一个ModelAndView,ModelAndView在processDispatchResult方法中被处理。下面四张图是按照执行顺序给出的各个方法的源码。

image.png
image
image
image

可以看到,经过层层调用,最终由ViewResolver(DispatcherServlet持有一个ViewResolver列表)根据ModelAndView中的viewName解析出View对象,View对象再根据ModelAndView中的Model对View对象进行渲染(说白了,就是将Model中的数据填充到View对象中)。

讲完了SpringMVC的工作流程之后,我们也能够看出配置文件的一些端倪。

配置文件的目录结构如下图所示。

image

SpringMVC在启动时,首先要读取web.xml文件,读取关于DisptcherServlet的配置,如下图所示。这里配置了哪些请求要走DispatcherServlet,配置了从哪里读取上下文配置信息。

image

spring-mvc.xml文件的配置信息如下:

image

从扫描的路径配置可以推测,在扫描的过程,会将Handler存入applicationContext对象中,以便AbstractHandlerMapping能够从applicationContext中拿到真正的handler;同时还会将Handler类中的方法上配置的RequestMapping信息存入HandlerMapping中。

从视图解析器的配置中可以推测,所有的解析器对象最终都会存入viewResolvers对象中,用于视图的解析。

大概就是这样了。

有兴趣想深究的小伙伴们可以继续深入追踪源码看看。

我这篇文章的目的是要抓住SpringMVC的主脉络:)

欢迎关注博主个人微信公众号~~~

image
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容