SpringMVC请求处理流程
Spring MVC请求处理架构图:
![](https://images2018.cnblogs.com/blog/1289106/201802/1289106-20180226162913049-1741907962.png)
1、DispatchServlet:Spring MVC的核心控制器,作为SpringMVC请求处理以及请求返回的统一入口,进行全局的流程控制。
2、HandlerMapping:处理映射器,根据请求的url映射到对应的处理器(Controller)的某个处理方法上,映射成功后返回一个HandlerExecutionChain对象(处理器执行链),其中包括处理器(Controller)以及拦截器。 常用的HandlerMapping实现类:
a、BeanNameUrlHandlerMapping: 根据url和Bean的name进行映射找到处理器对象Controller,Bean的name属性定义是已“/"开头,如:<bean name="/user/login.do" class="com.spring.web.controller.LoginController"/>,通常Controller要实现Controller接口,实现要处理请求的方法,与SimpleControllerHandlerAdapter联合使用。
b、SimpleUrlHandlerMapping: 和BeanNameUrlHandlerMapping一样根据url和bean的name进行映射,但是功能更强大。
c、DefaultAnnotationHandlerMapping: spring3.1之前spring2.5后使用,用于根据注解@Controller和@RequestMapping和url进行映射找到对应的处理器Controller和处理方法。
d、RequestMappingHandlerMapping: spring3.1后使用,也是根据注解@Controller和@RequestMapping和url进行映射匹配对象的处理器Controller和处理方法。
注意: HandlerMapping接口定义一个方法:
HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception;
由具体的HandlerMapping实现类来实现,其中定义了映射规则,根据映射规则找到合适的处理器对象和指定方法,最终返回一个HandlerExecutionChain 对象。
DispatchServlet接收到请求后,会根据顺序遍历Spring容器中的HandlerMapping对象(可以注册多个HandlerMapping处理器映射器对象),根据每个HandlerMapping对象的映射规则找到对应的处理器Controller和处理方法,如当遍历到RequestMappingHandlerMapping对象时,RequestMapping HandlerMapping对象会遍历容器中的所有使用了@Controller注解的bean,在根据@RequestMapping注解和url进行匹配,找到对应的Controller对象和处理方法。当找到合适的Controller和处理方法后,则停止遍历HandlerMapping对象。
DispatchServlet请求处理方法doDispatch()方法中实现:
getHandler()方法实现,就是遍历所有HandlerMapping对象,进行处理器映射:
3、HandlerAdapter:处理器适配器,使用了适配器模式,将处理器映射器找到的处理器对象和处理方法适配成DispatchServlet所需要的请求处理方法(目标接口),这样DispatchServlet调用统一的请求处理接口完成请求处理,处理器适配器HandlerAdapter的功能就是将我们自定义的前端控制器Controller适配成DispatchServlet需要的接口。
根据Spring MVC实现前端控制器的方式不同,则对应的适配器要不同,常见的HandlerAdapter有:
a、SimpleControllerHandlerAdapter:要求Controller控制器实现Controller接口,以及实现接口中的方法handleRequest()方法来处理请求,通常和处理映射器BeanNameUrlHandlerMapping或者SimpleUrlHandlerMapping联合使用。
b、DefaultAnnotationHandlerAdapter:适配使用注解@Controller和@RequestMapping标识的处理器,spring3.1之前spring2.5后使用,和DefaultAnnotationHandlerMapping联合使用。
c、RequestMappingHandlerAdapter:适配使用注解@Controller和@RequestMapping标识的处理器,spring3.1后使用,替换了DefaultAnnotationHandlerAdapter,和RequestMappingHandler Mapping联合使用。
注意:handlerAdapter接口中定义了几个方法,有具体处理器适配器来实现:
boolean supports(Object handler);判断该适配器能否支持适配当前的处理器handler
ModelAndView handle(HttpServletRequest request,HttpServletResponse response, Object handler)throws Exception;DispatchServlet处理请求所需要的目标接口,在其方法实现中完成适配,来处理及准备ch处理器方法中的参数及Annotation,最后调用处理器的指定方法.
DispatchServlet遍历HandlerMapping获取HandlerExecutionChain对象后,遍历spring容器中的所有HandlerAdapter对象,查看当前处理器适配器对象是否能够支持适配找到的处理器对象Controller,能则调用适配器的接口handle()方法处理请求,处理前有拦截器的先执行拦截处理
DispatchServlet请求处理方法doDispatch()方法中实现:
getHandlerAdapter()方法实现:
4、ViewResolver:视图解析器,请求处理完后,DispatchServlet会受到请求处理结果(包括模型数据和逻辑视图),DispatchServlet会找到Spring容器中的ViewResolver对象将逻辑视图解析成物理页面文件。注意对于使用了@ResponseBody注解的方法,DispatchServlet会使用合适的消息转换器将请求处理结果转换后返回给前台。
5、DispatchServlet找到物理视图文件后,DispatchServlet使用视图模板引擎将模型数据渲染到物理视图页面中,最后DispatchServlet将渲染后的页面返回给前台,请求结束。