Spring MVC 数据校验
Spring MVC 提供了两种数据校验方式:
- 基于 Validator 接口;
- 使用 Annotation JSR - 303 标准进行校验;
基于 Validator 接口的方式需要自定义 Validator 验证器,每一条数据的验证规则都需要开发者手动完成,而使用Annotation JSR - 303 标准,则不需要自定义验证器,通过注解的方式可以直接在实体类中添加每个属性的验证规则,这种方式更加方便,实际开发中更加推荐使用。
1. 基于 Validator 接口的方式
1、创建实体类 User;
package com.trainingl.entity;
import lombok.Data;
@Data
public class User {
private String username;
private String password;
}
2、自定义验证器 UserValidator,并实现 Validator 接口;
package com.trainingl.validation;
import com.trainingl.entity.User;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;
public class UserValidator implements Validator {
public boolean supports(Class<?> aClass) {
return User.class.equals(aClass);
}
public void validate(Object o, Errors errors) {
ValidationUtils.rejectIfEmpty(errors,"username",null,"用户名不能为空!");
ValidationUtils.rejectIfEmpty(errors,"password",null,"密码不能为空!");
}
}
3、在 springmvc.xml 配置验证器的 bean;
<bean id="userValidator" class="com.trainingl.validation.UserValidator"></bean>
<!-- 基于Validator的配置 -->
<mvc:annotation-driven validator="userValidator"></mvc:annotation-driven>
4、编写业务方法;
package com.trainingl.controller;
import com.trainingl.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/validate")
public class validatorHandler {
@GetMapping("/login")
public String login(Model model){
model.addAttribute("user",new User());
return "login";
}
@PostMapping("/login")
public String login(@Validated User user, BindingResult bindingResult){
if(bindingResult.hasErrors()){
return "login";
}
return "index";
}
}
5、JSP 视图页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ page isELIgnored="false" %>
<html>
<head>
<title>用户登录</title>
</head>
<body>
<form:form modelAttribute="user" action="/validate/login" method="post">
用户名:<form:input path="username"/><form:errors path="username"></form:errors> <br>
密 码:<form:input path="password"/><form:errors path="password"></form:errors> <br>
<input type="submit" value="登录">
</form:form>
</body>
</html>
启动 Tomcat 服务器,运行程序的结果如下:
2. Annotation JSR - 303 标准
使用 Annotation JSR - 303 标准进行验证,需要导入支持这种标准的依赖 jar 包,这里我们使用 Hibernate Validator。
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.3.6.Final</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>jboss-logging</artifactId>
<version>3.4.1.Final</version>
</dependency>
通过注解的方式直接在实体类中添加相关的验证规则
package com.trainingl.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.NotEmpty;
import javax.validation.constraints.Email;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Account {
@NotEmpty(message = "用户名不能为空!")
private String name;
@Size(min = 6,max = 12,message = "密码长度为6 ~ 12位.")
private String password;
@Pattern(regexp = "^[a-z0-9A-Z]+[- | a-z0-9A-Z . _]+@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-z]{2,}$",message = "邮箱格式不合法!")
private String email;
@Pattern(regexp = "^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\\d{8}$",message = "电话号码不正确!")
private String phone;
}
编写业务方法 ValidaorHandler
package com.trainingl.controller;
import com.trainingl.entity.Account;
import com.trainingl.entity.User;
import org.apache.taglibs.standard.extra.spath.Step;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
@Controller
@RequestMapping("/validate")
public class validatorHandler {
@GetMapping("/register")
public String register(Model model){
model.addAttribute("account", new Account());
return "register";
}
@PostMapping("/register")
public String register(@Valid Account account, BindingResult bindingResult){
if(bindingResult.hasErrors()){
return "register";
}
return "index";
}
}
在 springmvc.xml 中配置注解驱动
<mvc:annotation-driven></mvc:annotation-driven>
JSP 视图页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ page isELIgnored="false" %>
<html>
<head>
<title>用户注册</title>
</head>
<body>
<form:form modelAttribute="account" action="/validate/register" method="post">
用户名:<form:input path="name"/><form:errors path="name"/><br/>
密 码:<form:input path="password"/><form:errors path="password"/><br/>
邮 箱:<form:input path="email"/><form:errors path="email"/><br/>
电 话:<form:input path="phone"/><form:errors path="phone"/><br/>
<input type="submit" value="提交">
</form:form>
</body>
</html>
常用校验规则详解:
校验注解 | 可校验的数据类型 | 具体描述 |
---|---|---|
@Null | 基本数据类型除外 | 被注解的属性必须为null |
@NotNull | 基本数据类型除外 | 被注解的属性不能为null |
@NotEmpty | 集合、数组、字符串 | 被注解的属性的值必须非空 |
@NotBlank | 字符串 | 被注解的属性不能为空且不能是空字符串 |
@Size | 字符串、数组、集合 | 被注解的属性长度必须在指定的范围内 |
@Length | 字符串 | 被注解的属性长度必须在指定的范围内 |
@Min | 数字、字符串格式的数字 | 属性值必须大于指定的最小值 |
@Max | 数字、字符串格式的数字 | 属性值必须小于指定的最大值 |
字符串 | 被注解的属性必须是合法邮箱格式 | |
Pattern | 字符串 | 被注解的元素必须符合对应的正则表达式 |
每个注解都有 message 属性,该属性用于填写校验失败时的异常描述信息,当校验失败时可以获取对应的message 属性值。