spring MVC validator

spring mVC提供了很方便的校验,如下:

 

(1)依赖包:

validation-api.jar
hibernate-validator.jar

通过maven引入

Xml代码  

  1. <dependency>  
  2.         <groupId>javax.validation</groupId>  
  3.         <artifactId>validation-api</artifactId>  
  4.         <version>1.1.0.Final</version>  
  5.     </dependency>  
  6.     <dependency>  
  7.         <groupId>org.hibernate</groupId>  
  8.         <artifactId>hibernate-validator</artifactId>  
  9.         <version>5.1.2.Final</version>  
  10.     </dependency>  

 

(2)要验证的实体类

Java代码  

  1. import javax.validation.constraints.AssertFalse;  
  2. import javax.validation.constraints.AssertTrue;  
  3. import javax.validation.constraints.DecimalMax;  
  4. import javax.validation.constraints.DecimalMin;  
  5. import javax.validation.constraints.Max;  
  6. import javax.validation.constraints.Min;  
  7. import javax.validation.constraints.NotNull;  
  8. import javax.validation.constraints.Pattern;  
  9. public class Person {  
  10.        
  11.      @NotNull(message = "用户名称不能为空")   
  12.      private String name;  
  13.        
  14.      @Max(value = 100, message = "年龄不能大于100岁")   
  15.      @Min(value= 18 ,message= "必须年满18岁!" )    
  16.      private int age;  
  17.        
  18.      //必须是ture     
  19.      @AssertTrue(message = "bln4 must is true")  
  20.      private boolean bln;  
  21.        
  22.         //必须是false  
  23.      @AssertFalse(message = "blnf must is falase")  
  24.      private boolean blnf;  
  25.        
  26.      @DecimalMax(value="100",message="decim最大值是100")  
  27.      private int decimax;  
  28.        
  29.      @DecimalMin(value="100",message="decim最小值是100")  
  30.      private int decimin;  
  31.        
  32.     // @Length(min=1,max=5,message="slen长度必须在1~5个字符之间")  
  33.      private String slen;  
  34.       
  35.      @NotNull(message = "身份证不能为空")   
  36.          @Pattern(regexp="^(\\d{18,18}|\\d{15,15}|(\\d{17,17}[x|X]))$", message="身份证格式错误")  
  37.      private String iDCard;  
  38.        
  39.      @NotNull(message="密码不能为空")  
  40.      private String password;  
  41.      @NotNull(message="验证密码不能为空")  
  42.      private String rpassword;  
  43.       
  44.         get/set方法  
  45. }  

 (3)构建controller如下

Java代码  

  1. @Controller  
  2. public class SpringValidatorTest {  
  3.     @RequestMapping("/validator/springtest")  
  4.     public void  springte(@Valid Person person,BindingResult result){  
  5.         if(result.hasErrors()){  
  6.             List<ObjectError>  list = result.getAllErrors();  
  7.             for(ObjectError error: list){  
  8.                 //System.out.println(error.getObjectName());  
  9.                 //System.out.println(error.getArguments()[0]);  
  10.                 System.out.println(error.getDefaultMessage());//验证信息  
  11.             }  
  12.                       
  13.         }  
  14.       
  15.     }  
  16. }  

 

 

(4)使用场景:添加或提交修改时进行字段的校验


 登录:


 

 

注意:BindingResult一定要紧跟在实体类的后面,否则报错:

HTTP Status 400 -



type Status report

message

description The request sent by the client was syntactically incorrect.


Apache Tomcat/7.0.53

 

错误的代码:

Java代码  

  1. @RequestMapping(value = "/add",method=RequestMethod.POST)  
  2.     public String addSaveNews(@Valid RoleLevel roleLevel, Model model, BindingResult binding) {  
  3.         if(binding.hasErrors()){  
  4.             model.addAttribute(roleLevel);  
  5.             return jspFolder+"/add";  
  6.         }  
  7.         saveCommon(roleLevel, model);  
  8.         return redirectViewAll;  
  9.     }  

 正确的代码:

