Spring Boot 表单验证

个人名片
在这里插入图片描述
🎓作者简介:java领域优质创作者
🌐个人主页码农阿豪
📞工作室:新空间代码工作室(提供各种软件服务)
💌个人邮箱:[2435024119@qq.com]
📱个人微信:15279484656
🌐个人导航网站:www.forff.top
💡座右铭:总有人要赢。为什么不能是我呢?

  • 专栏导航:

码农阿豪系列专栏导航
面试专栏:收集了java相关高频面试题,面试实战总结🍻🎉🖥️
Spring5系列专栏:整理了Spring5重要知识点与实战演练,有案例可直接使用🚀🔧💻
Redis专栏:Redis从零到一学习分享,经验总结,案例实战💐📝💡
全栈系列专栏:海纳百川有容乃大,可能你想要的东西里面都有🤸🌱🚀

Spring Boot 表单验证

1. 引言

在现代 Web 应用程序中,表单验证是一个非常重要的环节。通过表单验证,可以确保用户输入的数据符合要求,避免无效或恶意数据进入系统。Spring Boot 提供了一套强大且易用的表单验证机制,使得表单验证变得简单高效。本文将详细介绍 Spring Boot 中的表单验证,包括验证注解的使用、验证器的自定义以及国际化支持。

2. 表单验证的基本概念

2.1 什么是表单验证

表单验证是指在用户提交表单数据之前,对数据进行检查,确保其符合预期的格式和规则。例如,检查邮箱地址是否有效、密码是否符合长度要求、必填字段是否为空等。通过表单验证,可以提高数据的质量,增强应用程序的安全性。

2.2 Spring Boot 中的表单验证

Spring Boot 使用 Bean Validation(JSR-380)规范来实现表单验证。Bean Validation 提供了一组标准的注解,用于在模型类中声明验证规则。Spring Boot 通过与 Hibernate Validator 的集成,提供了对 Bean Validation 的完整支持。

3. Spring Boot 表单验证示例

下面,我们将通过一个示例来介绍如何在 Spring Boot 中进行表单验证。假设我们要创建一个用户注册表单,需要对用户名、密码和邮箱地址进行验证。

3.1 创建项目结构

首先,我们创建一个新的 Spring Boot 项目,项目结构如下:

spring-boot-form-validation/
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com/
│   │   │       └── example/
│   │   │           └── formvalidation/
│   │   │               ├── controller/
│   │   │               ├── model/
│   │   │               ├── service/
│   │   │               └── validator/
│   │   ├── resources/
│   │   │   ├── static/
│   │   │   ├── templates/
│   │   │   └── application.properties
├── pom.xml

3.2 添加依赖

pom.xml 文件中添加 Spring Boot Starter Web 和 Validation Starter 依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-validation</artifactId>
    </dependency>
    <dependency>
        <groupId>org.hibernate.validator</groupId>
        <artifactId>hibernate-validator</artifactId>
    </dependency>
</dependencies>

3.3 创建模型类

创建一个 User 类,表示用户注册表单的模型。我们在该类中使用验证注解来声明各字段的验证规则。

package com.example.formvalidation.model;

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

public class User {

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

    @NotBlank(message = "密码不能为空")
    @Size(min = 6, message = "密码长度必须至少为6个字符")
    private String password;

    @NotBlank(message = "邮箱不能为空")
    @Email(message = "邮箱格式不正确")
    private String email;

    // Getters and setters
}

3.4 创建控制器

创建一个 UserController 类,处理用户注册表单的提交和验证。

package com.example.formvalidation.controller;

import com.example.formvalidation.model.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;

import javax.validation.Valid;

@Controller
public class UserController {

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

    @PostMapping("/register")
    public String registerUser(@Valid @ModelAttribute("user") User user, BindingResult bindingResult, Model model) {
        if (bindingResult.hasErrors()) {
            return "register";
        }
        // 处理用户注册逻辑
        model.addAttribute("message", "用户注册成功");
        return "success";
    }
}

3.5 创建视图模板

src/main/resources/templates 目录下创建 register.htmlsuccess.html 文件。

