使用JSR-303 Validation進行驗證

使用JSR-303 Validation進行驗證java

       JSR-303是一個數據驗證的規範,這裏我不會講這個規範是怎麼回事,只會講一下JSR-303SpringMVC中的應用。JSR-303只是一個規範,而Spring也沒有對這一規範進行實現,那麼當咱們在SpringMVC中須要使用到JSR-303的時候就須要咱們提供一個對JSR-303規範的實現,Hibernate Validator是實現了這一規範的,這裏我將以它做爲JSR-303的實現來說解SpringMVCJSR-303的支持。web

       JSR-303的校驗是基於註解的,它內部已經定義好了一系列的限制註解,咱們只須要把這些註解標記在須要驗證的實體類的屬性上或是其對應的get方法上。來看如下一個須要驗證的實體類User的代碼:spring

Java代碼  spring-mvc

import javax.validation.constraints.Min;  
import javax.validation.constraints.NotNull;  
import org.hibernate.validator.constraints.NotBlank;  
   
public class User {  
   
    private String username;  
     
    private String password;  
     
    private int age;  
   
    @NotBlank(message="用戶名不能爲空")  
    public String getUsername() {  
       return username;  
    }  
   
    public void setUsername(String username) {  
       this.username = username;  
    }  
   
    @NotNull(message="密碼不能爲null")  
    public String getPassword() {  
       return password;  
    }  
   
    public void setPassword(String password) {  
       this.password = password;  
    }  
   
    @Min(value=10, message="年齡的最小值爲10")  
    public int getAge() {  
       return age;  
    }  
   
    public void setAge(int age) {  
       this.age = age;  
    }  
     
}  

咱們能夠看到咱們在usernamepasswordage對應的get方法上都加上了一個註解,這些註解就是JSR-303裏面定義的限制,其中@NotBlankHibernate Validator的擴展。不難發現,使用JSR-303來進行校驗比使用Spring提供的Validator接口要簡單的多。咱們知道註解只是起到一個標記性的做用,它是不會直接影響到代碼的運行的,它須要被某些類識別到才能起到限制做用。使用SpringMVC的時候咱們只須要把JSR-303的實現者對應的jar包放到classpath中,而後在SpringMVC的配置文件中引入MVC Namespace,並加上<mvn:annotation-driven/>就能夠很是方便的使用JSR-303來進行實體對象的驗證。加上了<mvn:annotation-driven/>以後Spring會自動檢測classpath下的JSR-303提供者並自動啓用對JSR-303的支持,把對應的校驗錯誤信息放到SpringErrors對象中。這時候SpringMVC的配置文件以下所示:mvc

Xml代碼  app

<?xml version="1.0" encoding="UTF-8"?>  
<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"  
    xmlns:mvc="http://www.springframework.org/schema/mvc"  
    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/>  
</beans>  

接着咱們來定義一個使用User對象做爲參數接收者的Controller,其代碼以下所示:this

import javax.validation.Valid;  
import org.springframework.stereotype.Controller;  
import org.springframework.validation.BindingResult;  
import org.springframework.web.bind.annotation.RequestMapping;  
   
@Controller  
public class UserController {  
   
    @RequestMapping("login")  
    public String login(@Valid User user, BindingResult result) {  
       if (result.hasErrors())  
           return "user/login";  
       return "redirect:/";  
    }  
     
}  
 

 

 

這樣當咱們不帶任何參數請求login.do的時候就不能經過實體對象User的屬性數據有效性限制,而後會把對應的錯誤信息放置在當前的Errors對象中。spa

相關文章
相關標籤/搜索