SpringMVC 数据校验
应用程序在执行业务逻辑前,必须通过数据校验保证接收的输入数据时正确合法的.
在一般情况下,应用程序的开发是分层的,不同层的代码由不同开发人员负责。
很多时候,同样的数据校验会出现在不同层中,这样会导致代码冗余,为了避免这样的情况,最好是将验证逻辑和相应的域模型进行绑定,将代码校验的逻辑集中起来管理
自定义数据校验注解
package com.tobie.validator;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
/**
* @author Tobieance
* @description 自定义校验注解
* @date 2023-09-14 11:02
*/
@Target({ElementType.FIELD,ElementType.METHOD,ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = {PhoneNoValidator.class})
public @interface PhoneNo {
//错误提示信息
String message() default "手机号码格式错误";
//分组
Class<?>[] groups() default {};
//负载
Class<? extends Payload>[] payload() default {};
//指定多个时使用
@Target({ElementType.FIELD,ElementType.METHOD,ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = {PhoneNoValidator.class})
@interface list{
PhoneNo[] value();
}
}
校验Controller
package com.tobie.validator;
import lombok.val;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.validation.Valid;
/**
* @author Tobieance
* @description 数据校验控制器
* @date 2023-09-14 10:12
*/
@Controller
public class ValidatorController {
/**
* <h2>@Valid 用于启动校验</h2>
* BindingResult:封装校验结果
* @param depositDto 存款Dto
* @return {@link String}
*/
@RequestMapping("validator")
public String validate(@Valid @ModelAttribute("msg") DepositDto depositDto, BindingResult bindingResult){
//判断校验结果
if(bindingResult.hasErrors()){
//打印校验错误数量
System.out.println("校验错误数量:"+bindingResult.getErrorCount());
val fieldErrors=bindingResult.getFieldErrors();
//打印校验错误信息
System.out.println("校验错误信息:");
for (val fieldError:fieldErrors) {
System.out.println(fieldError);
}
}
System.out.println(depositDto);
return "result";
}
}
校验前端页面
<%--
Created by IntelliJ IDEA.
User: 87036
Date: 2023-09-13
Time: 16:25
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>SpringMVC 数据校验</title>
</head>
<body>
<fieldset>
<legend><h1>请输入存款信息</h1></legend>
<form action="validator" method="post">
账号:<input type="text" name="account"/><br/>
用户名:<input type="text" name="username"/><br/>
密码:<input type="text" name="password"/><br/>
身份证号:<input type="text" name="id"/><br/>
金额:<input type="text" name="amount"/><br/>
年限:<input type="text" name="duration"/><br/>
日期:<input type="text" name="date"/><br/>
电话:<input type="text" name="phone"/><br/>
<input type="submit" value="提交">
</form>
</fieldset>
</body>
</html>