register.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>用户注册</title>
</head>
<body>
<h1>用户注册</h1>
<form th:action="@{/register}" th:object="${user}" method="post">
    <div>
        <label for="username">用户名:</label>
        <input type="text" id="username" th:field="*{username}" />
        <span th:if="${#fields.hasErrors('username')}" th:errors="*{username}"></span>
    </div>
    <div>
        <label for="password">密码:</label>
        <input type="password" id="password" th:field="*{password}" />
        <span th:if="${#fields.hasErrors('password')}" th:errors="*{password}"></span>
    </div>
    <div>
        <label for="email">邮箱:</label>
        <input type="email" id="email" th:field="*{email}" />
        <span th:if="${#fields.hasErrors('email')}" th:errors="*{email}"></span>
    </div>
    <div>
        <button type="submit">注册</button>
    </div>
</form>
</body>
</html>
success.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>注册成功</title>
</head>
<body>
<h1 th:text="${message}">注册成功</h1>
</body>
</html>

3.6 自定义验证器

有时候,内置的验证注解不能满足我们的需求,我们可以创建自定义验证器。例如,我们可以创建一个自定义验证器,验证用户名是否已被使用。

创建自定义注解
package com.example.formvalidation.validator;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Constraint(validatedBy = UniqueUsernameValidator.class)
@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface UniqueUsername {
    String message() default "用户名已被使用";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}
创建验证器
package com.example.formvalidation.validator;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class UniqueUsernameValidator implements ConstraintValidator<UniqueUsername, String> {

    @Override
    public void initialize(UniqueUsername constraintAnnotation) {
    }

    @Override
    public boolean isValid(String username, ConstraintValidatorContext context) {
        // 假设我们有一个方法 isUsernameUnique 检查用户名是否唯一
        return isUsernameUnique(username);
    }

    private boolean isUsernameUnique(String username) {
        // 模拟用户名检查逻辑
        return !username.equalsIgnoreCase("admin");
    }
}
使用自定义验证器
package com.example.formvalidation.model;

import com.example.formvalidation.validator.UniqueUsername;

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

public class User {

    @NotBlank(message = "用户名不能为空")
    @Size(min = 3, max = 20, message = "用户名长度必须在3到20个字符之间")
    @UniqueUsername
    private String username;

    @NotBlank(message = "密码不能为空")
    @Size(min = 6, message = "密码长度必须至少为6个字符")
    private String password;

    @NotBlank(message = "邮箱不能为空")
    @Email(message = "邮箱格式不正确")
    private String email;

    // Getters and setters
}

3.7 国际化支持

在实际应用中,支持多语言是非常重要的。Spring Boot 提供了方便的国际化支持。我们可以通过配置文件来实现表单验证消息的国际化。

配置国际化消息文件

src/main/resources 目录下创建 messages.propertiesmessages_zh.properties 文件。

messages.properties
username.notBlank=Username cannot be empty
username.size=Username must be between 3 and 20 characters
password.notBlank=Password

 cannot be empty
password.size=Password must be at least 6 characters
email.notBlank=Email cannot be empty
email.email=Invalid email format
uniqueUsername=Username is already taken
messages_zh.properties
username.notBlank=用户名不能为空
username.size=用户名长度必须在3到20个字符之间
password.notBlank=密码不能为空
password.size=密码长度必须至少为6个字符
email.notBlank=邮箱不能为空
email.email=邮箱格式不正确
uniqueUsername=用户名已被使用
配置 application.properties
spring.messages.basename=messages
spring.messages.encoding=UTF-8

4. 总结

本文详细介绍了如何在 Spring Boot 中进行表单验证,包括验证注解的使用、自定义验证器的创建以及国际化支持。通过这些内容,读者可以了解到如何在实际项目中实现表单验证,提高数据的质量和安全性。表单验证是 Web 应用程序开发中的一个重要环节,掌握其使用方法和技巧,对于构建健壮和可靠的应用程序至关重要。希望本文对您理解和实现 Spring Boot 表单验证有所帮助。

  • 18
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农阿豪@新空间代码工作室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值