瀏覽器發送請求至中央調度器 DispatcherServlet.
中央調度器 DispatcherServlet 收到請求后,首先對請求進行了一個簡單判斷,判斷其為簡單請求,還是Multipart 請求。然后中央調度器遍歷每一個處理器映射器HandlerMapping,將請求交給每一個處理器映射器進行匹配。
處理器映射器 HandlerMapping 接收到中央調度器傳遞來的請求后,對請求進行解析。
根據解析結果,找到與請求相對應的處理器對象,并將其包裝為處理器執行鏈 HandlerExecutionChain 對象,返回給中央調度器。
所以處理器映射器顧名思義,就是將請求映射為處理器。
由于處理器的種類不只一種,不同的處理器需要不同的處理器適配器 HandlerAdapter 來執行。所以中央調度器在接收到處理器映射器 HandlerMapping 發送來的處理器執行鏈對象 HandlerExecutionChain 后,根據處理器執行鏈中的處理器,查找到與之相應的處理器適配器對象 HandlerAdapter。
當然,此時中央調度器除了找到相應的處理器適配器外,還做了一個工作:執行處理器執行鏈中的攔截器前端方法。
中央調度器根據處理器執行鏈中的處理器找到相應的處理器適配器,并在執行完處理器 執行鏈中的攔截器前端方法后,立即調用處理器適配器,讓其執行處理器。
處理器適配器執行處理器后,處理器將 ModelAndView 返回給處理器適配器。
處理器適配器在接收到處理器返回的 ModelAndView 后,直接將 ModelAndView 返回給中央調度器。
中央調度器在接收到處理器適配器發送來的 ModelAndView 后,并不是將其作為最終的調度結果,而是首先調用執行處理器執行鏈中的攔截器后端方法。因為中央處理器將ModelAndView 對象傳遞給了攔截器的后端方法,使后端方法可以修改 ModelAndView。
處理器執行鏈的攔截器后端方法執行完畢后,形成最終的調度結果,所以中央調度器馬上進行調度結果的處理,對處理結果 ModelAndView 進行渲染。而這個渲染的過程,其實是中央調度器遍歷所有視圖解析器,并根據不同的視圖類型由相應的視圖解析器形成相應的視圖對象的過程。
視圖解析器的工作很簡單,將視圖名稱與響應目標定位對象進行綁定,形成視圖對象返回給中央調度器。
在找到相應的視圖對象后,中央處理器調用視圖對象的渲染方法,真正對視圖進行渲染。
這個渲染主要做了三樣工作:合并數據 Model;結合視圖對象中的響應目標定位對象,準備響應對象 Response;結合合并的數據 Model 與形成的 Response 對象,形成最終的響應視圖。
在形成最終的響應視圖后,中央調度器執行了收尾工作:執行處理器執行鏈攔截器的afterCompletion()方法。由 afterCompletion()方法發出對請求的最終響應。
瀏覽器接收到由服務端發來的最終的響應