【Spring实战】14 Web表单校验

文章目录

    • 1. 依赖
    • 2. 实体类
    • 3. 控制器
    • 4. 页面
    • 5. 启动
    • 6. 验证
      • 1)访问页面
      • 2)后台校验
    • 7. 优点
    • 8. 代码详细
    • 总结

在 Web 应用中,表单是用户与后端交互的主要界面之一。为了确保数据的有效性和一致性,我们经常需要对提交的表单数据进行验证。Spring 提供了强大的数据校验机制,结合注解和验证器,能够轻松地在服务器端完成数据校验。本博客将介绍如何使用 Spring 进行 Web 表单的校验。

1. 依赖

项目中需要引入 spring-boot-starter-webhibernate-validator 两个依赖

pom.xml

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

2. 实体类

创建一个代表表单数据的实体类,并在该实体类中添加数据校验注解

User.java

package com.cheney.koala.model;

import jakarta.validation.constraints.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class User {

    @NotBlank(message = "姓名不能为空")
    private String name;

    private String gender;

    @NotNull(message = "年龄不能为空")
    @Min(value = 18, message = "年龄不能小于18岁")
    private Integer age;

    @NotBlank(message = "手机号不能为空")
    @Pattern(regexp = "^\\d{11}$", message = "手机号必须是11位数字")
    private String phoneNumber;

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

上述 User 实体类中使用了 @NotBlank@Min@Pattern@Email 等注解,这些注解定义了相应字段的验证规则。

  • @NotBlank

用于验证字符串不为空。如果为空,会产生带有指定消息的验证错误

  • @Min

用于验证数值的最小值。指定了年龄的最小值为 18 岁,如果小于 18,会产生带有指定消息的验证错误

  • @Pattern

用于验证字段的值是否匹配指定的正则表达式。此处使用 ^\\d{11}$ 来验证手机号是否是11位数字

  • @Email:

用于验证字段是否是有效的电子邮件地址格式

3. 控制器

在控制器中处理表单提交,并使用 @Valid 注解标记需要验证的实体类。如果验证失败,Spring 将自动将错误信息添加到 BindingResult 对象中。

package com.cheney.koala.controller;

import com.cheney.koala.model.User;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
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.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("user")
@Slf4j
public class UserController {

    @PostMapping("register")
    public String registerUser(@Valid User user, BindingResult result, Model model) {
        if (result.hasErrors()) {
            log.info("检验错误 " + result.getAllErrors().size() + " 个");
            result.getAllErrors().forEach(
                    e -> System.out.println(e.getDefaultMessage())
            );
            return "register";
        }

        log.info(user.toString());
        return "redirect:/login";
    }
}

在上述代码中,@Valid 注解用于标记需要验证的实体类对象 User,而 BindingResult 对象用于收集验证错误信息。此处如果校验出错误,则在控制台打印错误的个数以及错误信息。

4. 页面

创建一个 Thymeleaf 模板(例如,register.html),用于展示用户注册的表单。在表单中使用 Thymeleaf 标签来显示错误信息:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Koala Registration Page</title>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
</head>
<body class="bg-light">
<div class="container mt-5">
    <div class="row justify-content-center">
        <div class="col-md-6">
            <div class="card">
                <div class="card-header">
                    <h3 class="text-center">Koala System Registration</h3>
                </div>
                <div class="card-body">
                    <form th:action="@{/user/register}" method="post">
                        <div class="form-group">
                            <label for="name">Name:</label>
                            <input type="text" class="form-control" id="name" name="name">
                        </div>
                        <div class="form-row">
                            <div class="form-group col-md-6">
                                <label for="gender">Gender:</label>
                                <select class="form-control" id="gender" name="gender" required>
                                    <option value="male">Male</option>
                                    <option value="female">Female</option>
                                </select>
                            </div>
                            <div class="form-group col-md-6">
                                <label for="age">Age:</label>
                                <input type="number" class="form-control" id="age" name="age" required>
                            </div>
                        </div>
                        <div class="form-group">
                            <label for="phoneNumber">Phone Number:</label>
                            <input type="tel" class="form-control" id="phoneNumber" name="phoneNumber" required>
                        </div>
                        <div class="form-group">
                            <label for="email">Email:</label>
                            <input type="email" class="form-control" id="email" name="email" required>
                        </div>

                        <button type="submit" class="btn btn-primary btn-block">Register</button>
                    </form>
                </div>
            </div>
        </div>
    </div>
</div>
</body>
</html>

5. 启动

在这里插入图片描述

6. 验证

1)访问页面

http://localhost:8080/register

在这里插入图片描述

输入个人信息,点击 Register 按钮

2)后台校验

在这里插入图片描述

