日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

SpringMVC学习记录--Validator验证分析

發(fā)布時(shí)間:2023/11/30 javascript 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SpringMVC学习记录--Validator验证分析 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一.基于Validator接口的驗(yàn)證.

首先創(chuàng)建User實(shí)例,并加入幾個(gè)屬性

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 <code class="hljs cs">public class User { ????private String username; ????private String password; ????private String nickname; ????public String getUsername() { ????????return username; ????} ????public void setUsername(String username) { ????????this.username = username; ????} ????public String getPassword() { ????????return password; ????} ????public void setPassword(String password) { ????????this.password = password; ????} ????public String getNickname() { ????????return nickname; ????} ????public void setNickname(String nickname) { ????????this.nickname = nickname; ????} ????@Override ????public String toString() { ????????return "username--"+username+"password--"+password+"nickname--"+nickname; ????} }</code>

接著創(chuàng)建用于校檢的類UserValidator,讓其實(shí)現(xiàn)Validator,覆蓋其中的兩個(gè)方法

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 <code class="hljs java">import main.java.model.User; import org.springframework.validation.Errors; import org.springframework.validation.Validator; public class UserValidator implements Validator { ????@Override ????public boolean supports(Class aClass) { ????????//判斷是否是要校驗(yàn)的類,這里是User ????????return User.class.equals(aClass); ????} ????@Override ????public void validate(Object o, Errors errors) { ????????User u = (User) o; ????????if (null == u.getPassword() || "".equals(u.getPassword())){ ????????????//此方法可以加四個(gè)參數(shù),第一個(gè)表單域field, ????????????//區(qū)分是哪個(gè)表單出錯(cuò),第二個(gè)errorCode錯(cuò)誤碼, ????????????//第三個(gè)制定了資源文件中占位符,第四個(gè)具體錯(cuò)誤返回信息 ????????????//簡(jiǎn)寫(xiě)版可以把2,3參數(shù)去掉 ????????????errors.rejectValue("password",null,null,"password is null"); ????????} ????} }</code>

上面的類只實(shí)現(xiàn)了對(duì)密碼判斷是否為空,為空則注冊(cè)這一錯(cuò)誤信息,也就是”password is null”,接下來(lái)要實(shí)現(xiàn)控制器,控制器要做的事情,第一是注冊(cè)這個(gè)校驗(yàn)器,第二是實(shí)現(xiàn)校驗(yàn).

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 <code class="hljs java">import main.java.model.User; ...... /** ?* 加上@Controller決定這個(gè)類是一個(gè)控制器 ?*/ @Controller @RequestMapping("/user") public class HelloController { ????//我們知道在Controller類中通過(guò)@InitBinder標(biāo)記的方法只有在請(qǐng)求當(dāng)前Controller的時(shí)候才會(huì)被執(zhí)行 ????//所以在這里注冊(cè)校驗(yàn)器 ????@InitBinder ????public void initBainder(DataBinder binder){ ????????binder.replaceValidators(new UserValidator()); ????} ????//這個(gè)方法主要是跳轉(zhuǎn)到登錄頁(yè)面 ????@RequestMapping(value = "/login",method = RequestMethod.GET) ????public String login(Model model){ ????????model.addAttribute(new User()); ????????return "user/login"; ????} ????//處理登錄表單 ????@RequestMapping(value = "/login",method = RequestMethod.POST) ????public String login(@Validated User user, BindingResult br){ ????????if (br.hasErrors()){ ????????????return "user/login"; ????????} ????????return "--"; ????} ????}</code>

上面代碼可以看到@Validated User user, BindingResult br這兩個(gè)參數(shù),@Validated表明參數(shù)user是要校驗(yàn)的類,BindingResult是存儲(chǔ)錯(cuò)誤信息的類,兩者必須一一對(duì)應(yīng),并且位置挨著,不能中間有其他參數(shù),
最后隨便寫(xiě)一個(gè)jsp頁(yè)面實(shí)現(xiàn)校檢

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <code class="hljs xml"><%@ contenttype="text/html;charset=UTF-8" language="java" page=""> <%@taglib prefix="sf" uri="http://www.springframework.org/tags/form"> <%> ????<sf:form method="post" modelattribute="user"> ????????用戶名:<sf:input path="username"></sf:input><sf:errors path="username"></sf:errors> ????????? ????????密碼:<sf:input path="password"></sf:input><sf:errors path="password"></sf:errors> ????????? ????????昵稱:<sf:input path="nickname"></sf:input><sf:errors path="nickname"></sf:errors> ????????? ????????<input type="submit" value="提交"> ????</sf:form></code>
<%@ contenttype="text/html;charset=UTF-8" language="java" page=""><%@taglib prefix="sf" uri="http://www.springframework.org/tags/form"><%>

前面實(shí)現(xiàn)的是局部校驗(yàn),只對(duì)當(dāng)前控制器有效,如果要實(shí)現(xiàn)全局校驗(yàn)的話需要配置springMVC.xml文件

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 <code class="hljs xml"> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://www.springframework.org/schema/beans ?????http://www.springframework.org/schema/beans/spring-beans-3.0.xsd ?????http://www.springframework.org/schema/context ?????http://www.springframework.org/schema/context/spring-context-3.0.xsd ?????http://www.springframework.org/schema/mvc ?????http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> ????<mvc:annotation-driven validator="userValidator"></mvc:annotation-driven> ????<bean class="com.xxx.xxx.UserValidator" id="userValidator"></bean> ????... </beans></code>

二.使用Annotaion JSR-303標(biāo)準(zhǔn)的驗(yàn)證

使用這個(gè)需要導(dǎo)入支持JSR-303標(biāo)準(zhǔn)的包,建議使用Hibernate Validator這個(gè)包,先看這個(gè)標(biāo)準(zhǔn)的原生標(biāo)注

限制說(shuō)明
@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 限制必須是一個(gè)過(guò)去的日期
@Pattern(value) 限制必須符合指定的正則表達(dá)式
@Size(max,min) 限制字符長(zhǎng)度必須在min到max之間
@Past 驗(yàn)證注解的元素值(日期類型)比當(dāng)前時(shí)間早
@NotEmpty 驗(yàn)證注解的元素值不為null且不為空(字符串長(zhǎng)度不為0、集合大小不為0)
@NotBlank 驗(yàn)證注解的元素值不為空(不為null、去除首位空格后長(zhǎng)度為0),不同于@NotEmpty,@NotBlank只應(yīng)用于字符串且在比較時(shí)會(huì)去除字符串的空格
@Email 驗(yàn)證注解的元素值是Email,也可以通過(guò)正則表達(dá)式和flag指定自定義的email格式

要使用很簡(jiǎn)單,在需要驗(yàn)證的變量前面加上該Annotation即可,看下面使用后的User

?
1 2 3 4 5 6 7 8 9 <code class="hljs java">public class User { ????@NotEmpty(message = "用戶名不能為空") ????private String username; ????@Size(min=6 ,max= 20 ,message = "密碼長(zhǎng)度不符合標(biāo)準(zhǔn)") ????private String password; ????private String nickname; ???...... }</code>

然后再控制器里面加入驗(yàn)證就可以了

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 <code class="hljs java">@Controller @RequestMapping("/user") public class HelloController { ????@RequestMapping(value = "/login",method = RequestMethod.GET) ????public String login(Model model){ ????????model.addAttribute(new User()); ????????return "user/login"; ????} ????@RequestMapping(value = "/login",method = RequestMethod.POST) ????public String login(@Validated User user, BindingResult br){ ????????if (br.hasErrors()){ ????????????return "user/login"; ????????} ????????return "user/login"; ????} ????}</code>

然后jsp頁(yè)面還是之前的頁(yè)面,驗(yàn)證效果如下,這種方法明顯簡(jiǎn)單多了


3.定義自己的Annotation Validator

這部分直接從大牛那拷貝過(guò)來(lái)的.

除了JSR-303原生支持的限制類型之外我們還可以定義自己的限制類型。定義自己的限制類型首先我們得定義一個(gè)該種限制類型的注解,而且該注解需要使用@Constraint標(biāo)注。現(xiàn)在假設(shè)我們需要定義一個(gè)表示金額的限制類型,那么我們可以這樣定義:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 <code class="hljs avrasm"> import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import javax.validation.Constraint; import javax.validation.Payload; import com.xxx.xxx.constraint.impl.MoneyValidator; @Target({ElementType.FIELD, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy=MoneyValidator.class) public @interface Money { ????String message() default"不是金額形式"; ????Class[] groups() default {}; ????Class[] payload() default {}; }</code>

我們可以看到在上面代碼中我們定義了一個(gè)Money注解,而且該注解上標(biāo)注了@Constraint注解,使用@Constraint注解標(biāo)注表明我們定義了一個(gè)用于限制的注解。@Constraint注解的validatedBy屬性用于指定我們定義的當(dāng)前限制類型需要被哪個(gè)ConstraintValidator進(jìn)行校驗(yàn)。在上面代碼中我們指定了Money限制類型的校驗(yàn)類是MoneyValidator。另外需要注意的是我們?cè)诙x自己的限制類型的注解時(shí)有三個(gè)屬性是必須定義的,如上面代碼所示的message、groups和payload屬性。
在定義了限制類型Money之后,接下來(lái)就是定義我們的限制類型校驗(yàn)類MoneyValidator了。限制類型校驗(yàn)類必須實(shí)現(xiàn)接口javax.validation.ConstraintValidator,并實(shí)現(xiàn)它的initialize和isValid方法。我們先來(lái)看一下MoneyValidator的代碼示例:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 <code class="hljs axapta"> import java.util.regex.Pattern; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; import com.xxx.xxx.constraint.Money; public class MoneyValidator implements ConstraintValidator { ????private String moneyReg = "^\\d+(\\.\\d{1,2})?$";//表示金額的正則表達(dá)式 ????private Pattern moneyPattern = Pattern.compile(moneyReg); ????public void initialize(Money money) { ???????// TODO Auto-generated method stub ????} ????public boolean isValid(Double value, ConstraintValidatorContext arg1) { ???????// TODO Auto-generated method stub ???????if (value == null) ???????????return true; ???????return moneyPattern.matcher(value.toString()).matches(); ????} }</code>

從上面代碼中我們可以看到ConstraintValidator是使用了泛型的。它一共需要指定兩種類型,第一個(gè)類型是對(duì)應(yīng)的initialize方法的參數(shù)類型,第二個(gè)類型是對(duì)應(yīng)的isValid方法的第一個(gè)參數(shù)類型。從上面的兩個(gè)方法我們可以看出isValid方法是用于進(jìn)行校驗(yàn)的,有時(shí)候我們?cè)谛r?yàn)的過(guò)程中是需要取當(dāng)前的限制類型的屬性來(lái)進(jìn)行校驗(yàn)的,比如我們?cè)趯?duì)@Min限制類型進(jìn)行校驗(yàn)的時(shí)候我們是需要通過(guò)其value屬性獲取到當(dāng)前校驗(yàn)類型定義的最小值的,我們可以看到isValid方法無(wú)法獲取到當(dāng)前的限制類型Money。這個(gè)時(shí)候initialize方法的作用就出來(lái)了。我們知道initialize方法是可以獲取到當(dāng)前的限制類型的,所以當(dāng)我們?cè)谛r?yàn)?zāi)撤N限制類型時(shí)需要獲取當(dāng)前限制類型的某種屬性的時(shí)候,我們可以給當(dāng)前的ConstraintValidator定義對(duì)應(yīng)的屬性,然后在initialize方法中給該屬性賦值,接下來(lái)我們就可以在isValid方法中使用其對(duì)應(yīng)的屬性了。針對(duì)于這種情況我們來(lái)看一個(gè)代碼示例,現(xiàn)在假設(shè)我要定義自己的@Min限制類型和對(duì)應(yīng)的MinValidator校驗(yàn)器,那么我可以如下定義:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 <code class="hljs handlebars">@Target({ElementType.FIELD, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy=MinValidator.class) public @interface Min { ????int value() default 0; ????String message(); ????Class[] groups() default {}; ????Class[] payload() default {}; }</code>

MinValidator校驗(yàn)器

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <code class="hljs axapta">public class MinValidator implements ConstraintValidator { ????private int minValue; ????public void initialize(Min min) { ???????// TODO Auto-generated method stub ???????//把Min限制類型的屬性value賦值給當(dāng)前ConstraintValidator的成員變量minValue ???????minValue = min.value(); ????} ????public boolean isValid(Integer value, ConstraintValidatorContext arg1) { ???????// TODO Auto-generated method stub ???????//在這里我們就可以通過(guò)當(dāng)前ConstraintValidator的成員變量minValue訪問(wèn)到當(dāng)前限制類型Min的value屬性了 ???????return value >= minValue; ????} }</code>

繼續(xù)來(lái)說(shuō)一下ConstraintValidator泛型的第二個(gè)類型,我們已經(jīng)知道它的第二個(gè)類型是對(duì)應(yīng)的isValid的方法的第一個(gè)參數(shù),從我給的參數(shù)名稱value來(lái)看也可以知道isValid方法的第一個(gè)參數(shù)正是對(duì)應(yīng)的當(dāng)前需要校驗(yàn)的數(shù)據(jù)的值,而它的類型也正是對(duì)應(yīng)的我們需要校驗(yàn)的數(shù)據(jù)的數(shù)據(jù)類型。這兩者的數(shù)據(jù)類型必須保持一致,否則Spring會(huì)提示找不到對(duì)應(yīng)數(shù)據(jù)類型的ConstraintValidator。建立了自己的限制類型及其對(duì)應(yīng)的ConstraintValidator后,其用法跟標(biāo)準(zhǔn)的JSR-303限制類型是一樣的。以下就是使用了上述自己定義的JSR-303限制類型——Money限制和Min限制的一個(gè)實(shí)體類:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 <code class="hljs cs">public class User { ????private int age; ????private Double salary; ????@Min(value=8, message="年齡不能小于8歲") ????public int getAge() { ???????return age; ????} ????public void setAge(int age) { ???????this.age = age; ????} ????@Money(message="標(biāo)準(zhǔn)的金額形式為xxx.xx") ????public Double getSalary() { ???????return salary; ????} ????public void setSalary(Double salary) { ???????this.salary = salary; ????} }</code>

?

總結(jié)

以上是生活随笔為你收集整理的SpringMVC学习记录--Validator验证分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。