詳細(xì)分析Spring MVC請(qǐng)求處理的流程步驟:
(1)首先用戶發(fā)送請(qǐng)求到前端控制器(DispatcherServlet)沃测,前端控制器根據(jù)請(qǐng)求信息(比如:URL)來(lái)決定選擇哪個(gè)頁(yè)面控制器(Controller)來(lái)進(jìn)行處理钟沛,并把請(qǐng)求委托給它味咳,即:Serlvet控制器的控制邏輯部分
(2)頁(yè)面控制器接收到請(qǐng)求后供嚎,進(jìn)行業(yè)務(wù)處理,處理完畢后返回一個(gè)ModelAndView(模型數(shù)據(jù)和邏輯視圖名)
(3)前端控制器收回控制權(quán),然后根據(jù)返回的邏輯視圖名,選擇相應(yīng)的真正視圖署惯,并把模型數(shù)據(jù)傳入以便視圖渲染展示
(4)前端控制器再次收回控制權(quán),將結(jié)果響應(yīng)返回給用戶镣隶,至此整個(gè)流程結(jié)束
Spring MVC體系結(jié)構(gòu)
結(jié)合請(qǐng)求處理流程簡(jiǎn)述框架結(jié)構(gòu):
(1)客戶端發(fā)出HTTP請(qǐng)求极谊,Web應(yīng)用服務(wù)器接收此請(qǐng)求,若匹配DispatcherServlet的請(qǐng)求映射路徑(在web.xml中指定)安岂,Web容器將該請(qǐng)求轉(zhuǎn)交給DispatcherServlet處理轻猖。
(2)DispatcherServlet接收到該請(qǐng)求后,將根據(jù)請(qǐng)求的信息(包括:URL嗜闻、請(qǐng)求參數(shù)蜕依、HTTP方法等)及HandlerMapping的配置(在<servletName>-servlet.xml中配置)找到處理請(qǐng)求的處理器(Handler)桅锄。
(3)當(dāng)DispatcherServlet根據(jù)HandlerMapping找到對(duì)應(yīng)當(dāng)前請(qǐng)求的Handler之后琉雳,通過(guò)HandlerAdapter對(duì)Handler進(jìn)行封裝样眠,再以統(tǒng)一的適配器接口調(diào)用Handler。
(4)在請(qǐng)求信息到達(dá)真正調(diào)用Handler的處理方法之前的這段時(shí)間內(nèi)翠肘,Spring MVC還完成了很多工作檐束,它會(huì)將請(qǐng)求信息以一定的方式轉(zhuǎn)換并綁定到請(qǐng)求方法的入?yún)⒅校瑢?duì)于入?yún)⒌膶?duì)象會(huì)進(jìn)行數(shù)據(jù)轉(zhuǎn)換束倍、數(shù)據(jù)格式化以及數(shù)據(jù)校驗(yàn)等被丧。這些都做完之后,最后才真正的調(diào)用Handler的處理方法進(jìn)行相應(yīng)的業(yè)務(wù)邏輯處理绪妹。
(5)處理器完成業(yè)務(wù)邏輯處理之后將返回一個(gè)ModelAndView對(duì)象給DispatcherServlet甥桂,ModelAndView對(duì)象包含了邏輯視圖名和模型數(shù)據(jù)信息。
(6)ModelAndView對(duì)象中包含的是“邏輯視圖名”邮旷,而非真正的視圖對(duì)象黄选,DispatcherServlet會(huì)通過(guò)ViewResolver將邏輯視圖名解析為真正的視圖對(duì)象View。當(dāng)然對(duì)于負(fù)責(zé)數(shù)據(jù)展示的視圖可以為:JSP婶肩、xml办陷、PDF、JSON等多種數(shù)據(jù)格式律歼,對(duì)此Spring MVC均可靈活配置民镜。
(7)當(dāng)?shù)玫秸鎸?shí)的視圖對(duì)象View后,DispatcherServlet會(huì)使用ModelAndView對(duì)象中的模型數(shù)據(jù)對(duì)View進(jìn)行視圖渲染险毁。
(8)最終客戶端獲得響應(yīng)消息制圈,根據(jù)配置,可以是普通的HTML頁(yè)面畔况,也可以是一個(gè)XML或者JSON格式的數(shù)據(jù)等等离唐。