javascript
Spring MVC请求处理流程
?
1. 當(dāng)DispatcherServlet接到請(qǐng)求時(shí),他先回查找適當(dāng)?shù)奶幚沓绦騺?lái)處理請(qǐng)求。DispatcherServlet通過(guò)一個(gè)或者多個(gè)處理程序映射,將每個(gè)請(qǐng)求映射到處理程序中。處理程序映射配置在web應(yīng)用程序的上下文中,是實(shí)現(xiàn)了HandlerMapping接口的Bean。它負(fù)責(zé)為請(qǐng)求返回一個(gè)適當(dāng)?shù)奶幚沓绦?#xff08;也就是Controller)。處理程序映射通常根據(jù)請(qǐng)求的URL將請(qǐng)求映射到處理程序(Controller)。?
2. 一旦DispatcherServlet選擇了適當(dāng)?shù)目刂破?#xff0c;它就會(huì)調(diào)用這個(gè)控制器來(lái)處理請(qǐng)求。?
3. 控制器處理完請(qǐng)求后,會(huì)將模型和視圖名(有時(shí)候是視圖對(duì)象)返回給DispatcherServlet。模型包含了控制器要傳遞給視圖進(jìn)行顯示的屬性。如果返回的是視圖名稱(chēng),它會(huì)被解析成視圖對(duì)象再進(jìn)行呈現(xiàn)。綁定模型和視圖的基本類(lèi)是ModelAndView?
4. 當(dāng)DispatcherServlet接收到模型和視圖名稱(chēng)時(shí),它會(huì)將邏輯視圖名稱(chēng)解析成視圖對(duì)象再進(jìn)行呈現(xiàn)。DispatcherServlet從一個(gè)或者多個(gè)視圖解析器中解析視圖。視圖解析器配置在Web應(yīng)用程序上下文中,是實(shí)現(xiàn)了ViewResolver接口的Bean。它的任務(wù)是根據(jù)邏輯視圖名稱(chēng)返回試圖對(duì)象。?
5. 一旦DispatcherServlet將視圖名稱(chēng)解析稱(chēng)為試圖對(duì)象,它就會(huì)呈現(xiàn)視圖對(duì)象,并傳遞控制器返回的模型。視圖的任務(wù)是將模型屬性展示給用戶(hù)。?
DispatcherServlet接到請(qǐng)求后如何映射到Controller呢??
在Spring MVC中,Web請(qǐng)求被Web應(yīng)用程序上下文中聲明的一個(gè)或者多個(gè)處理程序映射Bean(是吸納了HandlerMapping接口的Bean)映射到Controller。Spring MVC提供了幾種HandlerMapping實(shí)現(xiàn):?
1. BeanNameUrlHandlerMapping(默認(rèn)情況),他根據(jù)Controller Bean名稱(chēng)中指定的URL模式將請(qǐng)求映射到處理程序上。?
eg. <bean name="/welcome.htm" class="com.kevin.controller.WelcomeController">...</bean>?
當(dāng)你訪(fǎng)問(wèn)http://******/welcome.htm這個(gè)URL時(shí),DispatcherServlet通過(guò)BeanNameUrlHandlerMapping映射就找到了WelcomeController。?
2. ControllerClassNameHandlerMapping,它是按控制器類(lèi)名稱(chēng)映射請(qǐng)求。?
3. SimpleUrlHandlerMapping,用定制的映射定義來(lái)映射請(qǐng)求。?
下面我們就來(lái)看一下Controller。?
?
Controller接口是Spring MVC中所有控制器類(lèi)的基本接口。通過(guò)實(shí)現(xiàn)這個(gè)接口,你可以創(chuàng)建自己的控制器。在handleRequest()方法中,可以隨意地處理Web請(qǐng)求。?
AbstractController:如果你想讓控制器具備一些基本的特性,如過(guò)濾受支持的HTTP方法(GET,POST和HEAD),以及在HTTP響應(yīng)中生成cache-control頭部等,你可以讓它擴(kuò)展AbstractController類(lèi)。?
ParameterizableViewController:用來(lái)創(chuàng)建帶有參數(shù)化視圖的控制器。?
SimpleFormController:它支持命令對(duì)象的概念(commandName),并且可以將表單域的值綁定到命令對(duì)象的同名屬性上。?
AbstractWizardFormController:為向?qū)П韱蔚奶幚矶x了基本的任務(wù)。向?qū)П韱斡卸鄠€(gè)單頁(yè),因此必須為向?qū)П韱慰刂破鞫x多個(gè)頁(yè)面視圖。然后這個(gè)控制器可以跨越所有這些表單頁(yè)面來(lái)管理表單狀態(tài)。向?qū)П韱螘?huì)有多個(gè)動(dòng)作,不像SimpleFormController只有單個(gè)提交動(dòng)作。AbstractWizardFormController會(huì)根據(jù)特殊的請(qǐng)求參數(shù)決定用戶(hù)的動(dòng)作,通常是用提交按鈕的名稱(chēng)來(lái)指定動(dòng)作的。?
_finished: 完成向?qū)П韱巍?
_cancel: 取消向?qū)П韱巍?
_targetx: 進(jìn)入目標(biāo)頁(yè)面,這里的x是從0開(kāi)始的頁(yè)面索引。?
MultiActionController:允許你將多個(gè)相關(guān)的動(dòng)作分組到一個(gè)控制器中。?
常見(jiàn)的視圖類(lèi)型:?
?
幾種常見(jiàn)的ViewResolver的解析:?
1. InternalResourceViewResolver: 根據(jù)URL解析視圖。通過(guò)添加前綴和后綴的方法,將每個(gè)視圖名稱(chēng)都映射到一個(gè)URL上。?
2. XmlViewResolver: 從XML配置文件中解析視圖。將視圖聲明成Spring的Bean,并按他們的Bean Name進(jìn)行解析。?
3. ResourceBundleViewResolver: 從ResourceBundle中解析視圖。?
4. 用多個(gè)視圖解析器解析視圖, 需要注意的是,您需要為你配置的視圖解析器配置解析的優(yōu)先級(jí)。<property name="order" value="0"/> value越小,優(yōu)先級(jí)越高。
轉(zhuǎn)載于:https://www.cnblogs.com/AnXinliang/p/9960799.html
總結(jié)
以上是生活随笔為你收集整理的Spring MVC请求处理流程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 理解动态语言inline cache优化
- 下一篇: Spring Boot(十四)Rabbi