springmvc工作流程以及相关源码解析

springmvc经典流程图:

图一

图二

SpringMVC流程

1、  用户发送请求至前端控制器DispatcherServlet。

web.xml中配置DispatcherServlet,如图:


2、  DispatcherServlet收到请求调用HandlerMapping处理器映射器。



HandlerMapping定义请求和处理程序对象之间的映射。


其中:

 RequestMappingHandlerMapping :用于注解@Controller,@RequestMapping来定义controller.

如:

BeanNameUrlHandlerMapping:查找spring容器中和请求的url同名的bean.这个映射器不需要配置,因为spring在找不到handlerMapping的情况下会使用BeanNameUrlHandlerMapping.如果一定要配置,像下面这样就行了:
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
比如有一个请求/index.htm, 则就会找到一个名叫/index.htm的bean来处理这个请求; 这种做法让我们可以做出虚拟目录的效果:
<bean name="/user/index.htm" class="controller.TestController" />

<bean name="/admin/index.htm" class="controller.TestController" />

SimpleUrlHandlerMapping: 这个handlerMapping可以配置请求的url和handler的映射关系


3、  处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。

HandlerMapping生成处理器执行链(HandlerExecutionChain),包括Handler ObjectHandler Interceptors(处理器拦截器)

4、  DispatcherServlet调用HandlerAdapter处理器适配器。

处理器适配器(HandlerAdapter):会把处理器包装成适配器,这样就可以支持多种类型的处理器,类比笔记本的适配器(适配器模式的应用)



5、 调用preHandle(WebRequest request) 方法

    该方法将在请求处理之前进行调用,也就是说会在Controller 方法调用之前被调用。这个方法跟HandlerInterceptor 中的preHandle 是不同的,主要区别在于该方法的返回值是void ,也就是没有返回值,所以我们一般主要用它来进行资源的准备工作,比如我们在使用Hibernate 的时候可以在这个方法中准备一个Hibernate 的Session 对象,然后利用WebRequest 的setAttribute(name, value, scope) 把它放到WebRequest 的属性中。



6、  HandlerAdapter经过适配调用具体的处理器(Handler)(Controller,也叫后端控制器)。

7、  Controller执行完成返回ModelAndView。

8、  HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。

9、调用postHandle(WebRequest request) 方法

    该方法将在请求处理之后,也就是在Controller 方法调用之后被调用,但是会在视图返回被渲染之前被调用,所以可以在这个方法里面通过改变数据模型ModelMap 来改变数据的展示。



10、  DispatcherServlet将ModelAndView传给ViewReslover视图解析器。

11、  ViewReslover解析后返回具体View。

12、 DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。

13、 DispatcherServlet响应用户。

14、 调用afterCompletion(WebRequest request, Exception ex) 方法。

        该方法会在整个请求处理完成,也就是在视图返回并被渲染之后执行。所以在该方法中可以进行资源的释放操作。

注:10、11、12、13步按照源码的调用顺序如下图:


如果出现异常,由异常处理器(HandlerException)处理





猜你喜欢

转载自blog.csdn.net/cb_lcl/article/details/80781850
今日推荐