如我们所想,我们看到了,相应的错误信息。

7. 优点

  • 统一的验证框架

    Spring 表单校验使用 Java 标准的 Bean Validation(JSR 380)规范,通过注解对模型对象进行验证。这提供了一种统一的验证框架,使得验证逻辑与具体的实现细节解耦。

  • 注解简化验证逻辑

    使用注解标记在模型类字段上,简化了验证逻辑的编写。通过使用注解,可以在模型类中直观地定义验证规则,使代码更加清晰和易于维护。

  • 可扩展性

    Spring 表单校验支持自定义的验证注解,使得可以根据业务需求创建特定的验证规则。这增强了验证框架的可扩展性,使其能够满足不同项目的需求。

  • 集成框架支持

    Spring 框架天然支持表单校验,并提供了与其他模块的良好集成。特别是在 Spring MVC 中,表单校验与控制器方法的参数验证、错误处理等集成得非常紧密,简化了整个验证流程。

  • 错误处理和消息国际化

    Spring 表单校验提供了灵活的错误处理机制,可以方便地将验证错误消息与用户界面进行关联。支持消息的国际化,使得应用能够轻松地适应不同语言环境。

  • 前端交互支持

    Spring 表单校验生成的错误信息可以方便地传递到前端,通过合适的技术(例如 Thymeleaf、FreeMarker 等)在用户界面上显示。这样,用户可以获得实时的反馈,提高了用户体验。

  • 防止恶意输入

    表单校验不仅可以验证字段是否为空,还能验证字段的格式、长度等。这有助于防止恶意用户通过非法输入对系统进行攻击。

8. 代码详细

https://github.com/cheney09/spring-practical-combat/tree/main/14/koala

在这里插入图片描述

总结

使用 Spring 表单校验可以提高开发效率,减少代码冗余,增加系统的可维护性和稳定性。通过在模型层面进行验证,可以确保数据的合法性,提升应用的质量。 本文通过了一个小例子说明了常见的用法,其他的校验在需要的时候再去查看啦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/290042.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一文教会git如何配置多SSH Key(Github+Gitlab)

一文教会git如何配置多SSH Key&#xff08;GithubGitlab&#xff09; 对于工作了的伙伴来说&#xff0c;大家经常会配置多个SSH Key&#xff1a; SSH拉取的仓库不会反复的要求输入github用户名密码来验证自己的身份需要将公司的Gitlab和个人的Github区分开 我这里以Mac电脑为例…

Debezium发布历史46

原文地址&#xff1a; https://debezium.io/blog/2019/02/05/debezium-0-9-0-final-released/ 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻译&#xff0c;仅供参考&#xff0c;笔芯笔芯. Debezium 0.9.0.Final 发布 2019 年 2 月 5 日 作者&#xff1a; G…

matplotlib颜色合集——各种常见简单图形(上)

一、.颜色配图表 图文颜色引用&#xff1a;建站教程 - FINTHON 二、折线图 jupyter notebook 简介plot() 2.1折线图参数 plt.plot(*args, scalexTrue, scaleyTrue, dataNone, **kwargs) 2.2、参数介绍 x&#xff1a;X轴数据&#xff0c;列表或数组&#xff0c;可选。 y&a…

没有Kubernetes也可以玩转Dapr?

一、NameResolution组件 虽然Dapr提供了一系列的编程模型&#xff0c;比如服务调用、发布订阅和Actor模型等&#xff0c;被广泛应用的应该还是服务调用。我们知道微服务环境下的服务调用需要解决服务注册与发现、负载均衡、弹性伸缩等问题&#xff0c;其实Dapr在这方面什么都没…

【数据结构】二叉树(一)——树和二叉树的概念及结构

前言: 本篇博客主要了解什么是树&#xff0c;什么是二叉树&#xff0c;以及他们的概念和结构。 文章目录 一、树的概念及结构1.1 树的基本概念1.2 树的相关特征1.3 树的实现 二、二叉树的概念及性质2.1 二叉树的概念2.2 二叉树的性质 一、树的概念及结构 1.1 树的基本概念 树&…

Z-score 因子的深入思考

最新&#xff08;2024 年 1 月&#xff09;出版的 SC 技术分析&#xff08;Techical Analysis of Stock & Commodities&#xff09;的第 4 条文章给到了 Z-score&#xff0c;原文标题为《Z-score: How to use it in Trading》。今天的笔记&#xff0c;就借此机会&#xff0…

C++线程池的原理(画图)及简单实现+例子(加深理解)

1.为什么线程池会出现&#xff0c;解决什么问题&#xff1f; C线程池&#xff08;ThreadPool&#xff09;的出现主要是为了解决以下几个问题&#xff1a; 1.性能&#xff1a;创建和销毁线程都是相对昂贵的操作&#xff0c;特别是在高并发场景下&#xff0c;频繁地创建和销毁线…

