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