来源:https://www.bilibili.com/video/BV1GE411d7KE?p=12
上一节:https://blog.csdn.net/qq_40893824/article/details/107298855
1、基于 Validator 接口 进行校验
2、使用 Annotation JSR - 303 标准 进行校验
Validator:每条数据验证规则要开发者手动完成
Annotation JSR - 303:不需自定义验证器,注解对应添加每个属性的验证规则,更方便
Validator
1 entity 中,新建实体类 Account,加入代码:
package com.southwind.entity;
import lombok.Data;
@Data
public class Account {
private String name;
private String password;
}
![](https://i-blog.csdnimg.cn/blog_migrate/5189787c152d4226172e560e8a511e70.png)
2 southwind 中,创包 validator,其内,新建 类 AccountValidator(验证器),实现 Validator 接口,加入代码:
@Validated 自动启动验证器
package com.southwind.validator;
import com.southwind.entity.Account;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;
public class AccountValidator implements Validator {
// 验证类型是否一致
@Override
public boolean supports(Class<?> clazz) {
return Account.class.equals(clazz);
}
//验证
@Override
public void validate(Object target, Errors errors) {
ValidationUtils.rejectIfEmpty(errors,"name",null,"姓名不能为空");
ValidationUtils.rejectIfEmpty(errors,"password",null,"密码不能为空");
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6b186936151a6dc3a29e6d542029c94f.png)
3 controller 中,新建 类 ValidatorHandler,加入代码:
package com.southwind.controller;
import com.southwind.entity.Account;
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("/validator")
public class ValidatorHandler {
@GetMapping("/login")
public String login(Model model){
model.addAttribute("account", new Account());
return "login";
}
@PostMapping("/login")
public String login(@Validated Account account, BindingResult bindingResult){
if(bindingResult.hasErrors()){
return "login";
}
return "index";
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/c60a191e636e5811ae32c7652fa8c6b2.png)
4 webapp 中,新建 login.jsp,加入代码:
form 容易写错成 from!
<%@ page isELIgnored="false" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<form:form modelAttribute="account" action="/validator/login" method="post">
姓名:<form:input path="name"/><form:errors path="name"></form:errors><br/>
密码:<form:input path="password"/><form:errors path="password"></form:errors><br/>
<input type="submit" value="登录"/>
</form:form>
![](https://i-blog.csdnimg.cn/blog_migrate/c441289a125de3bd4873c83b3ebfa6fa.png)
5 resources/ springmvc.xml 中,添加代码:
<!-- Validator 的配置 -->
<bean id="accountValidator" class="com.southwind.validator.AccountValidator"></bean>
<mvc:annotation-driven validator="accountValidator"></mvc:annotation-driven>
![](https://i-blog.csdnimg.cn/blog_migrate/5eabd33a233fa1d11e51fdd81c08bdf3.png)
6 重启 tomcat,进入 http://localhost:8080/validator/login
(浏览器默认是 get 请求)
浏览器 默认是 get 请求
进去后 进入 login.jsp 页面
点击登录 此时是 login.jsp 页面中 post 请求
进入 ValidatorHandler 中 post 的 login,就会去数据验证,因为是空数据,所以显示 “ 不能为空 ”
Annotation JSR - 303
注解 | 解释 |
---|---|
@Null | 被注解的元素必须为null |
@NotNull | 被注解的元素不能为null |
@Min(value) | 被注解的元素必须是数字,其值必大于等于指定的最小值 |
@Max(value) | 被注解的元素必须是数字,其值必小于等于指定的最大值 |
@Email | 被注解的元素是电子邮箱地址 |
@Pattern | 被注解的元素必须符合对应的正则表达式 |
@Length | 被注解的元素的大小必须在指定的范围内 |
@NotEmpty | 被注解的字符串的值非空 |
Null 和 Empty 不同
String str = null,str 是 null
String str = “”,str 不是 null,其值为空
1 pom.xml 中,添加代码:
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.1.5.Final</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
![](https://i-blog.csdnimg.cn/blog_migrate/a0a52feeff7487c178b86263ab6440ff.png)
2 entity 中,新建 Person 实体类,加入代码:
package com.southwind.entity;
import lombok.Data;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
@Data
public class Person {
@NotEmpty(message = "用户名不能为空")
private String username;
@Size(min = 6, max = 12, message = "密码6-12位")
private String password;
@Email(regexp = "^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\\\\.[a-zA-Z0-9-]+)*\\\\.[a-zA-Z0-9]{2,6}$",message = "请输入正确的邮箱格式")
private String email;
@Pattern(regexp = "^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0,5-9]))\\\\\\\\d{8}$",message = "请输入正确的电话")
private String phone;
}
正则表达式,直接粘贴就好
3 ValidatorHandler 中,添加代码:
@GetMapping("/register2")
public String register(Model model){
model.addAttribute("person",new Person());
return "register2";
}
@PostMapping("/register2")
public String register(@Valid Person person, BindingResult bindingResult){
if(bindingResult.hasErrors()){
return "register2";
}
return "index";
}
![](https://i-blog.csdnimg.cn/blog_migrate/26f7ee319d82cac48cb7cea124b1a33b.png)
4 webapp 中,新建 register2.jsp,加入代码:
<%@ page isELIgnored="false" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<form:form modelAttribute="person" action="/validator/register2" method="post">
用户名:<form:input path="username"></form:input><form:errors path="username"/><br/>
密码:<form:input path="password"></form:input><form:errors path="password"/><br/>
邮箱:<form:input path="email"></form:input><form:errors path="email"/><br/>
电话:<form:input path="phone"></form:input><form:errors path="phone"/><br/>
<input type="submit" value="提交"/>
</form:form>
![](https://i-blog.csdnimg.cn/blog_migrate/8a9c31be84b5698a56d2363f3595100b.png)
5 resources/ springmvc.xml 中,检查是否有 <mvc:annotation-driven />
即:<mvc:annotation-driven></mvc:annotation-driven>
或:
重启 tomcat,进入 http://localhost:8080/validator/register2
上一节:https://blog.csdn.net/qq_40893824/article/details/107298855