1、SpringMVC驗證@Validated的使用
第一步:編寫國際化消息資源文件
編寫國際化消息資源ValidatedMessage.properties文件主要是用來顯示錯誤的消息定制
1
2
3
|
edit.username.null=用戶名不能為空
edit.password.size=密碼最少{min}位,最長{max}位
......
|
可以將edit.username.null與edit.password.size看為參數,在message中傳遞,具體請看第二步。
第二步:Bean實體類中加注解
首先介紹關於驗證注解的類型種類
@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之間 |
@NotEmpty | 驗證注解的元素值不為null且不為空(字符串長度不為0、集合大小不為0) |
@NotBlank | 驗證注解的元素值不為空(不為null、去除首位空格后長度為0),不同於@NotEmpty,@NotBlank只應用於字符串且在比較時會去除字符串的空格 |
驗證注解的元素值是Email,也可以通過正則表達式和flag指定自定義的email格式 |
使用 這些注解很簡單,只需要在實體類中的變量屬性前面加上該注解即可。
1
2
3
4
5
6
7
8
|
public
class
User {
private
String id;
@NotEmpty
(message =
"{edit.username.null}"
)
private
String username;
@Size
(min=
6
,max=
20
,message =
"{edit.password.size}"
)
private
String password;
......
}
|
其中{}相當於占位符,將min、max參數傳圖,同時也將消息文件中定制的錯誤信息傳入,當然也可以直接不使用國際化文件,但是推薦使用,方便統一與修改。
1
2
3
4
5
6
7
8
|
public
class
User {
private
String id;
@NotEmpty
(message =
"用戶名不能為空"
)
private
String username;
@Size
(min=
6
,max=
20
,message =
"密碼最少6位,最高20位"
)
private
String password;
......
}
|
第三步:Controller層的編寫
Controller層的使用,很簡單。需要在相應的方法傳入的Bean參數前面增加注解@Validated,還有增加BindingResult參數即可,具體請看代碼示例:
1
2
3
4
5
6
7
8
9
10
11
|
@Controller
public
class
UserController {
@RequestMapping
(
"/save"
)
public
String save(
@Validated
User user, BindingResult result) {
if
(result.hasErrors()) {
return
"error"
;
}
return
"success"
;
}
}
|
第四步:在View層顯示錯誤信息
這里就不做介紹了,實際項目中會封裝好相應的javcscript等方法,只需要調用就可以返回頁面提示給用戶錯誤信息。
2、@Validated的分組特性
先在記錄之前,介紹一下這樣的場景:在對用戶的帳號密碼進行編輯保存以及新增是兩種不一樣的情況。
編輯修改->保存:只需要驗證username與password是否符合條件即可,不需要驗證id(因為在數據庫中id已經存在)。
新增->保存:新增需要驗證username與password是否符合條件,還要驗證id。
這時候就用到groups分組分情況對Bean屬性變量進行驗證,也可以滿足多驗證。具體的需要一下兩個步驟
第一步:創建分組接口類
分組接口類只是普通的接口類並沒有多大意義,只是用來標識這個屬性哪種情況下被驗證,這類似於java.io.Serializable
1
2
3
4
|
public
interface
addUser{
}
public
interface
editUser{
}
|
第二步:Controller方法參數中增加xxx.class接口
在對新增的用戶進行ID驗證,增加@Validated({addUser.class})接口類用來表示新增的User.getId()需要驗證。
1
2
3
4
5
6
7
8
9
10
|
@Controller
public
class
UserController {
@RequestMapping
(
"/saveAdd"
)
public
String saveAddUser(
@Validated
({addUser.
class
}) User user, BindingResult result) {
if
(result.hasErrors()) {
return
"error"
;
}
return
"success"
;
}
|
第三步:Bean中添加groups分組
在User實體類中添加groups分組@NotEmpty(groups={addUser.class})與UserController中@Validated({addUser.class})對應,說明在執行saveAddUser新增用戶的情況下,才對新增的用戶id進行驗證。
1
2
3
4
5
6
7
8
9
10
|
public
class
User {
//在分組addUser時,驗證id不能為空,其他情況下不做驗證
@NotEmpty
(groups={addUser.
class
})
private
String id;
@NotEmpty
(message =
"用戶名不能為空"
)
private
String username;
@Size
(min=
6
,max=
20
,message =
"密碼最少6位,最高20位"
)
private
String password;
......
}
|
以上三步就可以簡單地完成分組驗證,但是對分組驗證補充一下三點:
第一是:不分配groups分組時,默認每次都需要驗證。
第二是:通過groups分組可以對同一個變量進行多個驗證,如下代碼
1
2
3
4
|
//對用戶名進行兩次不同情況的驗證。
@NotEmpty
(groups={First.
class
})
@Size
(min=
1
,max=
10
,groups={Second.
class
})
public
String username;
|
第三是:默認的情況下,不同的分組約束驗證是無序的,但是在有些情況下驗證的相互約束很重要(比如前一個組驗證失敗,后面的將不再驗證等情況),所以groups分組的驗證也有前后驗證順序。使用@GroupSequence注解進行排序。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
/*
* 分組順序接口類
*/
import
javax.validation.GroupSequence;
//分組序列先Frist再Second
@GroupSequence
({First.
class
,Second.
class
})
public
interface
Group{
}
@Controller
public
class
UserController {
@RequestMapping
(
"/saveAdd"
)
public
String saveAddUser(
@Validated
({Group.
class
}) User user, BindingResult result) {
if
(result.hasErrors()) {
return
"error"
;
}
return
"success"
;
}
|
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。