日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內(nèi)最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > php開源 > php教程 > SpringMVC服務(wù)器端校驗(yàn)-無配置文件

SpringMVC服務(wù)器端校驗(yàn)-無配置文件

來源:程序員人生   發(fā)布時(shí)間:2016-07-26 13:48:56 閱讀次數(shù):3513次

使用Validator接口進(jìn)行驗(yàn)證

       在SpringMVC中提供了1個(gè)Validator接口,我們可以通過該接口來定義我們自己對實(shí)體對象的驗(yàn)證。接下來看1個(gè)示例。

       假定我們現(xiàn)在有1個(gè)需要進(jìn)行驗(yàn)證的實(shí)體類User,其代碼以下所示:

Java代碼  收藏代碼
  1. public class User {  
  2.    
  3.     private String username;  
  4.      
  5.     private String password;  
  6.    
  7.     public String getUsername() {  
  8.        return username;  
  9.     }  
  10.    
  11.     public void setUsername(String username) {  
  12.        this.username = username;  
  13.     }  
  14.    
  15.     public String getPassword() {  
  16.        return password;  
  17.     }  
  18.    
  19.     public void setPassword(String password) {  
  20.        this.password = password;  
  21.     }  
  22.      
  23.     public String toString() {  
  24.        return username + ", " + password;  
  25.     }  
  26.      
  27. }  

 

       那末當(dāng)我們需要使用SpringMVC提供的Validator接口來對該實(shí)體類進(jìn)行校驗(yàn)的時(shí)候該如何做呢?這個(gè)時(shí)候我們應(yīng)當(dāng)提供1個(gè)Validator的實(shí)現(xiàn)類,并實(shí)現(xiàn)Validator接口的supports方法和validate方法。Supports方法用于判斷當(dāng)前的Validator實(shí)現(xiàn)類是不是支持校驗(yàn)當(dāng)前需要校驗(yàn)的實(shí)體類,只有當(dāng)supports方法的返回結(jié)果為true的時(shí)候,該Validator接口實(shí)現(xiàn)類的validate方法才會(huì)被調(diào)用來對當(dāng)前需要校驗(yàn)的實(shí)體類進(jìn)行校驗(yàn)。這里假定我們需要驗(yàn)證User類的username和password都不能為空,先給出其代碼,稍后再進(jìn)行解釋。這里我們定義1個(gè)UserValidator,其代碼以下:

Java代碼  收藏代碼
  1. import org.springframework.validation.Errors;  
  2. import org.springframework.validation.ValidationUtils;  
  3. import org.springframework.validation.Validator;  
  4.    
  5. public class UserValidator implements Validator {  
  6.    
  7.     public boolean supports(Class<?> clazz) {  
  8.        // TODO Auto-generated method stub  
  9.        return User.class.equals(clazz);  
  10.     }  
  11.    
  12.     public void validate(Object obj, Errors errors) {  
  13.        // TODO Auto-generated method stub  
  14.        ValidationUtils.rejectIfEmpty(errors, "username"null"Username is empty.");  
  15.        User user = (User) obj;  
  16.        if (null == user.getPassword() || "".equals(user.getPassword()))  
  17.            errors.rejectValue("password"null"Password is empty.");  
  18.     }  
  19.    
  20. }  

 

       在上述代碼中我們在supports方法中定義了該UserValidator只支持對User對象進(jìn)行校驗(yàn)。在validate方法中我們校驗(yàn)了User對象的username和password不為empty的情況,這里的empty包括null和空字符串兩種情況。ValidationUtils類是Spring中提供的1個(gè)工具類。Errors就是Spring用來寄存毛病信息的對象。

       我們已定義了1個(gè)對User類進(jìn)行校驗(yàn)的UserValidator了,但是這個(gè)時(shí)候UserValidator還不能對User對象進(jìn)行校驗(yàn),由于我們還沒有告知Spring應(yīng)當(dāng)使用UserValidator來校驗(yàn)User對象。在SpringMVC中我們可使用DataBinder來設(shè)定當(dāng)前Controller需要使用的Validator。先來看下面1段代碼:

 