Java代码  

  1. @RequestMapping(value = "/add",method=RequestMethod.POST)  
  2.     public String addSaveNews(@Valid RoleLevel roleLevel, BindingResult binding, Model model) {  
  3.         if(binding.hasErrors()){  
  4.             model.addAttribute(roleLevel);  
  5.             return jspFolder+"/add";  
  6.         }  
  7.         saveCommon(roleLevel, model);  
  8.         return redirectViewAll;  
  9.     }  

 

官方资料

Declaring bean constraints

Constraints in Bean Validation are expressed via Java annotations. In this section you will learn how to enhance an object model with these annotations. There are the following three types of bean constraints:

  • field constraints
  • property constraints
  • class constraints

Note

Not all constraints can be placed on all of these levels. In fact, none of the default constraints defined by Bean Validation can be placed at class level. TheJava.lang.annotation.Target annotation in the constraint annotation itself determines on which elements a constraint can be placed. See Chapter 6, Creating custom constraints for more information.

2.1.1. Field-level constraints

Constraints can be expressed by annotating a field of a class. Example 2.1, “Field-level constraints”shows a field level configuration example:

Example 2.1. Field-level constraints

package org.hibernate.validator.referenceguide.chapter02.fieldlevel;

public class Car {

    @NotNull
    private String manufacturer;

    @AssertTrue
    private boolean isRegistered;

    public Car(String manufacturer, boolean isRegistered) {
        this.manufacturer = manufacturer;
        this.isRegistered = isRegistered;
    }

    //getters and setters...
}

When using field-level constraints field access strategy is used to access the value to be validated. This means the validation engine directly accesses the instance variable and does not invoke the property accessor method even if such an accessor exists.

Constraints can be applied to fields of any access type (public, private etc.). Constraints on static fields are not supported, though.

Tip

When validating byte code enhanced objects property level constraints should be used, because the byte code enhancing library won't be able to determine a field access via reflection.

2.1.2. Property-level constraints

If your model class adheres to the JavaBeans standard, it is also possible to annotate the properties of a bean class instead of its fields. Example 2.2, “Property-level constraints” uses the same entity as inExample 2.1, “Field-level constraints”, however, property level constraints are used.

Example 2.2. Property-level constraints

package org.hibernate.validator.referenceguide.chapter02.propertylevel;

public class Car {

    private String manufacturer;

    private boolean isRegistered;

    public Car(String manufacturer, boolean isRegistered) {
        this.manufacturer = manufacturer;
        this.isRegistered = isRegistered;
    }

    @NotNull
    public String getManufacturer() {
        return manufacturer;
    }

    public void setManufacturer(String manufacturer) {
        this.manufacturer = manufacturer;
    }

    @AssertTrue
    public boolean isRegistered() {
        return isRegistered;
    }

    public void setRegistered(boolean isRegistered) {
        this.isRegistered = isRegistered;
    }
}

Note

The property's getter method has to be annotated, not its setter. That way also read-only properties can be constrained which have no setter method.

When using property level constraints property access strategy is used to access the value to be validated, i.e. the validation engine accesses the state via the property accessor method.

Tip

It is recommended to stick either to field or property annotations within one class. It is not recommended to annotate a field and the accompanying getter method as this would cause the field to be validated twice.

2.1.3. Class-level constraints

Last but not least, a constraint can also be placed on the class level. In this case not a single property is subject of the validation but the complete object. Class-level constraints are useful if the validation depends on a correlation between several properties of an object.

The Car class in Example 2.3, “Class-level constraint” has the two attributes seatCount and passengersand it should be ensured that the list of passengers has not more entries than seats are available. For that purpose the @ValidPassengerCount constraint is added on the class level. The validator of that constraint has access to the complete Car object, allowing to compare the numbers of seats and passengers.

Refer to Section 6.2, “Class-level constraints” to learn in detail how to implement this custom constraint.

Example 2.3. Class-level constraint

package org.hibernate.validator.referenceguide.chapter02.classlevel;

@ValidPassengerCount
public class Car {

    private int seatCount;

    private List<Person> passengers;

    //...
}

 

 

