Spring 校验(validator,JSR-303)简单实现方式

yizhihongxing

实现一个完整的表单校验是 Web 应用中非常重要的组成部分。Spring 框架提供了校验的功能,它支持 JSR-303 规范和 Spring Validator 接口两种校验方式。本文将为大家介绍 Spring 校验的简单实现方式。

JSR-303 校验方式

下面将演示一个基于 JSR-303 规范实现的表单校验示例。

引入依赖

首先需要引入 Spring Web 和 Hibernate Validator 两个依赖:

<dependencies>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>4.3.14.RELEASE</version>
  </dependency>
  <dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>5.4.1.Final</version>
  </dependency>
</dependencies>

创建实体类

接下来需要创建一个实体类,并在其中使用注解方式定义校验规则:

public class User {
  @NotNull(message="用户名不能为空")
  @Size(min=4, max=20, message="用户名长度必须在4到20个字符之间")
  private String username;

  @NotNull(message="密码不能为空")
  @Size(min=6, max=20, message="密码长度必须在6到20个字符之间")
  private String password;

  // getter 和 setter 方法
}

创建校验器

创建一个校验器类,添加 @Component 注解,使用 @Autowired 注解引入 org.springframework.validation.Validator 接口,Spring 会自动将校验器注入到控制器中:

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

  @Override
  public void validate(Object target, Errors errors) {
    User user = (User)target;

    ValidationUtils.rejectIfEmptyOrWhitespace(errors, "username", null, "用户名不能为空");
    ValidationUtils.rejectIfEmptyOrWhitespace(errors, "password", null, "密码不能为空");

    if (user.getUsername().length() < 4 || user.getUsername().length() > 20) {
      errors.rejectValue("username", null, "用户名长度必须在4到20个字符之间");
    }

    if (user.getPassword().length() < 6 || user.getPassword().length() > 20) {
      errors.rejectValue("password", null, "密码长度必须在6到20个字符之间");
    }
  }
}

编写控制器

在控制器中引入校验器,并在方法参数中添加注解 @ValidErrors,即可完成参数的校验:

@Controller
public class UserController {
  @Autowired
  private UserValidator userValidator;

  @PostMapping("/login")
  public String login(@Valid User user, Errors errors, Model model) {
    if (errors.hasErrors()) {
      return "login";
    }

    model.addAttribute("user", user);

    return "success";
  }
}

编写 HTML 模板

最后,在 HTML 模板中添加表单元素,并在要校验的元素中添加 th:errors 属性:

<form action="/login" method="post" th:object="${user}">
  <input type="text" th:field="*{username}">
  <span th:errors="*{username}"></span><br>

  <input type="password" th:field="*{password}">
  <span th:errors="*{password}"></span><br>

  <button type="submit">登录</button>
</form>

至此,一个基于 JSR-303 规范实现的表单校验示例已经完成。

Spring Validator 校验方式

现在介绍第二种 Spring 校验方式,即实现 Spring Validator 接口的校验方式。

创建实体类

同样需要先创建一个实体类,不过这次不使用注解方式校验:

public class Address {
  private String city;
  private String district;

  // getter 和 setter 方法
}

创建校验器

接下来创建一个校验器类,并实现org.springframework.validation.Validator 接口:

@Component
public class AddressValidator implements Validator {
  @Override
  public boolean supports(Class<?> clazz) {
    return Address.class.equals(clazz);
  }

  @Override
  public void validate(Object target, Errors errors) {
    Address address = (Address)target;

    if (address.getCity() == null || address.getCity().isEmpty()) {
      errors.rejectValue("city", null, "城市不能为空");
    }

    if (address.getDistrict() == null || address.getDistrict().isEmpty()) {
      errors.rejectValue("district", null, "区域不能为空");
    }
  }
}

编写控制器

在控制器中引入校验器,并在方法参数中添加注解 @ValidErrors,即可完成参数的校验:

@Controller
public class AddressController {
  @Autowired
  private AddressValidator addressValidator;

  @PostMapping("/address")
  public String saveAddress(@Valid Address address, Errors errors, Model model) {
    addressValidator.validate(address, errors);

    if (errors.hasErrors()) {
      return "address";
    }

    model.addAttribute("address", address);

    return "success";
  }
}

编写 HTML 模板

最后,在 HTML 模板中添加表单元素,并在要校验的元素中添加 th:errors 属性:

<form action="/address" method="post" th:object="${address}">
  <input type="text" th:field="*{city}">
  <span th:errors="*{city}"></span><br>

  <input type="text" th:field="*{district}">
  <span th:errors="*{district}"></span><br>

  <button type="submit">保存</button>