Java代碼  收藏代碼
  1. import javax.validation.Valid;  
  2. import org.springframework.stereotype.Controller;  
  3. import org.springframework.validation.BindingResult;  
  4. import org.springframework.validation.DataBinder;  
  5. import org.springframework.web.bind.annotation.InitBinder;  
  6. import org.springframework.web.bind.annotation.RequestMapping;  
  7.    
  8. @Controller  
  9. public class UserController {  
  10.      
  11.     @InitBinder  
  12.     public void initBinder(DataBinder binder) {  
  13.        binder.setValidator(new UserValidator());  
  14.     }  
  15.    
  16.     @RequestMapping("login")  
  17.     public String login(@Valid User user, BindingResult result) {  
  18.        if (result.hasErrors())  
  19.            return "redirect:user/login";  
  20.        return "redirect:/";  
  21.     }  
  22.      
  23. }  

 

       在上面這段代碼中我們可以看到我們定義了1個(gè)UserController,該Controller有1個(gè)處理login操作的處理器方法login,它需要接收客戶端發(fā)送的1個(gè)User對象,我們就是要利用前面的UserValidator對該User對象進(jìn)行校驗(yàn)。首先我們可以看到我們login方法接收的參數(shù)user是用@Valid進(jìn)行標(biāo)注的,這里的@Valid是定義在JSR⑶03標(biāo)準(zhǔn)中的,我這里使用的是Hibernate Validation對它的實(shí)現(xiàn)。這里我們必須使用@Valid標(biāo)注我們需要校驗(yàn)的參數(shù)user,否則Spring不會(huì)對它進(jìn)行校驗(yàn)。另外我們的處理器方法必須給定包括Errors的參數(shù),這可以是Errors本身,也能夠是它的子類BindingResult,使用了Errors參數(shù)就是告知Spring關(guān)于表單對象數(shù)據(jù)校驗(yàn)的毛病將由我們自己來處理,否則Spring會(huì)直接拋出異常,而且這個(gè)參數(shù)是必須緊挨著@Valid參數(shù)的,即必須緊挨著需要校驗(yàn)的參數(shù),這就意味著我們有多少個(gè)@Valid參數(shù)就需要有多少個(gè)對應(yīng)的Errors參數(shù),它們是逐一對應(yīng)的。前面有提到我們可以通過DataBinder來指定需要使用的Validator,我們可以看到在上面代碼中我們通過@InitBinder標(biāo)記的方法initBinder設(shè)置了當(dāng)前Controller需要使用的Validator是UserValidator。這樣當(dāng)我們要求處理器方法login時(shí)就會(huì)使用DataBinder設(shè)定的UserValidator來校驗(yàn)當(dāng)前的表單對象User,首先會(huì)通過UserValidator的supports方法判斷其是不是支持User對象的校驗(yàn),若支持則調(diào)用UserValidator的validate方法,并把相干的校驗(yàn)信息寄存到當(dāng)前的Errors對象中。接著我們就能夠在我們的處理器方法中根據(jù)是不是有校驗(yàn)異常信息來做不同的操作。在上面代碼中我們定義了在有異常信息的時(shí)候就跳轉(zhuǎn)到登陸頁面。這樣我們就能夠在登陸頁面上通過errors標(biāo)簽來展現(xiàn)這些毛病信息了。

       我們知道在Controller類中通過@InitBinder標(biāo)記的方法只有在要求當(dāng)前Controller的時(shí)候才會(huì)被履行,所以其中定義的Validator也只能在當(dāng)前Controller中使用,如果我們希望1個(gè)Validator對所有的Controller都起作用的話,我們可以通過WebBindingInitializer的initBinder方法來設(shè)定了。另外,在SpringMVC的配置文件中通過mvc:annotation-driven的validator屬性也能夠指定全局的Validator。代碼以下所示:

Xml代碼  收藏代碼
  1. <?xml version="1.0" encoding="UTF⑻"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"  
  4.     xmlns:mvc="http://www.springframework.org/schema/mvc"  
  5.     xsi:schemaLocation="http://www.springframework.org/schema/beans  
  6.      http://www.springframework.org/schema/beans/spring-beans⑶.0.xsd  
  7.      http://www.springframework.org/schema/context  
  8.      http://www.springframework.org/schema/context/spring-context⑶.0.xsd  
  9.      http://www.springframework.org/schema/mvc  
  10.      http://www.springframework.org/schema/mvc/spring-mvc⑶.0.xsd">  
  11.       
  12.     <mvc:annotation-driven validator="userValidator"/>  
  13.      
  14.     <bean id="userValidator" class="com.xxx.xxx.UserValidator"/>  
  15.    
  16.     ...  
  17. </beans>  

 

       

