Spring2.5引入注解式處理器支持,通過@Controller 和 @RequestMapping注解定義我們的處理器類。
並且提供了一組強大的注解:
需要通過處理器映射DefaultAnnotationHandlerMapping和處理器適配器
AnnotationMethodHandlerAdapter來開啟支持@Controller 和 @RequestMapping注解的處理器。
@Controller:用於標識是處理器類;
@RequestMapping:請求到處理器功能方法的映射規則;
@RequestParam:請求參數到處理器功能處理方法的方法參數上的綁定;
@ModelAttribute:請求參數到命令對象的綁定;
@SessionAttributes:用於聲明session級別存儲的屬性,放置在處理器類上,通常列出
模型屬性(如@ModelAttribute)對應的名稱,則這些屬性會透明的保存到session中;
@InitBinder:自定義數據綁定注冊支持,用於將請求參數轉換到命令對象屬性的對應類型;
Spring3.0引入RESTful架構風格支持(通過@PathVariable注解和一些其他特性支持),且又引入了
更多的注解支持:
@CookieValue:cookie數據到處理器功能處理方法的方法參數上的綁定;
@RequestHeader:請求頭(header)數據到處理器功能處理方法的方法參數上的綁定;
@RequestBody:請求的body體的綁定(通過HttpMessageConverter進行類型轉換);
@ResponseBody:處理器功能處理方法的返回值作為響應體(通過HttpMessageConverter進行類型轉換);
@ResponseStatus:定義處理器功能處理方法/異常處理器返回的狀態碼和原因;
@ExceptionHandler:注解式聲明異常處理器;
@PathVariable:請求URI中的模板變量部分到處理器功能處理方法的方法參數上的綁定,
從而支持RESTful架構風格的URI;
Spring3.1使用新的HandlerMapping 和 HandlerAdapter來支持@Contoller和@RequestMapping注解處理器。
新的@Contoller和@RequestMapping注解支持類:處理器映射RequestMappingHandlerMapping和處理器適配器RequestMappingHandlerAdapter組合來代替Spring2.5開始的處理器映射
DefaultAnnotationHandlerMapping和處理器適配器AnnotationMethodHandlerAdapter,提供更多的擴展點。
@Controller // 或 @RequestMapping //將一個POJO類聲明為處理器 public class HelloWorldController { @RequestMapping(value = "/hello") //請求URL到處理器功能處理方法的映射 public ModelAndView helloWorld() { //1、收集參數 //2、綁定參數到命令對象 //3、調用業務對象 //4、選擇下一個頁面 ModelAndView mv = new ModelAndView(); //添加模型數據 可以是任意的POJO對象 mv.addObject("message", "Hello World!"); //設置邏輯視圖名,視圖解析器會根據該名字解析到具體的視圖頁面 mv.setViewName("hello"); return mv; //模型數據和邏輯視圖名 } }
http請求信息包含六部分信息:
①請求方法,如GET或POST,表示提交的方式;
②URL,請求的地址信息;
③協議及版本;
④請求頭信息(包括Cookie信息);
⑤回車換行(CRLF);
⑥請求內容區(即請求的內容或數據),如表單提交時的參數數據、URL請求參數(?abc=123 ?后邊的)等。
處理器的功能處理方法的映射,因此請求的映射分為如下幾種:
URL路徑映射:使用URL映射請求到處理器的功能處理方法;
請求方法映射限定:如限定功能處理方法只處理GET請求;
請求參數映射限定:如限定只處理包含“abc”請求參數的請求;
請求頭映射限定:如限定只處理“Accept=application/json”的請求。
普通URL路徑映射
@RequestMapping(value={"/test1", "/user/create"}):多個URL路徑可以映射到同一個處理器的功能處理方法。
URI模板模式映射
@RequestMapping(value="/users/{userId}"):{×××}占位符, 請求的URL可以是 “/users/123456”或“/users/abcd”,通過@PathVariable可以提取URI模板模式中的{×××}中的×××變量。
@RequestMapping(value="/users/{userId}/create"):這樣也是可以的,請求的URL可以是“/users/123/create”。
@RequestMapping(value="/users/{userId}/topics/{topicId}"):這樣也是可以的,請求的URL可以是“/users/123/topics/123”。
Ant風格的URL路徑映射
@RequestMapping(value="/users/**"):可以匹配“/users/abc/abc”,但“/users/123”將會被【URI模板模式映射中的“/users/{userId}”模式優先映射到】@RequestMapping(value="/product?"):可匹配“/product1”或“/producta”,但不匹配“/product”或“/productaa”;
@RequestMapping(value="/product*"):可匹配“/productabc”或“/product”,但不匹配“/productabc/abc”;
@RequestMapping(value="/product/*"):可匹配“/product/abc”,但不匹配“/productabc”;
@RequestMapping(value="/products/**/{productId}"):可匹配“/products/abc/abc/123”或“/products/123”,也就是Ant風格和URI模板變量風格可混用;
正則表達式風格的URL路徑映射
從Spring3.0開始支持正則表達式風格的URL路徑映射,格式為{變量名:正則表達式},通過@PathVariable提取模式中的{×××:正則表達式匹配的值}中的×××變量了。
@RequestMapping(value="/products/{categoryCode:\\d+}-{pageNumber:\\d+}"):可以匹配“/products/123-1”,但不能匹配“/products/abc-1”,這樣可以設計更加嚴格的規則。
正則表達式風格的URL路徑映射是一種特殊的URI模板模式映射:
URI模板模式映射是{userId},不能指定模板變量的數據類型,如是數字還是字符串;
正則表達式風格的URL路徑映射,可以指定模板變量的數據類型,可以將規則寫的相當復雜。
組合使用是“或”的關系
如 @RequestMapping(value={"/test1", "/user/create"}) 組合使用是或的關系,即“/test1”或“/user/create”請求URL路徑都可以映射到@RequestMapping指定的功能處理方法。
以上URL映射的測試類為:cn.javass.chapter6.web.controller.mapping.MappingController.java。
Spring WebMVC不僅僅提供URL路徑映射,還提供了其他強大的映射規則。