Spring MVC 数据校验

数据校验是每个项⽬中必不可少的模块,Spring MVC 提供了两种数据校验的组件:

1.基于 Validator 接⼝进⾏校验

2.使⽤ Annotation JSR-303 标准校验

使⽤基于 Validator 接⼝进⾏校验会复杂⼀些,具体的数据校验的规则需要开发者⼿动设置。⽽使⽤ Annotation JSR-303 标准会相对简单⼀些,开发者不需要编写校验规则,直接通过注解的形式给每⼀条 数据添加验证规则,具体操作是直接在实体类的属性上添加对应的校验注解即可。

一、基于 Validator 接⼝

1.1 创建实体类

java 复制代码
package com.southwind.entity;

import lombok.Data;

@Data
public class Student {
    private String name;
    private String password;
}

1.2 ⾃定义数据校验器 StudentValidation,实现 Validator 接⼝,重写接⼝的抽象⽅法,加⼊校验规则。

java 复制代码
package com.southwind.validation;

import com.southwind.entity.Student;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;

public class StudentValidation implements Validator {
    @Override
    public boolean supports(Class<?> aClass) {
        return Student.class.equals(aClass);
    }

    @Override
    public void validate(Object o, Errors errors) {
        ValidationUtils.rejectIfEmpty(errors, "name", null, "姓名不能为空");
        ValidationUtils.rejectIfEmpty(errors, "password", null, "密码不能为空");
    }
}

1.3 控制层业务⽅法

java 复制代码
package com.southwind.controller;

import com.southwind.entity.Student;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/validate")
public class ValidateHandler {
    /**
     * 给JSP表单绑定模型对象
     * @param model
     * @return
     */
    @GetMapping("/login")
    public String login(Model model) {
        model.addAttribute(new Student());
        return "login";
    }

    /**
     * 数据校验
     * @param student
     * @param bindingResult
     * @return
     */
    @PostMapping("/login")
    public String login(@Validated Student student, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            return "login";
        }
        return "success";
    }
}

1.4 springmvc.xml 配置 validator

XML 复制代码
<mvc:annotation-driven validator="studentValidator">
    <!-- 启用基于注解的 MVC 功能,并指定验证器 -->
</mvc:annotation-driven>
<bean id="studentValidator" class="com.southwind.validation.StudentValidation">
    <!-- 定义一个名为 studentValidator 的验证器 Bean -->
</bean>

1.5 JSP

javascript 复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<html>
    <head>
        <title>Title</title>
    </head>
    <body>
        <h1>学⽣登陆</h1>
        <form:form modelAttribute="student" action="/validate/login" method="post">
            学⽣姓名: <form:input path="name" /> <form:errors path="name" /><br/>
            学⽣密码: <form:input path="password" /> <form:errors path="password" /><br/>
            <input type="submit" value="提交"/>
        </form:form>
    </body>
</html>

二、Annotation JSR-303 标准

Hibernater Validator,通过注解完成校验规则的绑定。

@Null 只能为 null

@NotNull 不能为 null

@Size 设置数据⻓度

@NotEmpty 不能为空

String str = null;

String str = "";

2.1 pom.xml

XML 复制代码
<!-- JSR-303 -->
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>5.3.6.Final</version>
</dependency>
<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>2.0.1.Final</version>
</dependency>
<dependency>
    <groupId>org.jboss.logging</groupId>
    <artifactId>jboss-logging</artifactId>
    <version>3.4.1.Final</version>
</dependency>
<!-- JDK9以上 -->
<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>
<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-impl</artifactId>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-core</artifactId>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>activation</artifactId>
    <version>1.1.1</version>
</dependency>

2.2 创建实体类,通过注解的⽅式给属性指定校验规则。

java 复制代码
package com.southwind.entity;

import lombok.Data;
import org.hibernate.validator.constraints.Email;
import org.hibernate.validator.constraints.NotEmpty;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;

@Data
public class Account {
    @NotEmpty(message = "⽤户名不能为空")
    private String username;

    @Size(min = 6, max = 20, message = "密码⻓度为6 - 20位")
    private String password;

    @Email(regexp = "^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\\\\.[a-zA-Z0-9-]+)*\\\\.[a-zA-Z0-9]{2,6}$", message = "请输⼊正确的邮箱")
    private String email;

    @Pattern(regexp = "^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0,5-9]))\\\\d{8}$", message = "请输⼊正确的电话格式")
    private String phone;
}

2.3 业务⽅法

java 复制代码
@GetMapping("/register")
public String register(Model model) {
    model.addAttribute(new Account());
    return "register";
}

@PostMapping("/register")
public String register(@Valid Account account, BindingResult bindingResult) {
    if (bindingResult.hasErrors()) {
        return "register";
    }
    return "success";
}

2.4 springmvc.xml

XML 复制代码
<mvc:annotation-driven></mvc:annotation-driven>

2.5 register.jsp

javascript 复制代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<html>
    <head>
        <title>Title</title>
    </head>
    <body>
        <h1>⽤户注册</h1>
        <form:form modelAttribute="account" action="/validate/register" method="post">
            ⽤户名:<form:input path="username"></form:input><form:errors path="username"></form:errors><br/>
            密码:<form:input path="password"></form:input><form:errors path="password"></form:errors><br/>
            邮箱:<form:input path="email"></form:input><form:errors path="email"></form:errors><br/>
            电话:<form:input path="phone"></form:input><form:errors path="phone"></form:errors><br/>
            <input type="submit" value="提交"/>
        </form:form>
    </body>
</html>
相关推荐
tg-zm8899962 小时前
2025返利商城源码/挂机自动收益可二开多语言/自定义返利比例/三级分销理财商城
java·mysql·php·laravel·1024程序员节
X***C8622 小时前
SpringBoot:几种常用的接口日期格式化方法
java·spring boot·后端
前端达人2 小时前
你的App消息推送为什么石沉大海?看Service Worker源码我终于懂了
java·开发语言
小光学长3 小时前
基于ssm的宠物交易系统的设计与实现850mb48h(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
java·前端·数据库
编程大师哥3 小时前
vxe-table 透视表分组汇总及排序基础配置
java
8***84823 小时前
spring security 超详细使用教程(接入springboot、前后端分离)
java·spring boot·spring
9***J6283 小时前
Spring Boot项目集成Redisson 原始依赖与 Spring Boot Starter 的流程
java·spring boot·后端
M***Z2103 小时前
SQL 建表语句详解
java·数据库·sql
v***7943 小时前
Spring Boot 热部署
java·spring boot·后端
执笔论英雄3 小时前
【RL】python协程
java·网络·人工智能·python·设计模式