参考:http://docs.jboss.org/hibernate/stable/validator/reference/en-US/html/

http://www.yunmasoft.com

http://blog.csdn.net/xpsharp/article/details/9366865

 

时间: 2025-01-20 12:28:19

spring MVC validator的相关文章

Spring MVC入门 —— 跟开涛学SpringMVC

2014-05-14 23:22:27 第二章 Spring MVC入门 -- 跟开涛学SpringMVC  浏览(84979)|评论(12)   交流分类:Java|笔记分类: 跟开涛学Spring--  2.1.Spring Web MVC是什么 Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,Spring

Spring MVC 详解

第一章 Web MVC简介Web MVC简介 1.1.Web开发中的请求-响应模型:   在Web世界里,具体步骤如下: 1.  Web浏览器(如IE)发起请求,如访问http://sishuok.com 2.  Web服务器(如Tomcat)接收请求,处理请求(比如用户新增,则将把用户保存一下),最后产生响应(一般为html). 3.web服务器处理完成后,返回内容给web客户端(一般就是我们的浏览器),客户端对接收的内容进行处理(如web浏览器将会对接收到的html内容进行渲染以展示给客户)

Supported method argument types Spring MVC

Supported method argument types The following are the supported method arguments: Request or response objects (Servlet API). Choose any specific request or response type, for example ServletRequest or HttpServletRequest. Session object (Servlet API):

Spring MVC @RequestMapping Annotation Example with Controller, Methods, Headers, Params, @RequestPar

Spring MVC @RequestMapping Annotation Example with Controller, Methods, Headers, Params, @RequestParam, @PathVariable Pankaj July 4, 2014 Spring @RequestMapping is one of the most widely used Spring MVC annotation.org.springframework.web.bind.annotat

Spring MVC数据校验与国际化

1. JSR-303 JSR-303 是JAVA EE 6 中的一项子规范,叫做Bean Validation,官方参考实现是Hibernate Validator. 此实现与Hibernate ORM 没有任何关系.JSR 303 用于对Java Bean 中的字段的值进行验证. Spring MVC 3.x之中也大力支持 JSR-303,可以在控制器中对表单提交的数据方便地验证. JSR 303内置的约束规则: @AssertTrue / @AssertFalse 验证适用字段:boolea

[Spring MVC] -简单表单提交实例_java

Spring MVC自带的表单标签比较简单,很多时候需要借助EL和JSTL来完成. 下面是一个比较简单的表单提交页面功能:  1.User model package com.my.controller.bean; import java.util.Date; import java.util.List; import javax.validation.constraints.Future; import javax.validation.constraints.Max; import java

Spring MVC 之输入验证(六)

Spring MVC 验证主要还是用的是hibernate的验证.so需要添加以下的jar包: 1. hibernate-validator-5.2.2.Final.jar 2.hibernate-validator-annotation-processor-5.2.2.Final.jar (这个可以不用) 3. log4j.jar 4 .slf4j-api-1.5.6.jar 5. slf4j-log4j12-1.5.6.jar 6 .validation-api-1.1.0.Final.ja

Spring MVC中的MultiActionController用法详解

Spring MVC 中 Controller 的层次实在是多,有些眼花缭乱了 .在单个的基础上,再新加两三个叫做丰富,再多就未必是好事, 反而会令人缩手新闻片脚,无从定夺.多数 Controller 都是只完 成一个任务,不过也有一个像 Struts 的 DispatchAction 的那样 的 Conntroller, org.springframework.web.servlet.mvc.multiaction.MultiActio nController,意即在一个 Controller

深入整体分析Spring MVC framework

在当今的MVC framework里,似乎Webwork2逐渐成为主流, Webwork2+SpringFramework的组合变得越来越流行.这似乎意味着Spring自带的MVC framework远比Webwork2差,所以大家纷纷用Webwork2来代替.确实,Spring的MVC framework不算是整个Spring的核心部件,但它的威力却超过了很多人的想象.很多人包括xiecc认为Spring的MVC framework是非常优秀的,甚至比Webwork2更优秀. 下面列举一下Sp