1.SpringMVC进行简单的数据校验
1.导包,版本一定要这样写
<!--数据校验-->
<!-- hibernate-validator -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.1.0.Final</version>
</dependency>
<!-- validation -->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>
2.配置包扫描
<!--配置验证器-->
<bean id="myvalidator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
<property name="providerClass" value="org.hibernate.validator.HibernateValidator"/>
</bean>
<!--绑定验证器-->
<mvc:annotation-driven validator="myvalidator"/>
3.添加实体类:
package com.wx.domain;
import org.hibernate.validator.constraints.NotEmpty;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
public class UserInfo {
/**
* Min:设置最小值
* Max:设置最大值
* Message:打印信息
*/
//指定年龄在18-120之间
@Min(value = 18,message = "年龄不能小于18岁")
@Max(value = 120,message = "年龄不能大于100岁")
private Integer age;
/**
* 三种验证方式
* @NotEmpty 用于集合
* @NotNull 用于基本类型
* @NotBlank 用于引用类型
* @Size 设置大小
*/
//非空验证
@NotEmpty(message = "用户名不能为空")
@Size(max = 20,min = 6,message = "用户名不能大于20个字符或小于6个字符")
private String name;
/**
* @Pattern rehexp匹配正则
*/
@NotEmpty(message = "邮箱不能为空")
@Pattern(regexp = "^\\w+@\\w+/.\\w+$",message = "邮箱格式错误")
private String email;
@Pattern(regexp = "^1[35789]\\d{9}$",message = "手机号格式错误")
private String phone;
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
4.我们的处理器类中进行相应的判断处理
package com.wx.controller;
import com.wx.domain.UserInfo;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.jws.WebParam;
import javax.validation.Valid;
/**
* 完成SpringMVC的数据校验
* 1.导包
* 2.配置包扫描
* 3.xml配置
* 4.添加实体类
* 5.测试
*/
@Controller
public class ValidDataController {
@RequestMapping("/validdata")
public String validdata(@Valid UserInfo userInfo, BindingResult br, Model mv) {
int errorCount = br.getErrorCount();
if (errorCount > 0) {
//证明至少有一个参数错误
//获取信息
FieldError name = br.getFieldError("name");
FieldError age = br.getFieldError("age");
FieldError phone = br.getFieldError("phone");
FieldError email = br.getFieldError("email");
//获取错误信息
if (name != null) {
String namemsg = name.getDefaultMessage();
//把错误信息返回到页面
mv.addAttribute("namemsg", namemsg);
}
if (age != null) {
String agemsg = age.getDefaultMessage();
mv.addAttribute("agemsg", agemsg);
}
if (phone != null) {
String phonemsg = phone.getDefaultMessage();
mv.addAttribute("phonemsg", phonemsg);
}
if (email != null) {
String emailmsg = email.getDefaultMessage();
mv.addAttribute("emailmsg", emailmsg);
}
}
return "validdata";
}
}
5.测试:
2.分组校验
如果同一个类,在不同的使用场景下有不同的校验规则,那么可以使用分组校验。未成年人是不能喝酒的,而在其他场景下我们不做特殊的限制,这个需求如何体现同一个实体,不同的校验规则呢?
为年龄指定一个分组,有这个分组的请求才对年龄校验
指定分组请求重新写一个方法:
测试:
可以发先其他的验证没了,该分组下只验证这个年龄了。
3.自定义校验
自定义校验注解:
package com.wx.annotation;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
/**
*
*/
@Documented
@Target({ANNOTATION_TYPE, METHOD, CONSTRUCTOR, FIELD})
@Retention(RUNTIME)
@Constraint(validatedBy = IsMobileValidator.class)
public @interface CannotHaveBlank {
//是否必须
boolean required() default false;
String message() default "字符串不能含空格";
//分组
Class<?>[] groups() default {};
//负载
Class<? extends Payload>[] payload() default {};
}
自定义校验类:
package com.wx.annotation;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.lang.annotation.Annotation;
/***
* 真正的验证类
*/
public class IsMobileValidator implements ConstraintValidator<CannotHaveBlank, String> {
@Override
public void initialize(CannotHaveBlank cannotHaveBlank) {
}
@Override
public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
//null时不进行校验
if (s != null && s.contains(" ")) {
//获取默认提示信息
String defaultConstraintMessageTemplate = constraintValidatorContext.getDefaultConstraintMessageTemplate();
System.out.println("default message :" + defaultConstraintMessageTemplate);
//禁用默认提示信息
//constraintValidatorContext.disableDefaultConstraintViolation();
//设置提示语
//constraintValidatorContext.buildConstraintViolationWithTemplate("can not contains blank").addConstraintViolation();
return false;
}
return true;
}
}
使用:
测试: