SpringMVC請求處理流程


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM