圖一:
圖二:
執(zhí)行流程的源代碼分析,序列圖:
(1)瀏覽器提交請(qǐng)求到中央調(diào)度器
(2)中央調(diào)度器直接將請(qǐng)求轉(zhuǎn)給處理器映射器。
(3)處理器映射器會(huì)根據(jù)請(qǐng)求,找到處理該請(qǐng)求的處理器,并將其封裝為處理器執(zhí)行鏈后,返回給中央調(diào)度器。
(4)中央調(diào)度器根據(jù)處理器執(zhí)行鏈中的處理器,找到能夠執(zhí)行該處理器的處理器適配器。
(5)處理器適配器調(diào)用執(zhí)行處理器。
(6)處理器將處理結(jié)果及要跳轉(zhuǎn)的視圖封裝到一個(gè)對(duì)象 ModelAndView 中,并將其返回給處理器適配器。
(7)處理器適配器直接將結(jié)果返回給中央調(diào)度器。
(8)中央調(diào)度器調(diào)用視圖解析器,將 ModelAndView 中的視圖名稱(chēng)封裝為視圖對(duì)象。
(9)視圖解析器將封裝了的視圖對(duì)象返回給中央調(diào)度器
(10)中央調(diào)度器調(diào)用視圖對(duì)象,讓其自己進(jìn)行渲染,即進(jìn)行數(shù)據(jù)填充,形成響應(yīng)對(duì)象。
(11)中央調(diào)度器響應(yīng)瀏覽器。
(1) DispatcherServlet (不需要程序員開(kāi)發(fā))
中央調(diào)度器,也稱(chēng)為前端控制器,在 MVC 架構(gòu)模式中充當(dāng)控制器 C,DispatcherServlet是整個(gè)流程的控制中心,由它調(diào)用諸如處理器映射器、處理器適配器、視圖解析器等其它組件處理用戶(hù)請(qǐng)求。中央調(diào)度器的存在降低了組件之間的耦合度。
(2) HandlerMapping (不需要程序員開(kāi)發(fā))
處理器映射器,負(fù)責(zé)根據(jù)用戶(hù)請(qǐng)求找到相應(yīng)的將要執(zhí)行的 Handler,即處理器。即用于完成將用戶(hù)請(qǐng)求映射為要處理該請(qǐng)求的處理器,并將處理器封裝為處理器執(zhí)行鏈傳給中央調(diào)度器。
(3) HandlAdapter(不需要程序員開(kāi)發(fā))
處理器適配器,通過(guò) HandlerAdapter 對(duì)處理器進(jìn)行執(zhí)行,這是適配器模式的應(yīng)用,通過(guò)擴(kuò)展適配器可以對(duì)更多類(lèi)型的處理器進(jìn)行執(zhí)行。中央調(diào)度器會(huì)根據(jù)不同的處理器自動(dòng)為處理器選擇適配器,以執(zhí)行處理器。
(4) Handler (需要程序員開(kāi)發(fā)),即 Controller
處理器,也稱(chēng)為后端控制器,在 DispatcherServlet 的控制下 Handler 調(diào)用 Service 層對(duì)具體的用戶(hù)請(qǐng)求進(jìn)行處理。由于 Handler 涉及到具體的用戶(hù)業(yè)務(wù)請(qǐng)求,所以一般情況下需要程序員根據(jù)業(yè)務(wù)需求自己開(kāi)發(fā) Handler。
(5) ViewResolver (不需要程序員開(kāi)發(fā))
視圖解析器,負(fù)責(zé)將處理結(jié)果生成 View 視圖,ViewResolver 首先將邏輯視圖名解析為物理視圖名,即具體的頁(yè)面地址,再生成 View 視圖對(duì)象。最后將處理結(jié)果通過(guò)頁(yè)面形式展示給用戶(hù)。
(6) View (需要程序員開(kāi)發(fā) jsp 頁(yè)面)
SpringMVC 框架提供了很多的 View 視圖類(lèi)型。一般情況下需要通過(guò)頁(yè)面標(biāo)簽或頁(yè)面模版技術(shù)將模型數(shù)據(jù)通過(guò)頁(yè)面展示給用戶(hù),需要由程序員根據(jù)業(yè)務(wù)需求開(kāi)發(fā)具體的頁(yè)面。
第一個(gè) SpringMVC 的程序已經(jīng)可以正確運(yùn)行了。但發(fā)現(xiàn)一個(gè)問(wèn)題:在流程介紹中所述的重要的處理器映射器、處理器適配器、視圖解析器等,都在哪里,不用做配置嗎?
當(dāng)然不是!這些內(nèi)容均在 DispatcherServlet 的默認(rèn)配置 DispatcherServlet.properties 文件中被定義。這個(gè)文件與 DispatcherServlet 類(lèi)在一個(gè)包下,而且是當(dāng) Spring 配置文件中沒(méi)有指定配置時(shí)使用的默認(rèn)情況。
從上面的內(nèi)容可知,這些組件的默認(rèn)配置如下: