SpringMVC(六)数据验证

在系列SpringMVC(四)数据绑定-1SpringMVC(五)数据绑定-2中我们展示了如何绑定数据,绑定完数据之后如何确保我们得到的数据的正确性?这就是我们本篇要说的内容
—> 数据验证。

这里我们采用Hibernate-validator来进行验证,Hibernate-validator实现了JSR-303验证框架支持注解风格的验证。首先我们要到http://hibernate.org/validator/下载需要的jar包,这里以4.3.1.Final作为演示,解压后把hibernate-validator-4.3.1.Final.jar、jboss-logging-3.1.0.jar、validation-api-1.0.0.GA.jar这三个包添加到项目中。

配置之前项目中的springservlet-config.xml文件,如下:

<!-- 默认的注解映射的支持 -->
    <mvc:annotation-driven validator="validator" conversion-service="conversion-service" />

    <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
        <property name="providerClass"  value="org.hibernate.validator.HibernateValidator"/>
        <!--不设置则默认为classpath下的 ValidationMessages.properties -->
        <property name="validationMessageSource" ref="validatemessageSource"/>
    </bean>
    <bean id="conversion-service" class="org.springframework.format.support.FormattingConversionServiceFactoryBean" />
    <bean id="validatemessageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basename" value="classpath:validatemessages"/>
        <property name="fileEncodings" value="utf-8"/>
        <property name="cacheSeconds" value="120"/>
    </bean>

其中<property name="basename" value="classpath:validatemessages"/>中的classpath:validatemessages为注解验证消息所在的文件,需要我们在resources文件夹下添加。

在com.demo.web.controllers包中添加一个ValidateController.java内容如下:

package com.demo.web.controllers;

import java.security.NoSuchAlgorithmException;
import javax.validation.Valid;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.demo.web.models.ValidateModel;

@Controller
@RequestMapping(value = "/validate")
public class ValidateController {

    @RequestMapping(value="/test", method = {RequestMethod.GET})
    public String test(Model model){

        if(!model.containsAttribute("contentModel")){
            model.addAttribute("contentModel", new ValidateModel());
        }
        return "validatetest";
    }

    @RequestMapping(value="/test", method = {RequestMethod.POST})
    public String test(Model model, @Valid @ModelAttribute("contentModel") ValidateModel validateModel, BindingResult result) throws NoSuchAlgorithmException{

        //如果有验证错误 返回到form页面
        if(result.hasErrors())
            return test(model);
        return "validatesuccess";
    }

}

其中@Valid @ModelAttribute("contentModel") ValidateModel validateModel的@Valid 意思是在把数据绑定到@ModelAttribute("contentModel") 后就进行验证。

在com.demo.web.models包中添加一个ValidateModel.java内容如下:

package com.demo.web.models;

import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.NotEmpty;
import org.hibernate.validator.constraints.Range;

public class ValidateModel{

    @NotEmpty(message="{name.not.empty}")
    private String name;
    @Range(min=0, max=150,message="{age.not.inrange}")
    private String age;
    @NotEmpty(message="{email.not.empty}")
    @Email(message="{email.not.correct}")
    private String email;

    public void setName(String name){
        this.name=name;
    }
    public void setAge(String age){
        this.age=age;
    }
    public void setEmail(String email){
        this.email=email;
    }

    public String getName(){
        return this.name;
    }
    public String getAge(){
        return this.age;
    }
    public String getEmail(){
        return this.email;
    }

}

在注解验证消息所在的文件即validatemessages.properties文件中添加以下内容:

name.not.empty=\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A\u3002
age.not.inrange=\u5E74\u9F84\u8D85\u51FA\u8303\u56F4\u3002
email.not.correct=\u90AE\u7BB1\u5730\u5740\u4E0D\u6B63\u786E\u3002
email.not.empty=\u7535\u5B50\u90AE\u4EF6\u4E0D\u80FD\u60DF\u6050\u3002

其中name.not.empty等分别对应了ValidateModel.java文件中message=”xxx”中的xxx名称,后面的内容是在输入中文是自动转换的ASCII编码,当然你也可以直接把xxx写成提示内容,而不用另建一个validatemessages.properties文件再添加,但这是不正确的做法,因为这样硬编码的话就没有办法进行国际化了。

