SpringMVC 数据校验方法(必看篇)

 更新时间:2017年06月01日 08:57:29   投稿:jingxian  
下面小编就为大家带来一篇SpringMVC 数据校验方法(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

数据校验在web应用里是非常重要的功能,尤其是在表单输入中。在这里采用Hibernate-Vapdator进行校验,该方法实现了JSR-303验证框架支持注解风格的验证。

一、导入jar包

若要实现数据校验功能,需要导入必要的jar包,主要包括以下几个:

classmate-1.3.1.jar

hibernate-vapdator-5.4.1.Final.jar

hibernate-vapdator-annotation-processor-5.4.1.Final.jar

hibernate-vapdator-cdi-5.4.1.Final.jar

jboss-logging-3.3.0.Final.jar

vapdation-api-1.1.0.Final.jar

二、常用的校验注解

注解 功能
@Null 验证对象是否为 null
@NotNull 验证对象是否不为 null
@AssertTrue 验证 Boolean 对象是否为 true
@AssertTrue 验证 Boolean 对象是否为 false
@Max(value) 验证 Number 和 String 对象是否小于等于指定值
@Min(value) 验证 Number 和 String 对象是否大于等于指定值
@DecimalMax(value) 验证注解的元素值小于等于 @DecimalMax 指定的 value 值
@DecimalMin(value) 验证注解的元素值大于等于 @DecimalMin 指定的 value 值
@Digits(integer,fraction) 验证字符串是否符合指定格式的数字,integer 指定整数精度,fraction 指定小数精度
@Size(min,max) 验证对象长度是否在给定的范围内
@Past 验证 Date 和 Calendar 对象是否在当前时间之前
@Future 验证 Date 和 Calendar 对象是否在当前时间之后
@Pattern 验证 String 对象是否符合正则表达式的规则
@NotBlank 检查字符串是不是 Null,被 Trim 的长度是否大于0,只对字符串,且会去掉前后空格
@URL 验证是否是合法的 url
@Email 验证是否是合法的邮箱
@CreditCardNumber 验证是否是合法的信用卡号
@Length(min,max) 验证字符串的长度必须在指定范围内
@NotEmpty 检查元素是否为 Null 或 Empty
@Range(min,max,message) 验证属性值必须在合适的范围内

三、修改实体类

在类的属性上进行标注,如:

public class User {
  @NotBlank(message = "Username can not be empty")
  private String username;
  @NotBlank(message = "password can not be blank")
  @Length(min = 6, max = 16, message = "The length of the password must be between 6 and 16 bits")
  private String password;
  @Range(min = 18, max = 60, message = "Age must be between 18 and 60 years old")
  private Integer age;
  @Pattern(regexp = "^1[3|4|5|7|8][0-9]{9}$", message = "Please enter the correct format of the phone number")
  private String phone;
  @Email(message = "Please enter a valid email address")
  private String email;

  // other...  
}

四、修改相应的处理方法

@RequestMapping(value = "/register")
public String register(@Valid @ModelAttribute("user") User user, Errors errors,Model model) {
  if(errors.hasErrors()){
    return "register";
  }
  model.addAttribute("user", user);
  return "success";
}

五、视图输出

校验之后,我们通常需要在表单的输入框后进行文字反馈:

<form:form modelAttribute="user" method="post" action="register">
  <fieldset>
    <legend>register</legend>
    <p>
      <label>name:</label>
      <form:input path="username" />
      <form:errors path="username" cssStyle="color:red"/>
    </p>
     ...
  </fieldset>
</form:form>

然而,有些时候并不推荐直接将错误信息写在注解的message属性里,这样不方便国际化。因此可以做以下几处修改:

1. 新建validatemessages.properties

username.not.blank = "username cannot be empty..."
password.not.blank = "password cannot be empty"
password.not.length = "password should be in 6-10"
age.not.range = "age should be in 10-70"
phone.not.pattern = "phone should be in format"
email.not.format = "email should be in format"

2. 实体类中的注解使用相对引用

public class User {
  
  @NotBlank(message = "{username.not.blank}")
  private String username;
  
  @NotBlank(message = "{password.not.blank}")
  @Length(min = 6, max = 10, message = "{password.not.length}")
  private String password;
  
  @Range(min = 10, max = 70, message = "{age.not.range}")
  private Integer age;
  
  @Pattern(regexp = "^1[3|4|5|7|8][0-9]{9}$", message = "{phone.not.pattern}")
  private String phone;
  
  @Email(message = "{email.not.format}")
  private String email;
  
  // other...
}

3. 修改配置文件

<!-- 默认的注解映射的支持 --> 
  <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>

特别注意:value="classpath:validatemessages",文件名不加后缀!

至此,数据校验的整个过程就结束了。

最后还要特别强调的重点是:

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

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

以上这篇SpringMVC 数据校验方法(必看篇)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot连接PostgreSQL+MybatisPlus入门案例(代码详解)

    SpringBoot连接PostgreSQL+MybatisPlus入门案例(代码详解)

    这篇文章主要介绍了SpringBoot连接PostgreSQL+MybatisPlus入门案例,本文通过实例代码图文相结合给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-07-07
  • Java解决同时出库入库订单号自动获取问题解决

    Java解决同时出库入库订单号自动获取问题解决

    在Java中,处理多线程环境下的订单号生成问题可以采用多种策略,如使用AtomicLong保证线程安全,通过定义订单号生成器并利用线程模拟出库和入库操作,每个线程从订单号生成器中获取唯一订单号,感兴趣的朋友一起看看吧
    2024-09-09
  • public static void main(String[] args)使用解读

    public static void main(String[] args)使用解读

    这篇文章主要介绍了public static void main(String[] args)的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • java增强for循环的实现方法

    java增强for循环的实现方法

    下面小编就为大家带来一篇java增强for循环的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • MyBatis-Plus如何使用枚举自动关联注入详解

    MyBatis-Plus如何使用枚举自动关联注入详解

    这篇文章主要给大家介绍了关于MyBatis-Plus如何使用枚举自动关联注入的相关资料,文中通过实例代码介绍的非常详细,对大家学习或者使用MyBatis-Plus具有一定的参考学习价值,需要的朋友可以参考下
    2022-03-03
  • java8新特性教程之time包使用总结

    java8新特性教程之time包使用总结

    Java8新增了date和time的util包,下面这篇文章主要给大家介绍了关于java8新特性教程之time包使用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-01-01
  • java开发之Jdbc分页源码详解

    java开发之Jdbc分页源码详解

    这篇文章主要介绍了java开发之Jdb分页源码详解,需要的朋友可以参考下
    2020-02-02
  • 利用java实现二维码和背景图的合并

    利用java实现二维码和背景图的合并

    本文介绍如何使用java代码将自动生成的二维码放入背景模板中,对于java学习者或许有帮助,一起来看看。
    2016-07-07
  • 快速了解JAVA中的Random()函数

    快速了解JAVA中的Random()函数

    这篇文章主要介绍了JAVA中的Random()函数的使用方法,文中代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下
    2020-06-06
  • springboot整合freemarker代码自动生成器

    springboot整合freemarker代码自动生成器

    最近做了一个工具,可以实现代码自动生成,今天整理出来分享给大家,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05

最新评论