3:spring mvc 控制器

  1. Controller 簡介

    Controller 控制器,是MVC 中的部分C,主要負責功能處理部分:一、收集、驗證請求參數並綁定到命令對象;二、將命令對象交給業務對象,由業務對象處理並返回模型數據;三、返回ModelAndView(Model 部分是業務對象返回的模型數據,視圖部分爲邏輯視圖名)。web

    DispatcherServlet主要負責總體的控制流程的調度部分:
           一、負責將請求委託給控制器進行處理;
           二、根據控制器返回的邏輯視圖名選擇具體的視圖進行渲染(並把模型數據傳入)。
    MVC 中完整的C(包含控制邏輯+功能處理)由(DispatcherServlet + Controller)組成。chrome

  2. Controller 註解式配置

    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

     


    HandlerMapping和HandlerAdapter的配置
    一、Spring3.1之前的版本DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter
    二、Spring3.1開始的版本RequestMappingHandlerMapping和RequestMappingHandlerAdapter
     
  3. URL映射配置

    普通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」則將匹配」/**」

  4. 請求方法限定

    請求窄化
    Controller上直接使用@RequestMapping(value=「/create」)
    方法上
    @RequestMapping(value=「/create」, method = RequestMethod. GET)
    組合方式
    @RequestMapping(value=「/create」, {method = RequestMethod. GET, RequestMethod.POST})

     

  5. 請求參數映射

    請求數據中有指定參數名
    @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」})

  6. 請求頭限定

    一、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」 )

相關文章
相關標籤/搜索