使用JSR⑶03 Validation進(jìn)行驗(yàn)證

       JSR⑶03是1個(gè)數(shù)據(jù)驗(yàn)證的規(guī)范,這里我不會(huì)講這個(gè)規(guī)范是怎樣回事,只會(huì)講1下JSR⑶03在SpringMVC中的利用。JSR⑶03只是1個(gè)規(guī)范,而Spring也沒有對這1規(guī)范進(jìn)行實(shí)現(xiàn),那末當(dāng)我們在SpringMVC中需要使用到JSR⑶03的時(shí)候就需要我們提供1個(gè)對JSR⑶03規(guī)范的實(shí)現(xiàn),Hibernate Validator是實(shí)現(xiàn)了這1規(guī)范的,這里我將以它作為JSR⑶03的實(shí)現(xiàn)來說解SpringMVC對JSR⑶03的支持。

       JSR⑶03的校驗(yàn)是基于注解的,它內(nèi)部已定義好了1系列的限制注解,我們只需要把這些注解標(biāo)記在需要驗(yàn)證的實(shí)體類的屬性上或是其對應(yīng)的get方法上。來看以下1個(gè)需要驗(yàn)證的實(shí)體類User的代碼:

Java代碼  收藏代碼
  1.    
  2. import javax.validation.constraints.Min;  
  3. import javax.validation.constraints.NotNull;  
  4. import org.hibernate.validator.constraints.NotBlank;  
  5.    
  6. public class User {  
  7.    
  8.     private String username;  
  9.      
  10.     private String password;  
  11.      
  12.     private int age;  
  13.    
  14.     @NotBlank(message="用戶名不能為空")  
  15.     public String getUsername() {  
  16.        return username;  
  17.     }  
  18.    
  19.     public void setUsername(String username) {  
  20.        this.username = username;  
  21.     }  
  22.    
  23.     @NotNull(message="密碼不能為null")  
  24.     public String getPassword() {  
  25.        return password;  
  26.     }  
  27.    
  28.     public void setPassword(String password) {  
  29.        this.password = password;  
  30.     }  
  31.    
  32.     @Min(value=10, message="年齡的最小值為10")  
  33.     public int getAge() {  
  34.        return age;  
  35.     }  
  36.    
  37.     public void setAge(int age) {  
  38.        this.age = age;  
  39.     }  
  40.      
  41. }  

 

       我們可以看到我們在username、password和age對應(yīng)的get方法上都加上了1個(gè)注解,這些注解就是JSR⑶03里面定義的限制,其中@NotBlank是Hibernate Validator的擴(kuò)大。不難發(fā)現(xiàn),使用JSR⑶03來進(jìn)行校驗(yàn)比使用Spring提供的Validator接口要簡單的多。我們知道注解只是起到1個(gè)標(biāo)記性的作用,它是不會(huì)直接影響到代碼的運(yùn)行的,它需要被某些類辨認(rèn)到才能起到限制作用。使用SpringMVC的時(shí)候我們只需要把JSR⑶03的實(shí)現(xiàn)者對應(yīng)的jar包放到classpath中,然后在SpringMVC的配置文件中引入MVC Namespace,并加上<mvn:annotation-driven/>就能夠非常方便的使用JSR⑶03來進(jìn)行實(shí)體對象的驗(yàn)證。加上了<mvn:annotation-driven/>以后Spring會(huì)自動(dòng)檢測classpath下的JSR⑶03提供者并自動(dòng)啟用對JSR⑶03的支持,把對應(yīng)的校驗(yàn)毛病信息放到Spring的Errors對象中。這時(shí)候候SpringMVC的配置文件以下所示:

Xml代碼  收藏代碼
  1. <?xml version="1.0" encoding="UTF⑻"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"  
  4.     xmlns:mvc="http://www.springframework.org/schema/mvc"  
  5.     xsi:schemaLocation="http://www.springframework.org/schema/beans  
  6.      http://www.springframework.org/schema/beans/spring-beans⑶.0.xsd  
  7.      http://www.springframework.org/schema/context  
  8.      http://www.springframework.org/schema/context/spring-context⑶.0.xsd  
  9.      http://www.springframework.org/schema/mvc  
  10.      http://www.springframework.org/schema/mvc/spring-mvc⑶.0.xsd">  
  11.       
  12.     <mvc:annotation-driven/>  
  13. </beans>  

 

       接著我們來定義1個(gè)使用User對象作為參數(shù)接收者的Controller,其代碼以下所示:

