程序员社区

24. Spring MVC 数据校验

Spring MVC 数据校验

Spring MVC 提供了两种数据校验方式:

  1. 基于 Validator 接口;
  2. 使用 Annotation JSR - 303 标准进行校验;

基于 Validator 接口的方式需要自定义 Validator 验证器,每一条数据的验证规则都需要开发者手动完成,而使用Annotation JSR - 303 标准,则不需要自定义验证器,通过注解的方式可以直接在实体类中添加每个属性的验证规则,这种方式更加方便,实际开发中更加推荐使用。

1. 基于 Validator 接口的方式

1、创建实体类 User;

package com.trainingl.entity;

import lombok.Data;

@Data
public class User {
    private String username;
    private String password;
}

2、自定义验证器 UserValidator,并实现 Validator 接口;

package com.trainingl.validation;

import com.trainingl.entity.User;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;

public class UserValidator implements Validator {
    public boolean supports(Class<?> aClass) {
        return User.class.equals(aClass);
    }

    public void validate(Object o, Errors errors) {
        ValidationUtils.rejectIfEmpty(errors,"username",null,"用户名不能为空!");
        ValidationUtils.rejectIfEmpty(errors,"password",null,"密码不能为空!");
    }
}

3、在 springmvc.xml 配置验证器的 bean;

<bean id="userValidator" class="com.trainingl.validation.UserValidator"></bean>

<!-- 基于Validator的配置 -->
<mvc:annotation-driven validator="userValidator"></mvc:annotation-driven>

4、编写业务方法;

package com.trainingl.controller;

import com.trainingl.entity.User;
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 validatorHandler {

    @GetMapping("/login")
    public String login(Model model){
        model.addAttribute("user",new User());
        return "login";
    }

    @PostMapping("/login")
    public String login(@Validated User user, BindingResult bindingResult){
        if(bindingResult.hasErrors()){
            return "login";
        }
        return "index";
    }
}

5、JSP 视图页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ page isELIgnored="false" %>
<html>
<head>
    <title>用户登录</title>
</head>
<body>
    <form:form modelAttribute="user" action="/validate/login" method="post">
        用户名:<form:input path="username"/><form:errors path="username"></form:errors> <br>
        密&emsp;码:<form:input path="password"/><form:errors path="password"></form:errors> <br>
        <input type="submit" value="登录">
    </form:form>
</body>
</html>

启动 Tomcat 服务器,运行程序的结果如下:

在这里插入图片描述

2. Annotation JSR - 303 标准

使用 Annotation JSR - 303 标准进行验证,需要导入支持这种标准的依赖 jar 包,这里我们使用 Hibernate Validator。

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

通过注解的方式直接在实体类中添加相关的验证规则

package com.trainingl.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.NotEmpty;

import javax.validation.constraints.Email;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Account {
    @NotEmpty(message = "用户名不能为空!")
    private String name;

    @Size(min = 6,max = 12,message = "密码长度为6 ~ 12位.")
    private String password;

    @Pattern(regexp = "^[a-z0-9A-Z]+[- | a-z0-9A-Z . _]+@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-z]{2,}$",message = "邮箱格式不合法!")
    private String email;

    @Pattern(regexp = "^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\\d{8}$",message = "电话号码不正确!")
    private String phone;
}

编写业务方法 ValidaorHandler

package com.trainingl.controller;

import com.trainingl.entity.Account;
import com.trainingl.entity.User;
import org.apache.taglibs.standard.extra.spath.Step;
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;

import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;

@Controller
@RequestMapping("/validate")
public class validatorHandler {

    @GetMapping("/register")
    public String register(Model model){
        model.addAttribute("account", new Account());
        return "register";
    }

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

在 springmvc.xml 中配置注解驱动

<mvc:annotation-driven></mvc:annotation-driven>

JSP 视图页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ page isELIgnored="false" %>
<html>
<head>
    <title>用户注册</title>
</head>
<body>
    <form:form modelAttribute="account" action="/validate/register" method="post">
        用户名:<form:input path="name"/><form:errors path="name"/><br/>
        密&emsp;码:<form:input path="password"/><form:errors path="password"/><br/>
        邮&emsp;箱:<form:input path="email"/><form:errors path="email"/><br/>
        电&emsp;话:<form:input path="phone"/><form:errors path="phone"/><br/>
        <input type="submit" value="提交">
    </form:form>
</body>
</html>

在这里插入图片描述

常用校验规则详解:

校验注解 可校验的数据类型 具体描述
@Null 基本数据类型除外 被注解的属性必须为null
@NotNull 基本数据类型除外 被注解的属性不能为null
@NotEmpty 集合、数组、字符串 被注解的属性的值必须非空
@NotBlank 字符串 被注解的属性不能为空且不能是空字符串
@Size 字符串、数组、集合 被注解的属性长度必须在指定的范围内
@Length 字符串 被注解的属性长度必须在指定的范围内
@Min 数字、字符串格式的数字 属性值必须大于指定的最小值
@Max 数字、字符串格式的数字 属性值必须小于指定的最大值
@Email 字符串 被注解的属性必须是合法邮箱格式
Pattern 字符串 被注解的元素必须符合对应的正则表达式

每个注解都有 message 属性,该属性用于填写校验失败时的异常描述信息,当校验失败时可以获取对应的message 属性值。

赞(0) 打赏
未经允许不得转载:IDEA激活码 » 24. Spring MVC 数据校验

一个分享Java & Python知识的社区