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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学生管理系统(vue + springboot)

学生管理系统&#xff08;vuespringboot&#xff09;资源-CSDN文库 项目介绍 这是一个采用前后端分离开发的项目&#xff0c;前端采用 Vue 开发、后端采用 Spring boot Mybatis 开发。 项目部署 ⭐️如果你有 docker 的话&#xff0c;直接 docker compose up 即可启动&#…

计算机基础面试题 |01.精选计算机基础面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

第4课 FFmpeg读取本地mp4文件并显示

在上节课&#xff0c;我们使用FFmpeg实现了一个最简单的rtmp播放器&#xff0c;它看起来工作正常。这节课&#xff0c;我们尝试让它来播放本地的mp4文件试试。 1.压缩备份上节课工程文件夹为demo3.rar&#xff0c;并修改工程文件夹demo3为demo4&#xff0c;重要的事情再说一遍…

使用anaconda创建notebook工程

1.由于每个工程使用的环境都可能不一样&#xff0c;因此一个好的习惯就是不同的工程都创建属于自己的环境&#xff0c;在anaconda中默认的环境是base&#xff1a; //括号中名字&#xff0c;代表当前的环境 (base)dragonmachine: $ conda create --nameexample2.激活环境 // 环…

Kubernetes网络-VXLAN

一. 网络基础 1. 计算机网络的分层 如今连接方式也越来也丰富&#xff0c;网线、WiFi、蓝牙、光纤&#xff0c;甚至我们普通的电线、照明所用的灯光&#xff0c;都可以作为接入网络的介质。如此庞大的网络&#xff0c;丰富多样的设备&#xff0c;计算机网络技术能把它们统一起…

回味2023

2023年的元旦假期我是在南京度过的&#xff0c;1月2日&#xff0c;我特别前往南京博物院&#xff0c;为了看一个特展——《墨田》。 时代发展&#xff0c;有些东西变了&#xff0c;但是有些东西没有变。 比如书写的方式变了&#xff0c;我们这一代&#xff0c;不再耕耘在真的“…

ubuntu22.04安装anacoda遇到的坑

这几天把用了3年的windows10换成了ubuntu22.04 各种环境都得配置&#xff0c;本文记录下遇到的坑。 1、anacoda在ubuntu上也可以用官方也提供了安装包&#xff0c;但是没有图形界面&#xff0c;需要以命令行的方式安装和运行配置 1.1 安装&#xff1a;官网下载后&#xff0c;…

Django 学习教程-介绍与安装

系列 Django 学习教程-第一个 Django 应用-CSDN博客 介绍 Django 是一个高级 Python Web 框架&#xff0c;它鼓励快速开发和干净、实用的设计。 它由经验丰富的开发人员构建&#xff0c;解决了 Web 开发的大部分麻烦&#xff0c;因此您可以专注于在编写应用程序时无需重新发…

手把手教你绘制和解读实用R列线图(Nomogram):从入门到精通

一、引言 列线图&#xff08;Nomogram&#xff09;是一种常用的数据可视化工具&#xff0c;它能够直观地展示多个变量之间的关系&#xff0c;并帮助我们理解和解释复杂的数据模式。通过绘制列线图&#xff0c;我们可以将各种变量的影响和相互关联转化为图形化的表示&#xff0c…

前端基础(三十七):属性结构数据进行关键字筛选

效果 核心源码 type MenuItem {label: string;key: string | number;icon?: React.ReactNode;children?: MenuItem[];type?: group; }function filterTreeData(tree: MenuItem[], keyword: string): MenuItem[] {return tree.filter((node: MenuItem) > {if (node.labe…

修改一个VC++访问数据库源码

下载一个VC6访问数据库的源码;修改; 打开工程先出现下图错误; 根据资料,出现此错误,解决方法: 1.如果用户不需要在 WizardBar,请关闭该的 WizardBar 并重新启动 Visual C++6.0。 如果但是,您想访问 WizardBar 功能,请关闭受影响的工作区之前关闭所有窗口。 2.重新生…

我的512天创作者纪念日总结:高效、高现

文章目录 512天创作者纪念日&#xff1a;2023年的12月31日CSDN的512天消息提醒第一篇文章&#xff0c;最后一篇文章总计847篇文章&#xff0c;每月发文分布512天&#xff0c;各专栏文章统计512天&#xff0c;互动总成绩 512天创作者纪念日&#xff1a;2023年的12月31日 2023年…