8. 数据校验
校验的意义
前端校验框架比较多 参考()
https://www.runoob.com/jquery/jquery-plugin-validate.html
8.1. Spring整合Hibernate-validation校验
引入
hibernate-validator
配置校验器
- LocalValidatorFactoryBean
- ReloadableResourceBundleMessageSource 加载的是 错误消息文件
- ValidationErrorMess.properties : 统一设置IDEA 编辑Properties文件的编码 UTF-8
- key=value
status.max.error=status不能超过1
- key=value
- ValidationErrorMess.properties : 统一设置IDEA 编辑Properties文件的编码 UTF-8
使用 validator="validation" 让校验器生效
使用
在校验的Bean(User)
- 在校验的属性
status
上面添加 校验规则 @NUll @NotNull @Min @Max.....- @Max(value=1 ,message="{status.max.error}")
- 在校验的属性
在Controller方法中接收 User对象的位置开启校验 添加@Validated注解
@Validated User user
接收错误消息 在校验对象的后面声明
BindingResult result
result变量中包含了,所有的错误消息
8.1.1. pom.xml导入校验jar文件
配合Spring 的版本 5.2.4.RELEASE
xml
<!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.2.5.Final</version>
</dependency>
8.1.2. 配置校验器
让spring容器管理校验器
xml
<!--声明校验器-->
<bean id="validation" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<!--注入校验器的实现规则-->
<property name="providerClass" value="org.hibernate.validator.HibernateValidator"></property>
<!--校验失败的错误消息 文件中读取-->
<property name="validationMessageSource" ref="validationMessageSource"/>
</bean>
<!-- 使用此类ReloadableResourceBundleMessageSource加载属性文件-->
<bean id="validationMessageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basenames">
<list>
<value>classpath:ValidationErrorMess</value>
</list>
</property>
<!--原始文件的编码-->
<property name="defaultEncoding" value="utf-8"/>
<!--读取文件的编码-->
<property name="fileEncodings" value="utf-8"/>
<!--设置最大缓存时间 2000毫秒之后重新加载配置文件-->
<!-- <property name="cacheMillis" value="2000"/> -->
<property name="cacheSeconds" value="2"/>
</bean>
8.1.3. 校验器注入到处理器适配器中
xml
<!--
validator 属性的作用 将声明的校验器Bean注入到 处理器适配器 HandlerApapter
-->
<mvc:annotation-driven validator="validation" />
8.1.4编写错误消息文件
properties
status.max.error=状态不能大于1
8.1.5 在User对象中添加校验规则
在需要校验的字段上添加校验规则注解,如@Size
控制器接受参数(需要校验的参数),例如接受用户User信息
- @Null 被注释的元素必须为 null
- @NotNull 被注释的元素必须不为 null
- @AssertTrue 被注释的元素必须为 true
- @AssertFalse 被注释的元素必须为 false
- @Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
- @Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
- @DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
- @DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
- @Size(max=, min=) 被注释的元素的大小必须在指定的范围内
- @Digits(integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
- @Past 被注释的元素必须是一个过去的日期
- @Future 被注释的元素必须是一个将来的日期
- @Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式
java
package com.neuedu.mvc.entity;
import javax.validation.constraints.Max;
import java.util.Date;
/**
* 用户的实体对象
*/
public class User {
private Integer userId;
private String userName;
private String gender;
private Date birthday;
@Max(value = 2,message = "{status.max.error}")
private Integer status;
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
@Override
public String toString() {
return "User{" +
"userId='" + userId + '\'' +
", userName='" + userName + '\'' +
", gender='" + gender + '\'' +
", birthday=" + birthday +
", status=" + status +
'}';
}
}
8.1.5 控制器的方法
在Controller方法中需要校验的Bean之前添加 @ Validated
,在校验的Bean之后 声明 BindingResult result
变量接收字段验证失败的消息
java
@RequestMapping(value = "update")
public String update(@Validated User user ,BindingResult result ) throws ParseException {
List<FieldError> fieldErrors = result.getFieldErrors();
for (FieldError fieldError : fieldErrors) {
String field = fieldError.getField();
String defaultMessage = fieldError.getDefaultMessage();
System.out.println("field = " + field); // status
System.out.println("defaultMessage = " + field); //状态不能大于1
}
//调用service保存
boolean success = userService.updateById(user);
String path = "";
if(success) {
path = "redirect:/user/list";
}else{
path = "/user/user_edit";
}
return path;
}
8.1.6. 捕获错误信息
java
List<FieldError> fieldErrors = result.getFieldErrors();
for (FieldError fieldError : fieldErrors) {
String field = fieldError.getField();
String defaultMessage = fieldError.getDefaultMessage();
System.out.println("field = " + field); // status
System.out.println("defaultMessage = " + field); //状态不能大于1
}
8.1.7. 显示错误信息
java
