【SSM】SSM之SpringMVC框架:SpringMVC的工作原理

客戶端發送的請求被DispatcherServlet捕獲後其流程如下:

在這裏插入圖片描述
其大致流程如下:

  • 1、用戶發送請求至前端控制器DispatcherServlet。

  • 2、DispatcherServlet收到請求調用HandlerMapping處理器映射器。

  • 3、處理器映射器如果沒有找到具體的處理器:

    • 如果配置了<mvc:default-servlethandler/>,就調用默認的Servlet處理找到匹配的靜態資源,如果沒有找到就返回404頁面;
    • 如果沒配置<mvc:default-servlethandler/>,直接返回404頁面。
  • 3、處理器映射器如果找到具體的處理器(可以根據xml配置、註解進行查找),生成處理器對象及處理器攔截器(如果有則生成)一併返回給DispatcherServlet。

  • 4、執行處理器攔截器的preHandle()方法(如果有的話)。

  • 5、DispatcherServlet獲得HandlerAdapter處理器適配器。

  • 5、HandlerAdapter經過適配調用具體的處理器(Controller,也叫後端控制器)。

  • 6、Controller執行完成返回ModelAndView前執行處理器攔截器的postHandle()方法(如果有的話)。

  • 7、Controller執行完成返回ModelAndView。

  • 8、HandlerAdapter將controller執行結果ModelAndView返回給DispatcherServlet。

  • 9、如果有異常,就調用HandlerExceptionResolver組件解析異常生成新的ModelAndView。

  • 10、DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器。

  • 11、ViewReslover解析後返回具體View;

  • 12、DispatcherServlet根據View進行渲染視圖(即將模型數據填充至視圖中)。

  • 13、調用攔截器的afterCompletion()方法(如果有的話)。

  • 14、DispatcherServlet響應用戶。

主要環節解釋如下:

1、DispatcherServlet捕獲請求後,首先查找匹配的handler方法:

  • DispatcherServlet捕獲請求,執行到DispatcherServlet的doDispatch()方法時,在該方法中調用該類的getHandler()方法:
    在這裏插入圖片描述
  • 在該類的getHandler()方法中遍歷所有的handlerMapping,逐個調用其getHandler()方法並將request作爲實參傳遞進去:
    在這裏插入圖片描述
  • 在處理器映射器接口HandlerMapping的實現類AbstractHandlerMapping的getHandler()方法中,根據request獲得一個HandlerExecutionChain對象並返回給DispatcherServlet的getHandler()方法,如果不爲空就返回給doDispatch()方法中的HandlerExecutionChain類型的變量mappedHandler:
    在這裏插入圖片描述

2、如果未找到與請求相匹配的handler方法:

  • 如果配置了<mvc:default-servlethandler/>,就調用默認的Servlet處理找到匹配的靜態資源,如果沒有找到就返回404頁面;
  • 如果沒配置<mvc:default-servlethandler/>,直接返回404頁面。

3、如果找到了與請求相匹配的handler方法,那麼就獲得了一個HandlerExecutionChain對象:

4、獲取處理器適配器HandlerAdapter的實例化對象:

  • 調用DispatcherServlet中的getHandlerAdapter()方法獲得一個處理器適配器HandlerAdapter的實例化對象ha,並同時將HandlerExecutionChain的實例化對象mappedHandler中存儲的handler方法傳遞給處理器適配器ha:
    在這裏插入圖片描述
    在這裏插入圖片描述

5、執行攔截器中的preHandle()方法:

  • 利用HandlerExecutionChain的實例化對象mappedHandler來執行攔截器中的preHandle()方法,攔截器的工作流程可以參考攔截器分析
    在這裏插入圖片描述

6、執行handler方法:

  • 利用處理器適配器HandlerAdapter的實例化對象ha來執行匹配到的handler方法,在該方法中調用對應的方法來解析試圖,並在解析後的視圖返回給該變量之前執行攔截器的postHandle()方法:
    在這裏插入圖片描述

7、如果在執行handler方法期間拋出了異常

  • 那麼在執行processDispatchResult()方法時將調用HandlerExceptionResolver 組件來解析異常,或者返回一個默認視圖,或者返回一個自定義的異常視圖,具體可以參考異常處理
    在這裏插入圖片描述

8、如果沒有異常

  • 那麼在執行processDispatchResult()方法時,會調用render()方法正常解析試圖,並執行請求轉發。render()方法內的流轉,可以參考SpringMVC執行流程
    在這裏插入圖片描述

9、執行攔截器中的afterCompletion()方法:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章