SpringMVC表单验证


一、JSR-303规范注解验证

1.验证表单类

public class Transaction {

    // 产品编号
    @NotNull
    private Long productId;

    // 用户编号
    @NotNull
    private Long userId;

    // 交易日期
    @Future
    @DateTimeFormat(pattern = "yyyy-MM-dd") // 日期格式化转换
    @NotNull
    private Date date;

    // 价格
    @NotNull
    @DecimalMin(value = "0.1") // 最小值0.1元
    private Double price;

    // 数量
    @Min(1)
    @Max(100)
    @NotNull
    private Integer quantity;

    // 交易金额
    @NotNull
    @DecimalMax("500000.00")
    @DecimalMin("1.00")
    private Double amount;

    // 邮件
    @Pattern(// 正则式
            regexp = "^([a-zA-Z0-9]*[-_]?[a-zA-Z0-9]+)*@"
                    + "([a-zA-Z0-9]*[-_]?[a-zA-Z0-9]+)+[\\.][A-Za-z]{2,3}([\\.][A-Za-z]{2})?$",
            // 自定义消息提示
            message = "不符合邮件格式")
    private String email;

    // 备注
    @Size(min = 0, max = 256) // 0到255个字符
    private String note;

    //  getter/setter。。。
}

2.用控制器验证表单 @Valid

@RequestMapping("/annotation")
public ModelAndView annotationValidate(@Valid Transaction trans, Errors errors){
    //是否存在错误
    if(errors.hasErrors()){
        //获取错误信息
        List<FieldError> errorList = errors.getFieldErrors();
        for (FieldError error : errorList) {
            System.err.println("fied :" + error.getField() + "\t" + "msg:" + error.getDefaultMessage());
        }
    }
    ModelAndView mv = new ModelAndView();
    mv.setViewName("index");
    return mv;
}
@RequestMapping("/annotation1")
public ModelAndView annotationValidate1(@Valid Transaction trans, BindingResult result){
    //是否存在错误
    if(result.hasErrors()){
        //获取错误信息
        List<ObjectError> errorList = result.getAllErrors();
        for (ObjectError error : errorList) {
            System.err.println("fied :" + error.getObjectName() + "\t" + "msg:" + error.getDefaultMessage());
        }
    }
    ModelAndView mv = new ModelAndView();
    mv.setViewName("index");
    return mv;
}

二、验证器方式

1.验证器

/**
 * 交易验证器
 */
public class TransactionValidator implements Validator{

    /**
     * 判断当前验证器是否用于检验Clazz类型的POJO
     * @param clazz  --POJO类型
     * @return true启动检验,false则不再检验
     */
    @Override
    public boolean supports(Class<?> clazz) {
        //判断验证是否为Transaction,如果是则进行判断[修改为:验证]
        return Transaction.class.equals(clazz);
    }

    /**
     * 检验POJO的合法性
     * @param target POJO请求对象
     * @param errors 错误信息
     */
    @Override
    public void validate(Object target, Errors errors) {
        Transaction trans = (Transaction) target;
        double dis = trans.getAmount() - (trans.getPrice() * trans.getQuantity());
        //如果差额大于0.01,则认为业务错误
        if (Math.abs(dis) > 0.01){
            errors.rejectValue("amount", null, "交易金额和购买数量与价格不匹配");
        }
    }
}

2.使用验证器验证  @InitBinder

/*
    将验证器和控制器捆绑在一起
 */
@InitBinder
public void initBinder(DataBinder binder){
    //数据绑定器键入验证器
    binder.setValidator(new TransactionValidator());
}

@RequestMapping("/annotation")
public ModelAndView annotationValidate(@Valid Transaction trans, Errors errors){
    //是否存在错误
    if(errors.hasErrors()){
        //获取错误信息
        List<FieldError> errorList = errors.getFieldErrors();
        for (FieldError error : errorList) {
            System.err.println("fied :" + error.getField() + "\t" + "msg:" + error.getDefaultMessage());
        }
    }
    ModelAndView mv = new ModelAndView();
    mv.setViewName("index");
    return mv;
}



注意:

  1.JSR 303注解方式和验证器方式不能同时使用。不过可以在使用JSR 303注解方式得到基本的检验信息后,再使用自己的方法进行验证。

  2.











推荐文章:https://www.cnblogs.com/softidea/p/5839327.html




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值