</form>

至此,一个基于 Spring Validator 接口实现的表单校验示例已经完成。需要注意的是,在使用 Spring Validator 的时候,需要先在控制器中手动调用 validate 方法进行校验。

总结:通过本文的介绍,可以看出 Spring 校验方式非常简单易用,分别使用 JSR-303 规范和 Spring Validator 接口两种校验方式即可实现表单校验。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring 校验(validator,JSR-303)简单实现方式 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • JAVA JVM运行时数据区详解

    让我来详细讲解一下“Java JVM运行时数据区”的完整攻略吧。 什么是Java JVM运行时数据区 在Java中,JVM运行时数据区可以分为五个部分,分别是: 程序计数器 Java虚拟机栈 Java堆 方法区 运行时常量池 以下我们将分别对这五个部分进行详细的讲解。 1. 程序计数器 程序计数器是一块较小的内存空间,用来存储当前线程所执行的字节码地址。在多…

    Java 2023年6月1日
    00
  • Servlet中文乱码问题解决方案解析

    下面是Servlet中文乱码问题解决方案的详细攻略。 问题描述 在Servlet程序中,当表单提交包含中文字符时,会出现中文乱码的现象。比如表单中提交的文字为“中国”,但在Servlet程序中获取到的却是“中国”。 解决方案分析 原因分析 中文乱码的原因在于,不同的系统、不同的编程语言对中文字符的存储方式不同。当一个字符被从一个系统传递到另一个系统时…

    Java 2023年5月20日
    00
  • 一个Java程序猿眼中的前后端分离以及Vue.js入门(推荐)

    一个Java程序猿眼中的前后端分离以及Vue.js入门 前后端分离 前后端分离是指将前端和后端的开发、部署等过程分离开,前端和后端通过接口通信,互相独立开发、测试、部署。 优势 前后端分离的优势主要有: 前端和后端的开发可以并行进行,加快开发速度; 可以使用不同的技术栈,提高开发效率; 可以更好地实现前后端分工,提高开发效率; 更容易进行维护,修改、升级等。…

    Java 2023年5月26日
    00
  • Java 房屋租赁系统的实现流程

    下面是Java房屋租赁系统的实现流程的完整攻略。 系统设计 功能需求 房源管理 租客管理 订单管理 支付管理 技术需求 JDK版本:1.8以上 数据库:MySQL 框架:Spring Boot+Mybatis 开发工具:eclipse/idea 数据库设计 该系统需要设计三张表:房源表、租客表、订单表。其结构设计如下: 房源表 CREATE TABLE `h…

    Java 2023年5月19日
    00
  • JS特权方法定义作用以及与公有方法的区别

    让我来详细讲解“JS特权方法定义作用以及与公有方法的区别”。 什么是JS特权方法? JS特权方法指的是可以访问对象私有属性和方法的公有方法。在JS中,有时我们需要访问私有属性和方法,但是由于私有属性和方法不能被外部访问,所以我们需要在对象内定义一个公有方法,通过该公有方法来访问私有属性和方法。这个公有方法就是JS特权方法。 JS特权方法定义格式 JS特权方法…

    Java 2023年6月16日
    00
  • SpringBoot Bean花式注解方法示例下篇

    那么接下来我将详细讲解“SpringBoot Bean花式注解方法示例下篇”这篇攻略的完整内容,并且提供两条示例。该篇攻略主要对Spring Boot Bean的注解进行介绍。 一、Spring Boot Bean的注解 Spring Boot使用注解来管理Bean。下面是一些常用的注解: 1. @Component和@ComponentScan @Comp…

    Java 2023年5月20日
    00
  • Java正则表达式API字符类

    Java正则表达式API字符类 在 Java 的正则表达式中,字符类是一种用于匹配某个范围内字符的元字符集合。它可以轻松地匹配需要的字符类型。 语法 字符类使用方括号 [] 来定义。其中,方括号内可以包含一系列要匹配的字符或字符范围。 例如,匹配 a、b、c、d、e、f、g 这七个字符的字符类可以写为: [a-g] 该字符类代表范围从 “a” 到 “g” 的…

    Java 2023年5月27日
    00
  • Java的web开发中SSH框架的协作处理应用笔记

    Java的web开发中SSH框架的协作处理应用笔记 SSH框架简介 SSH框架是指Struts2与Spring框架和Hibernate框架的结合。其中,Struts2作为MVC框架,Spring作为IoC容器和AOP框架,Hibernate作为ORM框架。SSH框架的优点在于可以有效地分离前端展示、业务处理和数据存储。同时,SSH框架也提供了许多方便的工具和…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部