一、前言
我们在项目开发的过程中往往会有数据校验的要求,比如需要用户提交数据非空、不重复等等。
二、实现方式
首先在pom文件中加入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
在实体类要校验的属性上加上相关注解
public class Type {
//message属性可以被前端拿到
@NotBlank(message = "名称不能为空")
private String name;
}
空检查
@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=) string is between min and max included.
日期检查
@Past 验证 Date 和 Calendar 对象是否在当前时间之前
@Future 验证 Date 和 Calendar 对象是否在当前时间之后
@Pattern 验证 String 对象是否符合正则表达式的规则
在Controller中在要验证的参数前面加上@Valid
,可以再加一个BindingResult
类型的参数来接收校验之后的结果
@PostMapping("/types/{id}")
public String editPost(@Valid Type type, BindingResult result,@PathVariable Long id, RedirectAttributes attributes){
Type type1 = typeService.getTypeByName(type.getName());
if(type1 != null){
//自定义验证结果(验证属性的名字与实体类名字要相同,自定义结果类型,自定义提示)
result.rejectValue("name","nameError","不能添加重复分类");
}
if(result.hasErrors()) {
return "admin/types-input";
}
Type t = typeService.updateType(id,type);
if(t == null) {
attributes.addFlashAttribute("message","更新失败");
} else {
attributes.addFlashAttribute("message","更新成功");
}
return "redirect:/admin/types";
}
因为是最后是一个重定向的操作,无法携带 request
中的数据,为了传递 message
数据,加入了一个 RedirectAttributes
类型的参数。参数中的 addFlashAttributie(“param”, value)
方法与 addAttributie("prama",value)
方法不同点在于,后者相当于在重定向链接地址追加传递的参数,直接将传递的参数暴露在链接地址上,非常的不安全。前者是隐藏了参数,链接地址上不直接暴露,但是能且只能在重定向的 “页面” 获取prama
参数值。其原理就是放到session
中,session
在跳到页面后马上移除对象。如果是重定向一个controller中是获取不到该prama属性值的。除非在controller中用(@RequestPrama(value = “prama”)String prama)注解,采用传参的方式。
三、最后是前端校验结果的代码
<div th:if="${#fields.hasErrors('name')}">
<h1>验证失败</h1>
<p th:errors="*{name}">提交信息不符合规则</p>
</div>