SpringMVC - 源码解析

Spring MVC的工作流程

 1. SpringMVC的请求入口在DispatcherServlet的doDispatch方法内,通过基类FrameworkServlet的doService来调用的。这里就不多解释了,大家自己看,比较简单。

2. 通过HandlerMapping获取HandlerExecutionChain, 看下面doDispatch里面获取handlerExecutionChain

 

HandlerMapping有一个重要的实现类RequestMappingHandlerMapping, 这个就是用来处理@RequestMapping注解处理的Controller的。

跟进上面的getHandler方法,我们会进入下面的方法,这里的handler是一个HandlerMethod的实例,最终会封装成HandlerExectionChain, 它里面除了handler还有拦截器HandlerInterceptor。

 下面是HandlerMethod类的定义:

 跟进getHandlerInternal方法,我们看到最终是从这个registry里,获得MappingRegistration, 它里面就有HandlerMethod, 而HandlerMethod内部就包含的Controller以及method的信息。

 3. 第二步获取到HandlerExectionChain后,我们来看看是如何执行的Controller, 它是通过一个HandlerAdapter来执行的。看下面的代码。

 接口HandlerAdapter有个实现类RequestMappingHandlerAdapter,继续往下看,在ha.handle方法里面会执行Controller我们自己写的方法,在这之前和之后,我们看到它执行的拦截器的前置和后置处理器。

跟踪ha.handle最终会进入invokeHandlerMethod方法,里面ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);封装了ServletInvocableHandlerMethod类的实例,最终通过invocableMethod.invokeAndHandle(webRequest, mavContainer),在方法内部调用controller的方法。

 进入到ServletInvocableHandlerMethod类的方法invokeAndHandle

 这里的returnValueHandlers内部有很多返回值的处理器,通过不同的返回处理不同的结果。

 回到RequestMappingHandlerAdapter里面,处理结果保存在mavContainer里面,之后封装ModelAndView,。

 注意,如果mavContainer里面isRequestHandled()返回true, 就返回null, 这种像@ResponseBody注解就直接把结果写到response了,不会再有后续处理的,对于需要渲染的页面,还得再进行后续处理。

4. 上面返回ModelAndView后,对应第一张图的步骤5,6,是在下面的processDispatchResult方面里面实现的

 进入方法里面,最终通过render方法输出页面。

 进去后,会通过viewName获取到具体的view, 最后调用view.render方法渲染页面

 

 ViewResovler接口的实现有下面这些,其中InternalResourceViewResolver是不是很熟悉,用来处理jsp文件的。

 这里的View的实现类也有很多,看看下面类:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值