SpringMVC--01(SpringMVC的数据校验)

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;
    }
}

使用:

测试:

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时空恋旅人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值