客戶端發送的請求被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()方法: