一 、@PathVariable
1、定義URL變量規則
可以在@RequestMapping注解中用{}來表明它的變量部分,例如:
@RequestMapping("/users/{username}")
這里{username}就是我們定義的變量規則,username是變量的名字,那么這個URL路由可以匹配下列任意URL並進行處理:
- /users/tianmaying
- /users/ricky
- users/tmy1234
需要注意的是,在默認情況下,變量中不可以包含URL的分隔符/,例如路由不能匹配/users/tianmaying/ricky,即使你認為tianmaying/ricky是一個存在的用戶名。
2、獲取URL變量
在路由中定義變量規則后,通常我們需要在處理方法(也就是@RequestMapping注解的方法)中獲取這個URL的具體值,並根據這個值(例如用戶名)做相應的操作,SpringMVC提供的@PathVariable可以幫助我們:
@RequestMapping("/users/{username}")
@ResponseBody
public String userProfile(@PathVariable String username){
// return String.format("user %s", username);
return "user" + username;
}
在上述例子中,當@Controller處理HTTP請求時,userProfile的參數username會自動設置為URL中對應變量username(同名賦值)的值,例如當HTTP請求為/users/fpc
,URL變量username的值fpc會被賦給函數參數username,函數的返回值自然是userfpc。
在默認的情況下,Spring會對@PathVariable注解的變量進行自動賦值,當然你也可以指定@PathVariable使用哪一個URL中的變量:
@RequestMapping("/users/{username}")
@ResponseBody
public String userProfile(@PathVariable("username") String username){
// return String.format("user %s", username);
return "user" + username;
}
運行結果:


3、定義多個URL變量
可以定義URL路由,其中包含多個URL變量:
@RequestMapping("/user/{username}/blog/{blogId}")
@ResponseBody
public String getUerBlog(@PathVariable String username , @PathVariable int blogId) {
return "user: " + username + "blog->" + blogId;
}
這種情況下,Spring能夠根據名字自動賦值對應的函數參數值,當然也可以在@PathVariable中顯示地表明具體的URL變量值。
在默認情況下,@PathVariable注解的參數可以是一些基本的簡單類型:int,long,Date,String等,Spring能根據URL變量的具體值以及函數參數的類型來進行轉換,例如/user/fpc/blog/1,會將“fpc”的值賦給username,而1賦值給int變量blogId。
運行結果:

4、匹配正則表達式
很多時候,需要對URL變量進行更加精確的定義,例如-用戶名只可能包含小寫字母,數字,下划線,我們希望:
- /user/fpc是一個合法的URL
- /user/#$$$則不是一個合法的URL
除了簡單地定義{username}變量,還可以定義正則表達式進行更精確的控制,定義語法是{變量名:正則表達式}[a-zA-Z0-9_]+是一個正則表達式,表示只能包含小寫字母,大寫字母,數字,下划線。如此設置URL變量規則后,不合法的URL則不會被處理,直接由SpringMVC框架返回404Not Found。
@RequestMapping("/user/{username:[a-zA-Z0-9_]+}/blog/{blogId}")
5、總結
- 在@RequestMapping注解中定義URL變量規則
- 在@RequestMapping注解方法中獲取URL變量-@PathVariable
- @PathVariable指定URL變量名
- 定義多個URL變量
- 用正則表達式精確定義URL變量
二、@Valid注解
@Valid注解可以實現數據的驗證,你可以定義實體,在實體的屬性上添加校驗規則,而在API接收數據時添加@valid關鍵字,這時你的實體將會開啟一個校驗的功能。
@Valid 注解類型的使用:
@Null
限制只能為null
@NotNull
限制必須不為null
@AssertFalse
限制必須為false
@AssertTrue
限制必須為true
@DecimalMax(value)
限制必須為一個不大於指定值的數字
@DecimalMin(value)
限制必須為一個不小於指定值的數字
@Digits(integer,fraction)
限制必須為一個小數,且整數部分的位數不能超過integer,小數部分的位數不能超過fraction
@Future
限制必須是一個將來的日期
@Max(value)
限制必須為一個不大於指定值的數字
@Min(value)
限制必須為一個不小於指定值的數字
@Past
限制必須是一個過去的日期
@Pattern(value)
限制必須符合指定的正則表達式
@Size(max,min)
限制字符長度必須在min到max之間
@Past
驗證注解的元素值(日期類型)比當前時間早
@NotEmpty
驗證注解的元素值不為null且不為空(字符串長度不為0、集合大小不為0)
@NotBlank
驗證注解的元素值不為空(不為null、去除首位空格后長度為0),不同於@NotEmpty,@NotBlank只應用於字符串且在比較時會去除字符串的空格
@Email
驗證注解的元素值是Email,也可以通過正則表達式和flag指定自定義的email格式
注意,不要錯用了異常類型,比如在int上不可用@size

講一下普通實體字段驗證及嵌套實體字段驗證區別


注意:實體類驗證只是針對該實體內第一層對象的屬性進行驗證,如果存在被驗證的實體類為另一個實體類的的成員變量,那么就需要在該成員變量(需要驗證的實體類)上加 @valid 注解。
另:

參考文章:http://blog.51cto.com/825272560/2121519
