1、SpringMVC驗(yàn)證@Validated的使用
創(chuàng)新互聯(lián)成立與2013年,先為湘潭縣等服務(wù)建站,湘潭縣等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢(xún)服務(wù)。為湘潭縣企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問(wèn)題。
第一步:編寫(xiě)國(guó)際化消息資源文件
編寫(xiě)國(guó)際化消息資源ValidatedMessage.properties文件主要是用來(lái)顯示錯(cuò)誤的消息定制
edit.username.null=用戶(hù)名不能為空 edit.password.size=密碼最少{min}位,最長(zhǎng){max}位 ......
可以將edit.username.null與edit.password.size看為參數(shù),在message中傳遞,具體請(qǐng)看第二步。
第二步:Bean實(shí)體類(lèi)中加注解
首先介紹關(guān)于驗(yàn)證注解的類(lèi)型種類(lèi)
@Null | 限制只能為null |
@NotNull | 限制必須不為null |
@AssertFalse | 限制必須為false |
@AssertTrue | 限制必須為true |
@DecimalMax(value) | 限制必須為一個(gè)不大于指定值的數(shù)字 |
@DecimalMin(value) | 限制必須為一個(gè)不小于指定值的數(shù)字 |
@Digits(integer,fraction) | 限制必須為一個(gè)小數(shù),且整數(shù)部分的位數(shù)不能超過(guò)integer,小數(shù)部分的位數(shù)不能超過(guò)fraction |
@Future | 限制必須是一個(gè)將來(lái)的日期 |
@Max(value) | 限制必須為一個(gè)不大于指定值的數(shù)字 |
@Min(value) | 限制必須為一個(gè)不小于指定值的數(shù)字 |
@Past | 驗(yàn)證注解的元素值(日期類(lèi)型)比當(dāng)前時(shí)間早 |
@Pattern(value) | 限制必須符合指定的正則表達(dá)式 |
@Size(max,min) | 限制字符長(zhǎng)度必須在min到max之間 |
@NotEmpty | 驗(yàn)證注解的元素值不為null且不為空(字符串長(zhǎng)度不為0、集合大小不為0) |
@NotBlank | 驗(yàn)證注解的元素值不為空(不為null、去除首位空格后長(zhǎng)度為0),不同于@NotEmpty,@NotBlank只應(yīng)用于字符串且在比較時(shí)會(huì)去除字符串的空格 |
驗(yàn)證注解的元素值是Email,也可以通過(guò)正則表達(dá)式和flag指定自定義的email格式 |
使用 這些注解很簡(jiǎn)單,只需要在實(shí)體類(lèi)中的變量屬性前面加上該注解即可。
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; ...... }
其中{}相當(dāng)于占位符,將min、max參數(shù)傳圖,同時(shí)也將消息文件中定制的錯(cuò)誤信息傳入,當(dāng)然也可以直接不使用國(guó)際化文件,但是推薦使用,方便統(tǒng)一與修改。
public class User { private String id; @NotEmpty(message = "用戶(hù)名不能為空") private String username; @Size(min=6 ,max= 20 ,message = "密碼最少6位,最高20位") private String password; ...... }
第三步:Controller層的編寫(xiě)
Controller層的使用,很簡(jiǎn)單。需要在相應(yīng)的方法傳入的Bean參數(shù)前面增加注解@Validated,還有增加BindingResult參數(shù)即可,具體請(qǐng)看代碼示例:
@Controller public class UserController { @RequestMapping("/save") public String save(@Validated User user, BindingResult result) { if(result.hasErrors()) { return "error"; } return "success"; } }
第四步:在View層顯示錯(cuò)誤信息
這里就不做介紹了,實(shí)際項(xiàng)目中會(huì)封裝好相應(yīng)的javcscript等方法,只需要調(diào)用就可以返回頁(yè)面提示給用戶(hù)錯(cuò)誤信息。
2、@Validated的分組特性
先在記錄之前,介紹一下這樣的場(chǎng)景:在對(duì)用戶(hù)的帳號(hào)密碼進(jìn)行編輯保存以及新增是兩種不一樣的情況。
編輯修改->保存:只需要驗(yàn)證username與password是否符合條件即可,不需要驗(yàn)證id(因?yàn)樵跀?shù)據(jù)庫(kù)中id已經(jīng)存在)。
新增->保存:新增需要驗(yàn)證username與password是否符合條件,還要驗(yàn)證id。
這時(shí)候就用到groups分組分情況對(duì)Bean屬性變量進(jìn)行驗(yàn)證,也可以滿(mǎn)足多驗(yàn)證。具體的需要一下兩個(gè)步驟
第一步:創(chuàng)建分組接口類(lèi)
分組接口類(lèi)只是普通的接口類(lèi)并沒(méi)有多大意義,只是用來(lái)標(biāo)識(shí)這個(gè)屬性哪種情況下被驗(yàn)證,這類(lèi)似于java.io.Serializable
public interface addUser{ } public interface editUser{ }
第二步:Controller方法參數(shù)中增加xxx.class接口
在對(duì)新增的用戶(hù)進(jìn)行ID驗(yàn)證,增加@Validated({addUser.class})接口類(lèi)用來(lái)表示新增的User.getId()需要驗(yàn)證。
@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實(shí)體類(lèi)中添加groups分組@NotEmpty(groups={addUser.class})與UserController中@Validated({addUser.class})對(duì)應(yīng),說(shuō)明在執(zhí)行saveAddUser新增用戶(hù)的情況下,才對(duì)新增的用戶(hù)id進(jìn)行驗(yàn)證。
public class User { //在分組addUser時(shí),驗(yàn)證id不能為空,其他情況下不做驗(yàn)證 @NotEmpty(groups={addUser.class}) private String id; @NotEmpty(message = "用戶(hù)名不能為空") private String username; @Size(min=6 ,max= 20 ,message = "密碼最少6位,最高20位") private String password; ...... }
以上三步就可以簡(jiǎn)單地完成分組驗(yàn)證,但是對(duì)分組驗(yàn)證補(bǔ)充一下三點(diǎn):
第一是:不分配groups分組時(shí),默認(rèn)每次都需要驗(yàn)證。
第二是:通過(guò)groups分組可以對(duì)同一個(gè)變量進(jìn)行多個(gè)驗(yàn)證,如下代碼
//對(duì)用戶(hù)名進(jìn)行兩次不同情況的驗(yàn)證。 @NotEmpty(groups={First.class}) @Size(min=1,max=10,groups={Second.class}) public String username;
第三是:默認(rèn)的情況下,不同的分組約束驗(yàn)證是無(wú)序的,但是在有些情況下驗(yàn)證的相互約束很重要(比如前一個(gè)組驗(yàn)證失敗,后面的將不再驗(yàn)證等情況),所以groups分組的驗(yàn)證也有前后驗(yàn)證順序。使用@GroupSequence注解進(jìn)行排序。
/* * 分組順序接口類(lèi) */ 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"; }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。