Spring MVC請求處理架構圖:

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將渲染后的頁面返回給前台,請求結束。