- 编写Controller
package com.synda.controller;
import javax.validation.Valid;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import com.synda.entity.Users;
@Controller
public class UsersController {
/**
* 此处在跳转访问时候会报错,解决的方法一:
* 在addUser方法中注入Users对象;(参数的变量名必须是对象的名称首字母小写)
* 二:传递的对象更改名称可以使用@ModelAttribute来实现,此时页面的获取该对象的key也需要修改
* @return
*/
@RequestMapping("/addUser")
public String showPage(@ModelAttribute("user") Users users) {
return "add";
}
/**
* 完成用户添加
*/
@RequestMapping("/save")
public String doSave*(@ModelAttribute("user")* @Valid Users users,BindingResult result) {
System.out.println(users);
//hasErrors()方法返回布尔值,如果返回true,则表示验证不通过,存在不合法的数据
if (result.hasErrors()) {
return "add";
}
return "scusses";
}
}
- 页面
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form th:action="@{/save}" method="post">
用户姓名:<input type="text" name="name"> <font color="red" th:errors="${user.name}"></font>
用户密码:<input type="password" name="password"> <font color="red" th:errors="${user.password}"></font>
用户年龄:<input type="text" name="age">
<input type="submit" value="ok">
</form>
</body>
</html>
- 实体类
package com.synda.entity;
import javax.validation.constraints.Email;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import org.hibernate.validator.constraints.Length;
public class Users {
//判断字符串是否为null(去掉首位空格)@NotEmpty(判断字符串是否为空,但不会去空格)
@NotBlank(message="用户名不能为空")
private String name;
@NotBlank(message="密码不能为空")
@Length(min=2,max=6,message="当前字符串最小为2位,最大为6位")//当前字符串最小为2位,最大为6位
private String password;
@Email(message="判断邮箱是否合法")
@Min(value=15,message="判断数值最小值,对应还有max")
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Users [name=" + name + ", password=" + password + ", age=" + age + "]";
}
}
-
需要注意的是此时的users参数名一定要对应可能会报错
-
常见的校验注解;
空检查
@Null 验证对象是否为null
@NotNull 验证对象是否不为null, 无法查检长度为0的字符串
@NotBlank 检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格.
@NotEmpty 检查约束元素是否为NULL或者是EMPTY.
Booelan检查
@AssertTrue 验证 Boolean 对象是否为 true
@AssertFalse 验证 Boolean 对象是否为 false
长度检查
@Size(min=, max=) 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内
@Length(min=, max=)
验证字符串的长度是否在给定的范围之内,包含两端
日期检查
@Past 验证 Date 和 Calendar 对象是否在当前时间之前
@Future 验证 Date 和 Calendar 对象是否在当前时间之后
@Pattern 验证 String 对象是否符合正则表达式的规则
数值检查:建议使用在Stirng,Integer类型,不建议使用在int类型上,因为表单值为“”时无法转换为int,但可以转换为Stirng为"",Integer为null
@Min 验证 Number 和 String 对象是否大等于指定的值
@Max 验证 Number 和 String 对象是否小等于指定的值
@DecimalMax 被标注的值必须不大于约束中指定的最大值. 这个约束的参数是一个通过BigDecimal定义的最大值的字符串表示.小数存在精度
@DecimalMin 被标注的值必须不小于约束中指定的最小值. 这个约束的参数是一个通过BigDecimal定义的最小值的字符串表示.小数存在精度
@Digits 验证 Number 和 String 的构成是否合法
@Digits(integer=,fraction=) 验证字符串是否是符合指定格式的数字,interger指定整数精度,fraction指定小数精度。
@Range(min=, max=) Checks whether the annotated value lies between (inclusive) the specified minimum and maximum.
@Range(min=10000,max=50000,message=“range.bean.wage”)
private BigDecimal wage;
@Valid递归的对关联对象进行校验, 如果关联对象是个集合或者数组,那么对其中的元素进行递归校验,如果是一个map,则对其中的值部分进行校验.(是否进行递归验证)
@CreditCardNumber信用卡验证
@Email 验证是否是邮件地址,如果为null,不进行验证,算通过验证。
@ScriptAssert(lang= ,script=, alias=)
@URL(protocol=,host=, port=,regexp=, flags=)
6. 新的补充
在使用校验时,实体类中添加了注解,一定要在controller中添加对应的@Valid 注解,并且,使用BindingResult 这个对象,它会将所有的验证错误信息放到这个类中,方便我们处理,如:
此时,我们单独写一个方法来处理错误信息
/**
* 获取验证的错误信息
* @param result
* @return
*/
private Map<String ,String> getErrors(BindingResult result){
Map<String ,String> errorMap = new HashMap<String ,String>();
//得到错误信息的list
List<FieldError> fieldErrors = result.getFieldErrors();
for (FieldError error : fieldErrors){
String errorFiled = error.getField();//发生错误验证的属性
String errorMessage = error.getDefaultMessage();//验证信息
errorMap.put(errorFiled,errorMessage);
}
return errorMap;
}