hibernate-validator+SpringMVChtml
简介:简单说,就是对Entity进行校验。java
一、导包,没有很严谨的对应关系,因此我用了比较新的版本,支持更多的注解。git
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.5.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator-cdi</artifactId>
<version>6.0.5.Final</version>
</dependency>web
二、Spring配置文件中:正则表达式
<!-- swagger2 -->
<!--http://localhost:8080/zztabc/swagger-ui.html#/-->
<!--<mvc:default-servlet-handler />
<mvc:resources
mapping="/webjars/**"
location="classpath:/META-INF/resources/webjars/" />-->
<mvc:annotation-driven validator="validator"/>
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
<property name="validationMessageSource" ref="messageSource"/>
</bean>
<!-- 校验错误信息配置文件 -->
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<!-- 资源文件名 -->
<!--<property name="basename" value="classpath:validationMessages"/>-->
<!-- 对资源文件内容缓存时间,单位秒 -->
<property name="fileEncodings" value="GBK"/>
<property name="defaultEncoding" value="GBK"/>
<property name="cacheSeconds" value="120"/>
</bean>算法
三、entity:spring
package com.zztabc.controller.vali;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotEmpty;
import javax.validation.constraints.*;
import java.io.Serializable;
import java.util.List;
/**
* 员工表
* @author ZX
*
*/
public class Emp implements Serializable{
private static final long serialVersionUID = 1L;
@NotBlank(message="名字不能为空或者空串")
@Length(min=2,max=10,message="名字必须由2~10个字组成")
private String name;
@NotNull
@Min(value = 18,message = "年龄应该小于18")
private Integer age;
@NotNull
@Max(value = 50,message = "年龄不能大于50")
private Integer ageMax;
@NotBlank
@Pattern( regexp = "/^[a-z0-9_-]{3,16}$/",message = "用户名为3-16位整数+英文")
private String loginName;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Integer getAgeMax() {
return ageMax;
}
public void setAgeMax(Integer ageMax) {
this.ageMax = ageMax;
}
public String getLoginName() {
return loginName;
}
public void setLoginName(String loginName) {
this.loginName = loginName;
}
@Override
public String toString() {
return "Emp{" +
"name='" + name + '\'' +
'}';
}
}
四、controller:缓存
/**
@Valid Emp e 被验证的Bean前添加@Valid
BindingResult br 每一个被验证对象后面都跟一个BindingResult对象,里面持有错误返回信息。
*/
@RequestMapping("/hi2")
public ModelAndView sayHello2(@Valid Emp e ,BindingResult br){
ModelAndView mov = new ModelAndView("hello");
if(br.hasErrors()) {
System.out.println("校验出错");
/* FieldError fieldError= br.getFieldError();
System.out.println(fieldError.getDefaultMessage());*/
/* List<ObjectError> ls=br.getAllErrors();
for (int i = 0; i < ls.size(); i++) {
System.out.println("error:"+ls.get(i).getDefaultMessage());
}*/
List<FieldError> list = br.getFieldErrors();
for (FieldError fieldError2 : list) {
System.out.println("属性名"+fieldError2.getField()+">>>"+fieldError2.getDefaultMessage());
//jsp展现用
mov.addObject(fieldError2.getField()+"Tip",fieldError2.getDefaultMessage());
}
}
return mov;
}mvc
五、jsp返回值:app
通常框架提供了标签进行直接显示统一返回数据,可是不够灵活,因此我没有看那种方式,我在controller中获取到属性以及报错信息set进了ModelAndView对象,直接使用${属性名Tip}进行取值便可。
六、注解详解(摘抄,未找到原创博主,具体也能够看官网):
@Valid 被注释的元素是一个对象,须要检查此对象的全部字段值@Null 被注释的元素必须为 null@NotNull 被注释的元素必须不为 null@AssertTrue 被注释的元素必须为 true@AssertFalse 被注释的元素必须为 false@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值@Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值@DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值@DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值@Size(max, min) 被注释的元素的大小必须在指定的范围内@Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内@Past 被注释的元素必须是一个过去的日期@Future 被注释的元素必须是一个未来的日期@Pattern(value) 被注释的元素必须符合指定的正则表达式 2. Hibernate Validator 附加的 constraint注解 做用@Email 被注释的元素必须是电子邮箱地址@Length(min=, max=) 被注释的字符串的大小必须在指定的范围内@NotEmpty 被注释的字符串的必须非空@Range(min=, max=) 被注释的元素必须在合适的范围内@NotBlank 被注释的字符串的必须非空@URL(protocol=,host=, port=, regexp=, flags=) 被注释的字符串必须是一个有效的url@CreditCardNumber 被注释的字符串必须经过Luhn校验算法,银行卡,信用卡等号码通常都用Luhn计算合法性@ScriptAssert(lang=, script=, alias=) 要有Java Scripting API 即JSR 223 ("Scripting for the JavaTM Platform")的实现@SafeHtml(whitelistType=, additionalTags=) classpath中要有jsoup包 hibernate补充的注解中,最后3个不经常使用,可忽略。主要区分下@NotNull @NotEmpty @NotBlank 3个注解的区别:@NotNull 任何对象的value不能为null@NotEmpty 集合对象的元素不为0,即集合不为空,也能够用于字符串不为null@NotBlank 只能用于字符串不为null,而且字符串trim()之后length要大于0