zoukankan      html  css  js  c++  java
  • 使用JSR-303 Validation进行验证

    使用JSR-303 Validation进行验证

           JSR-303是一个数据验证的规范,这里我不会讲这个规范是怎么回事,只会讲一下JSR-303SpringMVC中的应用。JSR-303只是一个规范,而Spring也没有对这一规范进行实现,那么当我们在SpringMVC中需要使用到JSR-303的时候就需要我们提供一个对JSR-303规范的实现,Hibernate Validator是实现了这一规范的,这里我将以它作为JSR-303的实现来讲解SpringMVCJSR-303的支持。

           JSR-303的校验是基于注解的,它内部已经定义好了一系列的限制注解,我们只需要把这些注解标记在需要验证的实体类的属性上或是其对应的get方法上。来看以下一个需要验证的实体类User的代码:

    Java代码  

    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的配置文件如下所示:

    Xml代码  

    <?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,其代码如下所示:

    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对象中。

  • 相关阅读:
    项目设计之---------- 模版模式利用
    项目设计之一------简单工厂模式利用
    项目设计之----命令模式的利用
    项目设计之一---------- 代码重构
    项目设计之---------- 类的设计原则
    项目设计之一-------------项目包的设计原则(原)
    模式经验/理解
    Java常量定义需要注意事项及static作用(复习)
    H2数据库使用 详解
    开源数据库 H2, HSQLDB, DERBY, PostgreSQL, MySQL区别/对比图表( 附加翻译) h2数据库
  • 原文地址:https://www.cnblogs.com/Akishimo/p/3527681.html
Copyright © 2011-2022 走看看