Java代碼  收藏代碼
  1. import javax.validation.Valid;  
  2. import org.springframework.stereotype.Controller;  
  3. import org.springframework.validation.BindingResult;  
  4. import org.springframework.web.bind.annotation.RequestMapping;  
  5.    
  6. @Controller  
  7. public class UserController {  
  8.    
  9.     @RequestMapping("login")  
  10.     public String login(@Valid User user, BindingResult result) {  
  11.        if (result.hasErrors())  
  12.            return "user/login";  
  13.        return "redirect:/";  
  14.     }  
  15.      
  16. }  

 

       這樣當(dāng)我們不帶任何參數(shù)要求login.do的時(shí)候就不能通過實(shí)體對象User的屬性數(shù)據(jù)有效性限制,然后會(huì)把對應(yīng)的毛病信息放置在當(dāng)前的Errors對象中。

 

JSR⑶03原生支持的限制有以下幾種

限制

說明

@Null

限制只能為null

@NotNull

限制必須不為null

@AssertFalse

限制必須為false

@AssertTrue

限制必須為true

@DecimalMax(value)

限制必須為1個(gè)不大于指定值的數(shù)字

@DecimalMin(value)

限制必須為1個(gè)不小于指定值的數(shù)字

@Digits(integer,fraction)

限制必須為1個(gè)小數(shù),且整數(shù)部份的位數(shù)不能超過integer,小數(shù)部份的位數(shù)不能超過fraction

@Future

限制必須是1個(gè)將來的日期

@Max(value)

限制必須為1個(gè)不大于指定值的數(shù)字

@Min(value)

限制必須為1個(gè)不小于指定值的數(shù)字

@Past

限制必須是1個(gè)過去的日期

@Pattern(value)

限制必須符合指定的正則表達(dá)式

@Size(max,min)

限制字符長度必須在minmax之間

 

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

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

 

       我們可以看到在上面代碼中我們定義了1個(gè)Money注解,而且該注解上標(biāo)注了@Constraint注解,使用@Constraint注解標(biāo)注表明我們定義了1個(gè)用于限制的注解。@Constraint注解的validatedBy屬性用于指定我們定義確當(dāng)前限制類型需要被哪一個(gè)ConstraintValidator進(jìn)行校驗(yàn)。在上面代碼中我們指定了Money限制類型的校驗(yàn)類是MoneyValidator。另外需要注意的是我們在定義自己的限制類型的注解時(shí)有3個(gè)屬性是必須定義的,如上面代碼所示的messagegroupspayload屬性。

       在定義了限制類型Money以后,接下來就是定義我們的限制類型校驗(yàn)類MoneyValidator了。限制類型校驗(yàn)類必須實(shí)現(xiàn)接口javax.validation.ConstraintValidator,并實(shí)現(xiàn)它的initialize和isValid方法。我們先來看1下MoneyValidator的代碼示例:

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

 

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

Min限制類型

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

 

 

MinValidator校驗(yàn)器

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

 

 

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

Java代碼  收藏代碼
  1. public class User {  
  2.      
  3.     private int age;  
  4.      
  5.     private Double salary;  
  6.    
  7.     @Min(value=8, message="年齡不能小于8歲")  
  8.     public int getAge() {  
  9.        return age;  
  10.     }  
  11.    
  12.     public void setAge(int age) {  
  13.        this.age = age;  
  14.     }  
  15.    
  16.     @Money(message="標(biāo)準(zhǔn)的金額情勢為xxx.xx")  
  17. 生活不易,碼農(nóng)辛苦
    如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
    程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 国产一区二区三区不卡在线观看 | 久久国产系列 | 美女久久 | 国产精品久久久久久久久久久免费看 | 亚洲黄色在线视频 | 欧美一区亚洲一区 | 精品久久久久久久久久中出 | 亚洲精品免费在线观看 | 国产亚洲精品美女 | 三级网站视频 | 久久综合一区 | 久久网亚洲| 亚洲精品久久久久 | 亚洲最大黄网 | 日韩欧美精品一区二区三区经典 | 欧美成人性生活 | 在线视频一区二区 | 亚洲字幕| 福利久久 | 国产乱色国产精品播放视频 | 日本天堂在线 | 中文字幕av在线播放 | 91精品一区二区三区在线观看 | 久久精品电影 | 精品视频在线免费观看 | 久久久久久久免费 | 一区二区三区国产片 | 日韩午夜激情 | 国产精品免费一区二区 | 国产黄色精品 | 国产视频在线播放 | 欧美电影一区二区三区 | 国产日韩欧美精品 | 日韩成人影院 | 久久久成人精品 | 青青草免费在线视频播放 | 成人精品鲁一区一区二区 | 国产真实夫妇6p酒店交换 | 国产精品一区二区三区免费视频 | 精品日韩视频 | 欧美天堂在线 |