在views文件夹中添加validatetest.jsp和validatesuccess.jsp两个视图,内容分别如下:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <form:form modelAttribute="contentModel" method="post">     

        <form:errors path="*"></form:errors><br/><br/>

        name:<form:input path="name" /><br/>
        <form:errors path="name"></form:errors><br/>

        age:<form:input path="age" /><br/>
        <form:errors path="age"></form:errors><br/>

        email:<form:input path="email" /><br/>
        <form:errors path="email"></form:errors><br/>

        <input type="submit" value="Submit" />

    </form:form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    验证成功!
</body>
</html>

其中特别要指出的是validatetest.jsp视图中<form:form modelAttribute="contentModel" method="post">的modelAttribute="xxx"后面的名称xxx必须与对应的@Valid
@ModelAttribute("xxx") 中的xxx名称一致,否则模型数据和错误信息都绑定不到。

<form:errors path="name"></form:errors>即会显示模型对应属性的错误信息,当path="*"时则显示模型全部属性的错误信息。

运行测试:

直接点击提交:

可以看到正确显示了设置的错误信息。

填写错误数据提交:

可以看到依然正确显示了设置的错误信息。

填写正确数据提交:

可以看到验证成功。

下面是主要的验证注解及说明:


注解


适用的数据类型


说明


@AssertFalse


Boolean, boolean


验证注解的元素值是false


@AssertTrue


Boolean, boolean


验证注解的元素值是true


@DecimalMax(value=x)


BigDecimal, BigInteger, String, byte,short, int, long and the respective wrappers of the primitive types. Additionally supported by HV: any sub-type of Number andCharSequence.


验证注解的元素值小于等于@ DecimalMax指定的value值


@DecimalMin(value=x)


BigDecimal, BigInteger, String, byte,short, int, long and the respective wrappers of the primitive types. Additionally supported by HV: any sub-type of Number andCharSequence.


验证注解的元素值小于等于@ DecimalMin指定的value值


@Digits(integer=整数位数, fraction=小数位数)


BigDecimal, BigInteger, String, byte,short, int, long and the respective wrappers of the primitive types. Additionally supported by HV: any sub-type of Number andCharSequence.


验证注解的元素值的整数位数和小数位数上限


@Future


java.util.Date, java.util.Calendar; Additionally supported by HV, if theJoda
Time
 date/time API is on the class path: any implementations ofReadablePartial andReadableInstant.


验证注解的元素值(日期类型)比当前时间晚


@Max(value=x)


BigDecimal, BigInteger, byte, short,int, long and the respective wrappers of the primitive types. Additionally supported by HV: any sub-type ofCharSequence (the numeric value represented
by the character sequence is evaluated), any sub-type of Number.


验证注解的元素值小于等于@Max指定的value值


@Min(value=x)


BigDecimal, BigInteger, byte, short,int, long and the respective wrappers of the primitive types. Additionally supported by HV: any sub-type of CharSequence (the numeric value represented
by the char sequence is evaluated), any sub-type of Number.


验证注解的元素值大于等于@Min指定的value值


@NotNull


Any type


验证注解的元素值不是null


@Null


Any type


验证注解的元素值是null


@Past


java.util.Date, java.util.Calendar; Additionally supported by HV, if theJoda
Time
 date/time API is on the class path: any implementations ofReadablePartial andReadableInstant.


验证注解的元素值(日期类型)比当前时间早


@Pattern(regex=正则表达式, flag=)


String. Additionally supported by HV: any sub-type of CharSequence.


验证注解的元素值与指定的正则表达式匹配


@Size(min=最小值, max=最大值)


String, Collection, Map and arrays. Additionally supported by HV: any sub-type of CharSequence.


验证注解的元素值的在min和max(包含)指定区间之内,如字符长度、集合大小


@Valid


Any non-primitive type(引用类型)


验证关联的对象,如账户对象里有一个订单对象,指定验证订单对象


@NotEmpty


CharSequence,CollectionMap and Arrays


验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)


@Range(min=最小值, max=最大值)


CharSequence, Collection, Map and Arrays,BigDecimal, BigInteger, CharSequence, byte, short, int, long and the respective wrappers of the primitive types


验证注解的元素值在最小值和最大值之间


@NotBlank


CharSequence


验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格


@Length(min=下限, max=上限)


CharSequence


验证注解的元素值长度在min和max区间内


@Email


CharSequence


验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式

更多信息请参考官方文档:http://docs.jboss.org/hibernate/validator/4.3/reference/en-US/html/validator-usingvalidator.html

