SpringMVC原理探究

本文详细解析了SpringMVC的工作流程,从DispatcherServlet的核心方法doDispatch出发,深入介绍了如何获取Handler、HandlerAdapter及ModelAndView的处理过程。此外,还探讨了配置文件的关键作用。

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的主脉络:)

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值