Controller 控制器,是MVC 中的部分C,主要負責功能處理部分:一、收集、驗證請求參數並綁定到命令對象;二、將命令對象交給業務對象,由業務對象處理並返回模型數據;三、返回ModelAndView(Model 部分是業務對象返回的模型數據,視圖部分爲邏輯視圖名)。web
DispatcherServlet主要負責總體的控制流程的調度部分:
一、負責將請求委託給控制器進行處理;
二、根據控制器返回的邏輯視圖名選擇具體的視圖進行渲染(並把模型數據傳入)。
MVC 中完整的C(包含控制邏輯+功能處理)由(DispatcherServlet + Controller)組成。chrome
Spring2.5以前,咱們都是經過實現Controller接口或其實現來定義咱們的處理器類,已不建議使用。Spring2.5引入註解式處理器支持,經過@Controller 和@RequestMapping註解定義咱們的處理器類。而且提供了一組強大的註解:
@Controller:用於標識是處理器類;
@RequestMapping:請求處處理器功能方法的映射規則;
@RequestParam:請求參數處處理器功能處理方法的方法參數上的綁定;瀏覽器
@ModelAttribute:請求參數到命令對象的綁定;
@SessionAttributes:用於聲明session級別存儲的屬性,放置在處理器類上,一般列出模型屬性(如@ModelAttribute)對應的名稱,則這些屬性會透明的保存到session中;
@InitBinder:自定義數據綁定註冊支持,用於將請求參數轉換到命令對象屬性的對應類型;cookie
Spring3.0引入RESTful架構風格支持(經過@PathVariable註解和一些其餘特性支持), 且又引入了更多的註解支持。@CookieValue:cookie數據處處理器功能處理方法的方法參數上的綁定;
@CookieValue:cookie數據處處理器功能處理方法的方法參數上的綁定;
@RequestHeader:請求頭(header)數據處處理器功能處理方法的方法參數上的綁定;
@RequestBody:請求的body體的綁定(經過HttpMessageConverter進行類型轉換);
@ResponseStatus:定義處理器功能處理方法/異常處理器返回的狀態碼和緣由;
@ExceptionHandler:註解式聲明異常處理器session
@PathVariable:請求URI中的模板變量部分處處理器功能處理方法的方法參數上的綁定,從而支持RESTful架構風格的URI;
Spring3.1使用新的HandlerMapping 和HandlerAdapter來支持@Contoller和@RequestMapping註解處理器,使用處理器映射RequestMappingHandlerMapping和處理器適配器RequestMappingHandlerAdapter組合來代替Spring2.5開始的處理器映射DefaultAnnotationHandlerMapping和處理器適配器AnnotationMethodHandlerAdapter。架構
註解實現Controllerapp
普通URL映射:
@RequestMapping(value={"/hello","/user/create"}) :多個URL路徑能夠映射到同一個處理器的功能處理方法
URI模板模式映射
一、@RequestMapping(value="/users/{userId}") :{xx} 佔位符請求的URL能夠是「/users/123456」或「/users/abcd」
經過@PathVariable能夠提取URI模板模式中的{xx}中的xx 變量的值ui
二、@RequestMapping(value=「/users/{userId}/create」 ) :請求的URL能夠是」/users/uid/create」
三、@RequestMapping(value="/users/{userId}/topics/
{topicId}「) :請求的URL能夠是」/users/uid/topics/tid」
Ant風格的URL路徑映射
一、@RequestMapping(value=「/users/**」):能夠匹配」/users/abc/abc」,但」/users/123」將會被URI模板模式映射中的」/users/{userId}」模式優先映射到(最長匹配優先)google
二、@RequestMapping(value=「/product?」):可匹配」/product1」或」/producta」,但不匹配」/product」或」/productaa」;
三、@RequestMapping(value=「/product*」):可匹配」/productabc」或」product」,但不匹配」/productabc/abc」;spa
四、@RequestMapping(value=「/product/*」):可匹配」/product/abc」,但不匹配「/productabc」;
五、@RequestMapping(value=「/products/**/
{productId}」):可匹配「/products/abc/abc/123」或
」/products/123」,也就是Ant風格和URI模板變量風格可混用;
若是有以下模式,那Spring該選擇哪個執行呢?當請求爲」/long/long」 時以下所示:/long/long/long/**/abc/long/**/**Spring的AbstractUrlHandlerMapping使用:最長匹配優先;如請求爲」/long/long」 將匹配第一個」/long/long」 ,但請求」/long/acd」 則將匹配」/long/**」 ,如請求」/long/aa/abc」則匹配」/long/**/abc」 ,如請求」/abc」則將匹配」/**」
請求窄化
Controller上直接使用@RequestMapping(value=「/create」)
方法上
@RequestMapping(value=「/create」, method = RequestMethod. GET)
組合方式
@RequestMapping(value=「/create」, {method = RequestMethod. GET, RequestMethod.POST})
請求數據中有指定參數名
@RequestMapping(params=「create」, method=RequestMethod. GET) :表示請求中有」create」 的參數名且請求方法爲」GET」 便可匹配
請求數據中沒有指定參數名@RequestMapping(params=「!create」,method=RequestMethod. GET)
請求數據中指定參數名=值@RequestMapping(params="submitFlag=create")
請求數據中指定參數名!=值@RequestMapping(params="submitFlag! =create", method=RequestMethod. GET)
組合使用是「且」的關係@RequestMapping(params={「test1」 , 「test2=create」})
一、Chrome瀏覽器安裝插件。插件下載地址:https://chrome.google.com/webstore/detail/modheader/idgpnmonknjnojddfkpgkljpfnnfcklj
請求頭數據中有指定參數名@RequestMapping(value=「/header/test1」 , headers = 「Hello」 )
請求頭數據中沒有指定參數名@RequestMapping(value=「/header/test1」 , headers = 「!Hello」 )
請求頭數據中指定參數名=值
@RequestMapping(value=「/header/test1」 , headers = 「Hello=abc」 )
請求頭數據中指定參數名!=值@RequestMapping(value=「/header/test1」 , headers=「Hello!=abc」 ) 組合使用是「且」的關係@RequestMapping(value=「/header/test1」 , headers= {「Hello=abc」,」 Accept!=text/vnd.wap.wml」}) 請求頭數據中指定參數名=值 @RequestMapping(value=「/header/test1」 , headers = 「Hello=abc」 )