时间: 2024-12-28 14:32:23

SpringMVC(六)数据验证的相关文章

SpringMVC学习笔记七:SpringMVC的数据验证

SpringMVC支持JSR(Java Specification Requests, Java规范提案)303-Bean Validation数据验证规范,该规范的实现者很多,其中较常用的是 Hibernate Validator 需要加入的包pom.xml <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-validator --> <dependency> <groupId>org.hi

SpringMVC配置数据验证()

1.pom.xml中追加hibernate-validator 2.在dto类的域上追加JSR-303的注解 public class DataS { @Pattern(regexp = "1993*", message = "生日必须以1993开头") private String dt; /** getter and setter ignore */ } 3.在入参控制器的dto参数前追加@Valid,并追加BindingResult对象 @RequestMap

springMVC数据验证出现404错误解决办法

今天使用springMVC的数据验证的时候,看似很简单的东西,却有一个很大的陷阱:提交空表单的时候总是出现404错误,但是后台却不给你报任何错.遇到这个错误这个很苦恼,搞了几小时,今天记录并分享一下解决经验(本人使用注解式的数据验证): 错误例子: @RequestMapping(value="/login",method=RequestMethod.POST) public String login(@Valid @ModelAttribute("contentModel&

SpringMVC数据验证——注册用户格式的验证实例

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 服务器端的数据验证,对于一个WEB应用来说是非常重要的,而Spring从3.0开始支持JSR-303规范,它定义了一些标准的验证约束,同时也提供了一个可扩展的自定义方式来满足不同的开发需要,大象以SSM3为基础,结合实例来说明如何通过Spring MVC用自定义约束注解的方式来实现Validator验证. validation-api是JSR-303规范的标准接口,hibernate-val

在SpringMVC中使用数据验证组件——hibernate-validator

在做web开发的时候,经常需要对客户端发送过来的数据进行一个验证,以防数据不合法.而SpringMVC支持的数据校验是JSR303的标准,通过在bean的属性上打上annotation @NotNull @Max等注解进行验证.JSR303提供有很多annotation借口,而SpringMVC对于这些验证是使用hibernate的实现,所以我们需要添加hibernate的一个validator包: <dependency> <groupId>org.hibernate</g

nopCommerce开发者指南(六):数据验证

原文链接:http://docs.nopcommerce.com/display/nc/Data+Validation 翻译 by:yersans,如有不妥,敬请指正,博主邮箱:[email protected].转载请注明出处. 数据验证是指对程序操作的数据进行一定的处理以确保它是干净.正确并且有用的.大多数.NET开发者使用数据标注验证.但nopCommerce 使用的是 Fluent Validation.它是一个小型的.NET验证库,使用fluent 接口和lambda 表达式为业务对象

SpringMVC学习系列(6) 之 数据验证

在系列(4).(5)中我们展示了如何绑定数据,绑定完数据之后如何确保我们得到的数据的正确性?这就是我们本篇要说的内容 -> 数据验证. 这里我们采用Hibernate-validator来进行验证,Hibernate-validator实现了JSR-303验证框架支持注解风格的验证.首先我们要到http://hibernate.org/validator/下载需要的jar包,这里以4.3.1.Final作为演示,解压后把hibernate-validator-4.3.1.Final.jar.jb

MVC 数据验证

前一篇说了MVC数据验证的例子,这次来详细说说各种各样的验证注解.System.ComponentModel.DataAnnotations 一.基础特性 一.Required 必填选项,当提交的表单缺少该值就引发验证错误. 二.StringLength 指定允许的长度 指定最大长度: [StringLength(20)] //最大长度不超过20个字符 指定最短于最长限制: [StringLength(20,MinimumLength=3)] //最大长度不超过20个字符,最短不能低于3个字符

【Win10】使用 ValidationAttribute 实现数据验证

WPF 中数据验证的方式多种多样,这里就不说了.但是,在 Windows Phone 8.1 Runtime 中,要实现数据验证,只能靠最基础的手动编写条件判断代码来实现.如果用过 ASP.NET MVC 的那套数据验证的话,再来 WP8.1,那简直就是回到原始社会的感觉. 现在,得益于大一统,mobile 端的 App 也能用上 ValidationAttribute 了!(主要是指 System.ComponentModel.DataAnnotations 这个命名空间下的 Attribut