实现一个完整的表单校验是 Web 应用中非常重要的组成部分。Spring 框架提供了校验的功能,它支持 JSR-303 规范和 Spring Validator 接口两种校验方式。本文将为大家介绍 Spring 校验的简单实现方式。
JSR-303 校验方式
下面将演示一个基于 JSR-303 规范实现的表单校验示例。
引入依赖
首先需要引入 Spring Web 和 Hibernate Validator 两个依赖:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.14.RELEASE</version>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.4.1.Final</version>
</dependency>
</dependencies>
创建实体类
接下来需要创建一个实体类,并在其中使用注解方式定义校验规则:
public class User {
@NotNull(message="用户名不能为空")
@Size(min=4, max=20, message="用户名长度必须在4到20个字符之间")
private String username;
@NotNull(message="密码不能为空")
@Size(min=6, max=20, message="密码长度必须在6到20个字符之间")
private String password;
// getter 和 setter 方法
}
创建校验器
创建一个校验器类,添加 @Component
注解,使用 @Autowired
注解引入 org.springframework.validation.Validator
接口,Spring 会自动将校验器注入到控制器中:
@Component
public class UserValidator implements Validator {
@Override
public boolean supports(Class<?> clazz) {
return User.class.equals(clazz);
}
@Override
public void validate(Object target, Errors errors) {
User user = (User)target;
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "username", null, "用户名不能为空");
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "password", null, "密码不能为空");
if (user.getUsername().length() < 4 || user.getUsername().length() > 20) {
errors.rejectValue("username", null, "用户名长度必须在4到20个字符之间");
}
if (user.getPassword().length() < 6 || user.getPassword().length() > 20) {
errors.rejectValue("password", null, "密码长度必须在6到20个字符之间");
}
}
}
编写控制器
在控制器中引入校验器,并在方法参数中添加注解 @Valid
和 Errors
,即可完成参数的校验:
@Controller
public class UserController {
@Autowired
private UserValidator userValidator;
@PostMapping("/login")
public String login(@Valid User user, Errors errors, Model model) {
if (errors.hasErrors()) {
return "login";
}
model.addAttribute("user", user);
return "success";
}
}
编写 HTML 模板
最后,在 HTML 模板中添加表单元素,并在要校验的元素中添加 th:errors
属性:
<form action="/login" method="post" th:object="${user}">
<input type="text" th:field="*{username}">
<span th:errors="*{username}"></span><br>
<input type="password" th:field="*{password}">
<span th:errors="*{password}"></span><br>
<button type="submit">登录</button>
</form>
至此,一个基于 JSR-303 规范实现的表单校验示例已经完成。
Spring Validator 校验方式
现在介绍第二种 Spring 校验方式,即实现 Spring Validator 接口的校验方式。
创建实体类
同样需要先创建一个实体类,不过这次不使用注解方式校验:
public class Address {
private String city;
private String district;
// getter 和 setter 方法
}
创建校验器
接下来创建一个校验器类,并实现org.springframework.validation.Validator
接口:
@Component
public class AddressValidator implements Validator {
@Override
public boolean supports(Class<?> clazz) {
return Address.class.equals(clazz);
}
@Override
public void validate(Object target, Errors errors) {
Address address = (Address)target;
if (address.getCity() == null || address.getCity().isEmpty()) {
errors.rejectValue("city", null, "城市不能为空");
}
if (address.getDistrict() == null || address.getDistrict().isEmpty()) {
errors.rejectValue("district", null, "区域不能为空");
}
}
}
编写控制器
在控制器中引入校验器,并在方法参数中添加注解 @Valid
和 Errors
,即可完成参数的校验:
@Controller
public class AddressController {
@Autowired
private AddressValidator addressValidator;
@PostMapping("/address")
public String saveAddress(@Valid Address address, Errors errors, Model model) {
addressValidator.validate(address, errors);
if (errors.hasErrors()) {
return "address";
}
model.addAttribute("address", address);
return "success";
}
}
编写 HTML 模板
最后,在 HTML 模板中添加表单元素,并在要校验的元素中添加 th:errors
属性:
<form action="/address" method="post" th:object="${address}">
<input type="text" th:field="*{city}">
<span th:errors="*{city}"></span><br>
<input type="text" th:field="*{district}">
<span th:errors="*{district}"></span><br>
<button type="submit">保存</button>
</form>
至此,一个基于 Spring Validator 接口实现的表单校验示例已经完成。需要注意的是,在使用 Spring Validator 的时候,需要先在控制器中手动调用 validate
方法进行校验。
总结:通过本文的介绍,可以看出 Spring 校验方式非常简单易用,分别使用 JSR-303 规范和 Spring Validator 接口两种校验方式即可实现表单校验。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring 校验(validator,JSR-303)简单实现方式 - Python技术站