JSR 380
其实就是Bean Validation 2.0,这个就是Bean验证的规范,这里的Bean就是实例化后的POJO类,依赖库如下:
<dependency>
<groupId>jakarta.validation</groupId>
<artifactId>jakarta.validation-api</artifactId>
<version>2.0.1</version>
</dependency>
Validation注解
这些注解可以直接设置在Bean属性上
- @NotNull
不允许为null对象
- @AssertTrue
是否为true
- @Size
约定字符串的长度
- @Max
- @Min
字符串最大最小的长度
是否是邮箱格式
- @NotEmpty
不允许为null或者为空,可以用于判断字符串,集合
- @NotBlank
不允许为null和空格
package com.bookstore.model;
import javax.validation.constraints.*;
public class User {
@NotEmpty(message = "名称不能为 null")
private String name;
@Min(value = 18, message = "你的年龄必须大于等于18岁")
@Max(value = 150, message = "你的年龄必须小于等于150岁")
private int age;
@NotEmpty(message = "邮箱必须输入")
@Email(message = "邮箱不正确")
private String email;
// standard setters and getters
}
执行校检
package com.bookstore.control;
import com.bookstore.model.User;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import javax.validation.Valid;
@Controller
public class UserControl {
@GetMapping("/user/add.html")
public String addUser() {
return "user/addUser";
}
@PostMapping("/user/save")
public String saveUser(@Valid User user, BindingResult errors) {
if (errors.hasErrors()) {
// 如果校验不通过,返回用户编辑页面
return "user/addUser";
}
// 校验通过,返回成功页面
return "user/addUserSuccess";
}
}
第一个参数user那添加了参数注解@Valid,然后第二个参数errors类型为BindingResult(hasErrors方法可以检验是否成功)
- th:object
为了使表单验证状态生效,需要在标签里增加一个th:object="${对象}"
属性,这样就不用对象.xxx,可以直接操作xxx - th:classappend
这个语法支持动态的管理样式:
<div th:classappend="${#fields.hasErrors('name')} ? 'error' : ''">
</div>
如果条件成立则上面代码会生成:
<div class="error">
</div>
${#fields.hasErrors('key')}
这个语法是专门为验证场景提供的,key就是属性的名称
- th:errors
如果要显示错误信息,可以使用th:errors="*{变量}"
,这个会主动取出错误
<p th:if="${#fields.hasErrors('age')}" th:errors="*{age}"></p>
- th:filed
可以显示上一次输入的内容:
<div th:classappend="${#fields.hasErrors('age')} ? 'error' : ''">
<label>年龄:</label>
<input type="text" th:field="*{age}" />
<p th:if="${#fields.hasErrors('age')}" th:errors="*{age}"></p>
</div>
Thymeleaf 布局
一般使用th:include + th:replace
方案来完成局部的开发
- th:include="::content"
::content指的是选择器,这个选择器指的是就是加载当前页面的th:fragment
的值.当前页面渲染的时候,布局会合并content这个fragment内容一起渲染. - th:replace=“layout”
指定了布局的名称,声明后页面会被替换成layout的内容,这个layout指的是templates/layout.html
- th:fragment=“content”
<div th:fragment="content">
</div>
fragment是片段的意思,当页面渲染时候,可以通过选择器指定使用这个片段,在上面的th:include="::content"
指的就是这个值.