Spring 的表单处理

Spring 提供了强大的表单处理功能,简化了 Web 应用程序中用户输入数据的绑定和校验。在这篇文章中,我们将深入探讨 Spring 的表单处理机制,包括表单提交、使用 @ModelAttribute 进行数据绑定、数据绑定与校验,以及使用 @ValidBindingResult 进行数据验证。

表单提交

在 Spring MVC 中,表单提交通常由 HTML 表单和控制器方法配合实现。HTML 表单用于收集用户输入数据,控制器方法处理这些数据并进行相应的操作。

首先,我们创建一个简单的 HTML 表单,用于收集用户信息:

<!DOCTYPE html>
<html>
<head><title>User Form</title>
</head>
<body><form action="/submitUser" method="post"><label for="name">Name:</label><input type="text" id="name" name="name"><br><br><label for="email">Email:</label><input type="email" id="email" name="email"><br><br><input type="submit" value="Submit"></form>
</body>
</html>

这个表单通过 POST 方法提交数据到 /submitUser URL。

使用 @ModelAttribute

在 Spring MVC 中,@ModelAttribute 注解用于将表单数据绑定到一个模型对象上。这个模型对象通常是一个 JavaBean。

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;@Controller
public class UserController {@PostMapping("/submitUser")public String submitUser(@ModelAttribute User user) {// 处理用户数据System.out.println("User Name: " + user.getName());System.out.println("User Email: " + user.getEmail());return "userSuccess";}
}

在这个例子中,@ModelAttribute 注解将表单数据绑定到 User 对象上。

User 类定义:
public class User {private String name;private String email;// Getters and Setters
}

当用户提交表单时,Spring MVC 会自动将表单数据绑定到 User 对象,并传递给 submitUser 方法。

数据绑定与校验

数据绑定是指将表单提交的数据自动转换为模型对象属性的过程。在实际应用中,数据校验是确保用户输入数据符合预期格式和约束的重要步骤。

使用 @Valid 和 BindingResult

Spring 提供了 @Valid 注解和 BindingResult 接口来进行数据校验。@Valid 注解用于触发数据校验,BindingResult 用于存储校验结果。

首先,在 User 类中添加校验注解:

import javax.validation.constraints.Email;
import javax.validation.constraints.NotEmpty;public class User {@NotEmpty(message = "Name is required")private String name;@Email(message = "Invalid email address")@NotEmpty(message = "Email is required")private String email;// Getters and Setters
}

接下来,在控制器方法中使用 @ValidBindingResult 进行数据校验:

import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import javax.validation.Valid;@Controller
public class UserController {@PostMapping("/submitUser")public String submitUser(@Valid @ModelAttribute User user, BindingResult result) {if (result.hasErrors()) {return "userForm";}// 处理用户数据System.out.println("User Name: " + user.getName());System.out.println("User Email: " + user.getEmail());return "userSuccess";}
}

在这个例子中,@Valid 注解用于触发 User 对象的校验,BindingResult 用于存储校验结果。如果存在校验错误,返回到表单视图 userForm,否则处理用户数据并返回成功视图 userSuccess

完整示例

我们将上述所有部分整合成一个完整的示例,包括 HTML 表单、控制器和视图。

HTML 表单

保存为 userForm.jsp

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head><title>User Form</title>
</head>
<body><form action="${pageContext.request.contextPath}/submitUser" method="post"><label for="name">Name:</label><input type="text" id="name" name="name" value="${user.name}"><br><br><c:if test="${not empty errors.name}"><span style="color:red">${errors.name}</span><br><br></c:if><label for="email">Email:</label><input type="email" id="email" name="email" value="${user.email}"><br><br><c:if test="${not empty errors.email}"><span style="color:red">${errors.email}</span><br><br></c:if><input type="submit" value="Submit"></form>
</body>
</html>
成功视图

保存为 userSuccess.jsp

<!DOCTYPE html>
<html>
<head><title>Success</title>
</head>
<body><h2>User submitted successfully!</h2>
</body>
</html>
控制器类
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("/userForm")public String showForm(Model model) {model.addAttribute("user", new User());return "userForm";}@PostMapping("/submitUser")public String submitUser(@Valid @ModelAttribute User user, BindingResult result, Model model) {if (result.hasErrors()) {model.addAttribute("errors", result.getFieldErrors().stream().collect(Collectors.toMap(FieldError::getField, FieldError::getDefaultMessage)));return "userForm";}// 处理用户数据System.out.println("User Name: " + user.getName());System.out.println("User Email: " + user.getEmail());return "userSuccess";}
}

在这个完整示例中,我们展示了如何通过 Spring MVC 进行表单提交、数据绑定与校验,并使用 @ValidBindingResult 进行数据验证。

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

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

相关文章

仓库管理系统带万字文档基于spingboot vue的前后端分离仓库管理系统java项目java课程设计java毕业设计

文章目录 仓库管理系统一、项目演示二、项目介绍三、万字项目文档四、部分功能截图五、部分代码展示六、底部获取项目源码带万字文档&#xff08;9.9&#xffe5;带走&#xff09; 仓库管理系统 一、项目演示 仓库管理系统 二、项目介绍 基于spingboot和vue的前后端分离仓库管…

vue 中computed和watch的区别

computed与watch的区别 首先&#xff0c;computed是计算属性&#xff0c;watch是监听&#xff0c;监听data中的数据变化。 computed的计算属性它支持缓存&#xff0c;只有当依赖项发生改变的时候&#xff0c;它才会重新计算&#xff0c;否则它用的就是缓存的值。watch不支持缓…

华测视频RTK,AR实景导航

华测导航视频测量RTK技术,通过融合卫星导航、惯导与视频摄影测量算法,让“所见即所测”成为现实,让测量工作变得更加智能、高效。 视频测量RTK:智能测绘的新里程碑 华测RTK的性能和广泛应用,在市场中获得了用户的认可,平均每10位用户中即有6位推荐。其视频测量功能通过引入自动…

如何用GPT开发一个基于 GPT 的应用?

原文发自博客&#xff1a;GPT应用开发小记 如何开发一个基于 GPT 的应用&#xff1f;答案就在问题里&#xff0c;那就是用 GPT 来开发基于 GPT 的应用。本文以笔者的一个开源项目 myGPTReader 为例&#xff0c;分享我是如何基于 GPT 去开发这个系统的&#xff0c;这个系统的功能…

【Django】网上蛋糕项目商城-关键字搜索,商品详情功能

概念 上文中已经实现热销和新品的商品列表功能&#xff0c;本文篇幅中实现关键字搜索商品&#xff0c;将商品加入购物车&#xff0c;以及查看商品的详情信息等功能 关键字搜索实现步骤 在head.html头部页面中&#xff0c;鼠标移动至搜索图标会显示隐藏的搜索框进行输入关键信…

吉利银河L6(官方小订送的3M) 对比 威固vk70+ks15

吉利送的号称价值2000的3M效果 撕膜重贴 威固vk70ks15 之后的效果 // 忘记测反射的热量了 可以验证金属膜是反射热而不是吸热 金属膜 手机GPS还能用吗 亲测 能用 太阳能总阻隔率 3M貌似20%出头 威固前档55% 侧后挡高一点不超过60% 夏天真实太阳发热能量 即阻隔率55%到60% …

使用Visual Studio Code记笔记

因为学习需要&#xff0c;记笔记是很有必要的&#xff0c;平常发CSDN&#xff08;都让CSDN是很棒的哈&#xff09;&#xff0c;后来使用VS Code的时候发现了很多插件&#xff0c;觉得做笔记还是相对不错的&#xff0c;主要用到的还是Markdown 主要设计的插件包括&#xff1a; …

PL/SQL入门到实践

一、什么是PL/SQL PL/SQL是Procedural Language/Structured Query Language的缩写。PL/SQL是一种过程化编程语言&#xff0c;运行于服务器端的编程语言。PL/SQL是对SQL语言的扩展。PL/SQL结合了SQL语句和过程性编程语言的特性&#xff0c;可以用于编写存储过程、触发器、函数等…

Hallo:分级音频驱动视觉合成肖像动画

团队&#xff1a;百度&#xff08;王井东大佬&#xff09;&#xff0c;复旦&#xff0c;瑞士ETH&#xff0c;南大 文章目录 概要介绍相关工作整体架构流程技术名词解释层次音频驱动的视觉合成训练和推理训练实验设置讨论社会风险和缓解措施小结 概要 肖像图像动画领域&#x…

SQL面试题练习 —— 截止目前登陆用户数及登陆用户列表

目录 1 题目2 建表语句3 题解 题目来源&#xff1a;滴滴 1 题目 已知有用户登录记录表包含登录日期和登录用户ID&#xff0c;请查询出截止到当前日期累积登录用户数及登陆用户列表。 样例数据 ----------------------- | log_date | user_id | ----------------------- |…

如何修改PDF文档的作者名称?

要修改一个 PDF 文档的作者名称&#xff0c;你可以按照以下步骤进行操作&#xff1a; 1. **使用 Adobe Acrobat**&#xff08;如果有&#xff09;&#xff1a; - Adobe Acrobat 是一个功能强大的 PDF 编辑工具&#xff0c;支持修改文档属性信息&#xff0c;包括作者名称。打开…

一个用于自动复制文本的小工具:Auto_Copy

自动复制工具 这是一个在 Windows 上用于自动复制选中文本到剪贴板的小工具。该工具还允许通过右键单击粘贴剪贴板内容。 灵感来源: 在使用Mobaxterm时,我注意到其软件中具备选中即自动复制和右键直接粘贴的功能。但是,这种选中自动复制的功能仅在软件内部有效。由于这一功能…

什么是无头浏览器?

简而言之&#xff0c;无头浏览器是没有图形用户界面 &#xff08;GUI&#xff09; 的 Web 浏览器。GUI 包括用户与之交互的数字元素&#xff0c;例如按钮、图标和窗口。但是&#xff0c;关于无头浏览器&#xff0c;您需要了解的还有很多。 在本文中&#xff0c;您将了解什么是…

Go语言环境安装 第一个Go程序

Go下载地址 哪个能用用哪个。 https://go.dev/ https://golang.google.cn/&#xff08;Golang官网的官方镜像&#xff09; Windows 使用.msi安装包安装 下载msi文件 安装 双击运行go1.22.4.windows-amd64.msi Next 勾选I accept the terms in the License Agreement&…

Webpack: 持久化缓存大幅提升构建性能

概述 缓存是一种应用非常广泛性能优化技术&#xff0c;在计算机领域几乎无处不在&#xff0c;例如&#xff1a;操作系统层面 CPU 高速缓存、磁盘缓存&#xff0c;网路世界中的 DNS 缓存、HTTP 缓存&#xff0c;以及业务应用中的数据库缓存、分布式缓存等等。 那自然而然的&am…

AI与Python共舞:如何利用深度学习优化推荐系统?(2)

推荐系统的前世今生 推荐系统的历史可以追溯到20世纪90年代&#xff0c;从最初的基于内容过滤和协同过滤&#xff0c;到现在融合了机器学习甚至是深度学习的混合型推荐&#xff0c;其目标始终如一&#xff1a;更精准、更个性化地为用户推荐内容。随着Python的普及&#xff0c;…

路径规划 | 基于蜣螂优化算法的栅格地图机器人路径规划(Matlab)

目录 效果一览基本介绍程序设计参考文献 效果一览 基本介绍 路径规划 | 基于蜣螂优化算法的栅格地图机器人路径规划&#xff08;Matlab&#xff09; 1.利用蜣螂算法DBO优化栅格地图机器人路径规划&#xff0c;效果如图所示&#xff0c;包括迭代曲线图、栅格地图等等&#xff5e…

ubuntu修改磁盘挂载目录名

参考博客&#xff1a;https://blog.csdn.net/baocheng1899/article/details/101536489 查看目录挂载情况&#xff1a; df -h输出&#xff1a; Filesystem Size Used Avail Use% Mounted on /dev/sdc1 43T 1.5T 40T 4% /data此时想要将挂载目录名从/data修…

fastapi通过APIRouter封装子路由

参考官方文档&#xff1a;https://fastapi.tiangolo.com/zh/tutorial/bigger-applications/ 基本示例 from fastapi import APIRouterrouter APIRouter()router.get("/users/", tags["users"]) async def read_users():return [{"username": …

VScode配置

1.设置鼠标悬停提示 1.1 问题描述 打开vscode&#xff0c;按住ctrl鼠标左键不能跳转定义&#xff08;右键没有go to definition&#xff09; 1.2 解决办法 打开设置界面&#xff1a;文件->首选项->设置在搜索框中搜索intelli Sense Engine &#xff08;需要先安装C/C…