springmvc经典流程图:
图一
图二
SpringMVC流程
1、 用户发送请求至前端控制器DispatcherServlet。
web.xml中配置DispatcherServlet,如图:
2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。
HandlerMapping定义请求和处理程序对象之间的映射。
其中:
RequestMappingHandlerMapping
如:
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 Object 和 Handler 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)处理