ubuntu18.04安装MySQL

1.安装mysql服务器端 sudo apt-get -y install mysql-server&#xff08;18.04/20.04不会提示输入密码&#xff0c;默认是没有密码&#xff09; 2.安装mysql客户端 sudo apt-get -y install mysql-client3.安装mysql模块 sudo apt-get -y install libmysqlclient-dev4.验证是…

data.TensorDataset解析

data.TensorDataset 是 PyTorch 中的一个类&#xff0c;用于创建一个包含多个张量的数据集。这个类的主要作用是将输入的张量组合成一个数据集&#xff0c;使得在训练过程中可以方便地进行数据加载和迭代。 具体来说&#xff0c;TensorDataset 接受一系列的张量作为输入参数&a…

字符集字符编码

字符集 字符&#xff08;Character&#xff09;是各种文字和符号的总称&#xff0c;包括各国家文字、标点符号、图形符号、数字等。而字符集&#xff08;Character set&#xff09;则是多个字符的集合。 简单的说&#xff0c;字符集就规定了某个文字对应的二进制数字存放方式…

springboot整合springbatch批处理

springboot整合springbatch实现批处理 简介项目搭建步骤 简介 项目搭建 参考博客【场景实战】Spring Boot Spring Batch 实现批处理任务&#xff0c;保姆级教程 步骤 1.建表 建表sql CREATE TABLE student (id int NOT NULL AUTO_INCREMENT,name varchar(100) NOT NULL C…

[C#]yolov8-onnx在winform部署手势识别模型

【官方框架地址】 https://github.com/ultralytics/ultralytics.git 【算法介绍】 YOLOv8 是一个 SOTA 模型&#xff0c;它建立在以前 YOLO 版本的成功基础上&#xff0c;并引入了新的功能和改进&#xff0c;以进一步提升性能和灵活性。具体创新包括一个新的骨干网络、一个新…

牛客网面试题知识点记录-03

1.题目讲解重写后子类调用父类的方法总结&#xff1a;当子类重写了父类方法A&#xff0c;父类方法直接调用被重写的父类方法后&#xff0c;调用的是子类的重写的父类方法A。 class Test {public static void main(String[] args) {System.out.println(new B().getValue());}st…

Java的并发修改异常

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…

原生JS调用OpenAI GPT接口并实现ChatGPT逐字输出效果

效果&#xff1a; 猜你感兴趣&#xff1a;springbootvue实现ChatGPT逐字输出打字效果 附源码&#xff0c;也是小弟原创&#xff0c;感谢支持&#xff01; 没废话&#xff0c;上代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><me…

【Proteus仿真】【STM32单片机】超声波测距系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真STM32单片机控制器&#xff0c;使用动态数码管、按键、HCSR04超声波、蜂鸣器模块等。 主要功能&#xff1a; 系统运行后&#xff0c;数码管显示超声波检测距离&#xff0c;当检测…

奈奎斯特定理

奈奎斯特定理是通信领域中重要的理论基础之一&#xff0c;它对于数字通信系统中的信号采样和重构具有至关重要的作用。在数字信号处理和通信技术中&#xff0c;奈奎斯特定理的应用不仅具有理论意义&#xff0c;还对通信系统的设计、优化和性能提升起着重要的指导作用。本文将以…

8868体育助力意甲博洛尼亚俱乐部 主帅被评为最佳

博洛尼亚俱乐部是8868体育合作球队之一&#xff0c;本赛季在意甲联赛中表现出色&#xff0c;目前以8胜7平2负的成绩排名第四&#xff0c;积31分。意大利媒体评选出的年度最佳主帅是莫塔&#xff0c;本赛季莫塔率领博洛尼亚连续战胜强敌&#xff0c;目前在意甲积分榜上排名第四&…

进阶学习——Linux系统中重点‘进程’

目录 一、程序和进程的关系 1.程序 2.进程 2.1线程 2.2协程 3.进程与线程的区别 4.总结 4.1延伸 5.进程使用内存的问题 5.1内存泄漏——Memory Leak 5.2内存溢出——Memory Overflow 5.3内存不足——OOM&#xff08;out of memory&#xff09; 5.4进程使用内存出现…

Algorithm-Left Edge算法

算法输入&#xff1a; 多个段&#xff0c;每个段由两个值表示&#xff0c;例如&#xff08;1&#xff0c;3&#xff09; 算法原理&#xff1a; 将多个段按照左边的值排序放到列表中遍历列表&#xff0c;不断选择没有重叠的段&#xff0c;直到列表遍历结束&#xff0c;将选择…