Java1.6版本提出JSR303规范,JSR303是Java为Bean数据合法性提供的标准。现在已经升级到JSR349以后了(www.jcp.org/en/home/ind… 。
Spring 不负责实现
Hibernate Validator: 实现了JSR349验证注解规范(实现了验证但是不属于Hibernate)
不同的验证给JavaBean上加上不同的注解
JSR303规范:
@Null 被注释的元素必须为null
@NotNull 被注释的元素必须不为null
@AssertTrue 被注释的元素必须为true //#assert 英[əˈsɜːt] 明确肯定的
@AssertFalse 被注释的元素必须为false
@Min(value) 被注释的元素必须是一个数字 其值必须大于等于指定的最小值
@Max(value) 被注释的元素必须是一个数字 其值必须小于等于指定的最小值
@DecimalMin(value)被注释的元素必须是一个数字 其值必须大于等于指定的最小值
@DecimalMax(value)被注释的元素必须是一个数字 其值必须小于等于指定的最小值
@Size(max,min) 被注释的元素的大小必须在指定的范围内
@Digits(integer,fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内 fraction 英[ˈfrækʃn] 分数 小数
@Past 被注释的元素必须是过去的一个日期
@Future 被注释的元素必须是将来的一个日期
@Pattern(value) 被注释的元素必须符合指定的正则表达式
Hibernate Validator 扩展注解:
@Email 被注释的元素必须是电子邮箱
@Length 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串的必须非空
@Range 被注释的元素必须在合适的范围内
数据验证的实现
1、pom xml 中加入hibernate-validator依赖。 ## Hibernate Validator Engine
2、将新增的jar包加入到WEB-INF/lib包中。
3、在需要验证的javaBean中对应属性上的加入验证注解。
public class User {
@NotNull
private Integer id;
private String username;
//@Future
@Past
@DateTimeFormat(pattern = "yyyy=mm=dd")
private Date birthday;
4、在需要使用的控制器中调用 验证的参数上加上@Valid
BindingResult bindingResult 能够获取到是否有错误信息 ModelMap modelMap 将错误信息交给页面
public String add(@Valid User user, BindingResult bindingResult, ModelMap modelMap){
// System.out.println(bindingResult.hasErrors());
// System.out.println(bindingResult.getAllErrors());
// System.out.println(bindingResult.getFieldErrors());
if(bindingResult.hasErrors()){
//存放错误信息
Map<String,String> errors = new HashMap<>();
List<FieldError> fieldErrors = bindingResult.getFieldErrors();
for(FieldError fieldError:fieldErrors){
errors.put(fieldError.getField(),fieldError.getDefaultMessage());
}
modelMap.addAttribute("errors",errors);
return "user/add";
}
System.out.println(user);
5、 页面调用错误信息
<form action="${pageContext.request.contextPath}/user" method="post">
<p>
id: <input type="text" name="id">${errors.id}
</p>
<p>
username: <input type="text" name="username">
</p>
<p>
birthday:<input type="text" name="birthday">${errors.birthday}
其他:
@NotNull
private Integer id;
@Length(min = 4,max = 9)
@Pattern(regexp = "[\u4e00-\u9fa5]+",message = "只能输入中文")
private String username;
//@Future
@Past
@NotNull
@DateTimeFormat(pattern = "yyyy=mm=dd")
private Date birthday;
@Digits(integer = 2,fraction=2)
@Max(50)
@NumberFormat(style = NumberFormat.Style.CURRENCY) //货币
private Double balance; //¥5000
@NumberFormat(style = NumberFormat.Style.NUMBER)
@Min(1)
@NotNull
private Double salary; //工资 10,000.00
@NumberFormat(style = NumberFormat.Style.PERCENT)
@Range(min=0,max = 1)