SpringMVC后台控制端校验-表单验证深度分析与实战优化
前言
在实战开发中,数据校验也是十分重要的环节之一,数据校验大体分为三部分:
- 前端校验
- 后端校验
- 数据库校验
本文讲解如何在后端控制端进行表单校验的工作
案例实现
在进行项目开发的时候,前端(jquery-validate),后端,数据库都要进行相关的数据校验,springmvc也支持校验,但是没有进行具体的实现,所以要添加hibernate的依赖来完成校验
第一步:添加依赖
pom.xml
<dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId><version>1.1.0.Final</version>
</dependency><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>5.1.3.Final</version>
</dependency>
第二步:创建表单提交页面和实体类
实体类Transaction
在相关的实体类中,根据需要加入校验规则,它支持email,日期等内置校验规则
public class Transaction {// 产品编号@NotNull // 不能为空private Long productId;// 用户编号@NotNull // 不能为空private Long userId;// 交易日期@Future // 只能是将来的日期@DateTimeFormat(pattern = "yyyy-MM-dd") // 日期格式化转换@NotNull // 不能为空private Date date;// 价格@NotNull // 不能为空@DecimalMin(value = "0.1") // 最小值0.1元private Double price;// 数量@Min(1) // 最小值为1@Max(100) // 最大值@NotNull // 不能为空private Integer quantity;// 交易金额@NotNull // 不能为空@DecimalMax("500000.00") // 最大金额为5万元@DecimalMin("1.00") // 最小交易金额1元private Double amount;// 邮件@Pattern(// 正则式regexp = "^([a-zA-Z0-9]*[-_]?[a-zA-Z0-9]+)*@"+ "([a-zA-Z0-9]*[-_]?[a-zA-Z0-9]+)+[\\.][A-Za-z]{2,3}([\\.][A-Za-z]{2})?$",// 自定义消息提示message = "不符合邮件格式")private String email;// 备注@Size(min = 0, max = 256) // 0到255个字符private String note;public Long getProductId() {return productId;}public void setProductId(Long productId) {this.productId = productId;}public Long getUserId() {return userId;}public void setUserId(Long userId) {this.userId = userId;}public Date getDate() {return date;}public void setDate(Date date) {this.date = date;}public Double getPrice() {return price;}public void setPrice(Double price) {this.price = price;}public Integer getQuantity() {return quantity;}public void setQuantity(Integer quantity) {this.quantity = quantity;}public Double getAmount() {return amount;}public void setAmount(Double amount) {this.amount = amount;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public String getNote() {return note;}public void setNote(String note) {this.note = note;}}
JSP页面validate.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>validate</title></head><body><form action = "/validate/vali.do"><!-- <form action = "./validate/validator.do">--><table><tr><td>产品编号:</td><td><input name="productId" id="productId"/></td></tr><tr><td>用户编号:</td><td><input name="userId" id="userId"/></td></tr><tr><td>交易日期:</td><td><input name="date" id="date"/></td></tr><tr><td>价格:</td><td><input name="price" id="price"/></td></tr><tr><td>数量:</td><td><input name="quantity" id="quantity"/> </td></tr><tr><td>交易金额:</td><td><input name="amount" id="amount"/></td></tr><tr><td>用户邮件:</td><td><input name="email" id="email"/></td></tr><tr><td>备注:</td><td><textarea id="note" name="note" cols="20" rows="5"></textarea></td></tr><tr><td colspan="2" align="right"> <input type="submit" value="提交"/> </tr></table><form></body>
</html>
第三步:编写校验器
TransactionValidator
package com.csx.validate;import com.csx.entity.Transaction;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;public class TransactionValidator implements Validator {//表示判断是否是指定被校验的类,如例子当中的Transaction,如果是,会返回true,继续进行校验@Overridepublic boolean supports(Class<?> aClass) {//如果是Transaction类,返回true,进行验证return Transaction.class.equals(aClass);}//编写校验规则@Overridepublic void validate(Object obj, Errors errors) {Transaction tran = (Transaction) obj;//求总金额和单价及数量的差额double dis = tran.getAmount() - (tran.getQuantity() * tran.getPrice());if (Math.abs(dis) > 0.01) {errors.rejectValue("amount",null,"交易金额有误,请检查");}}
}
第四步:编写控制层
TransactionController
@RequestMapping("/validate")
@Controller
public class TransactionController {@RequestMapping("/vali")public ModelAndView addTran(@Valid Transaction tran, Errors errors) {//判断是否有校验错误信息if (errors.hasErrors()) {List<FieldError> list = errors.getFieldErrors();for (FieldError f : list) {System.out.println("error Filed:" + f.getField() + ",errorMsg:" + f.getDefaultMessage());}}return new ModelAndView("index");}//为当前控制器开启验证@InitBinderpublic void initBinder(DataBinder binder) {binder.setValidator(new TransactionValidator());}}
- 使用hasErrors判断是否有校验错误
- 如果有,使用getFieldErrors()获取错误集合,
- 使用getField()获取错误字段,
- 使用getDefaultMessage获取错误信息
- 如果违反了定义的校验规则,则会报错
测试
表单提交页面

故意将日期和交易金额填写错误,并提交
后台控制台显示数据错误提示
- 箭头指向的第一个,是date,即日期格式错误
- 箭头指向的第二个,表示交易金额错误,为我们自定义的提示信息

总结
数据校验在实际开发中很重要,而仅仅做了前端校验,还是不安全的,因此我们还可以进行后台的数据校验。
相关文章:
SpringMVC后台控制端校验-表单验证深度分析与实战优化
前言 在实战开发中,数据校验也是十分重要的环节之一,数据校验大体分为三部分: 前端校验后端校验数据库校验 本文讲解如何在后端控制端进行表单校验的工作 案例实现 在进行项目开发的时候,前端(jquery-validate),后端,数据库都要进行相关的数据…...
Codeforces Round 770 (Div. 2)
比赛链接:Dashboard - Codeforces Round 770 (Div. 2) - Codeforces A. Reverse and Concatenate 题意: 思路: 假设 s "abba" 经过1次操作后 -> "abbaabba" s "abcd" 经过一次操作后 -> "abcd…...
ProteinMPNN中蛋白质特征提取
函数 featurize 的主要作用是将一批蛋白质序列和结构信息转化为深度学习模型可以接受的特征矩阵。它在处理蛋白质多链结构(即多个链的蛋白质复合体)时,考虑了可见链和被掩码链的区分。 代码: import torch import numpy as np import csv import time import os import r…...
Word中如何删除表格下一页的空白页
Reference: [1] Word空白页怎么都删除不掉?用这6个方法随便删! - 知乎 (zhihu.com)...
RabbitMQ 如何保证消息不丢失?
为了保证消息在 RabbitMQ 中不丢失,必须从生产者、Exchange 路由、Broker 和消费者等多个方面采取有效措施。RabbitMQ 消息丢失的场景主要分为以下三种情况:生产者端、路由过程以及消费者端。 一、RabbitMQ 消息丢失的三种情况 在讨论如何保证消息不丢…...
Oracle或者PL/SQL导入pde文件
目录 pde文件使用pl/sql developer的 tools-> import tables-> pl/sql developer来导入;...
【QAMISRA】解决导入commands.json时报错问题
【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 解决导入commands.json时报错“Could not obtain system-wide includes and defines”的问题。 2、 问题场景 客户导入commands.json时报错“Could not obtain system-wide includes and defines”。 3、软硬件环境…...
影刀RPA实战番外:excel函数应用指南
Excel函数是用于执行特定计算、分析和数据处理任务的预定义公式。它们可处理数学计算、文本处理、逻辑判断、日期和时间运算、查找和引用数据等。例如,SUM函数可以计算一系列数字的总和,IF函数进行逻辑测试,VLOOKUP函数在表格中查找数据&…...
php生成PDF文件(FPDF)
FPDF即“Free PDF”,FPDF类库提供了基本的PDF创建功能,其源代码和使用权是免费的。 PDF格式文档优势 通用:PDF文档在UNIX和Windows系统均可正常使用。 安全:PDF文档可设置为只读模式,并且可以添加密码等保护措施。 美…...
(接口测试)day01接口测试理论 http理论 接口测试流程 接口文档解析
一.接口测试理论 1.接口和接口测试 服务器为客户端开了一个验证接口(接口本质:函数方法)客户端向服务器传送的消息可以相当于函数的参数,接口是用来让客户端传递数据的 接口:相当于开了一个通道 当服务器要给客户端响…...
Telegram——Bot 机器人/小程序入门指南
一、Bot 介绍 在 TG 中,机器人可以用于接收和发送消息、管理群组(在有权限的情况下可以封禁用户、删除消息、置顶消息等)、通过API进行编程操作、使用 Inline 查询功能在不同的聊天室中提供查询服务、创建自定义键盘按钮、发出账单并收款、接入小程序游戏等。 然而,Bot 默…...
tauri build 后界面样式失效
其中一种情况:你为了使用 convertFileSrc 来加载本地资源,按照官方文档在 tauri.conf.json 中 设置了 tauri.security.csp 为 "default-src self; img-src self asset: https://asset. Localhost",恰好你在组件中编写了一部分的内联…...
打印自然常数E
自然常数E 自然常数,符号e,为数学中一个常数,是一个无限不循环小数,且为超越数,其值约为2.718281828459045。它是自然对数函数的底数。 我们打印表达式(11/x)的x次方的值以及获取第一次大于2.718的正整数 新建C#控制…...
澳鹏干货 | 大语言模型的上下文窗口 (Context Windows)
大语言模型(LLMs)极大地提升了人工智能在理解和生成文本方面的能力。其中一个影响其效用的重要方面是“上下文窗口”(Context Windows)—— 这个概念直接影响着模型接收和生成语言的有效性。 本期澳鹏干货将深入探讨上下文窗口对…...
为什么k8s不支持docker-kubernetes
为什么Kubernetes不再支持Docker? 在Kubernetes 1.20版本之后,Kubernetes宣布逐步停止对Docker作为容器运行时的支持。这一改变在容器管理领域引起了广泛关注。许多人不禁疑惑:Kubernetes与Docker一向密切合作,为何会做出这样的决…...
数据结构编程实践20讲(Python版)—17散列
本文目录 17 散列(Hashing)S1 说明特点应用领域S2 示例:字符串哈希S2 示例:文件、图片哈希S3 应用1:食品安全追溯S4 应用2:在线内容版权保护S5 应用3:社交媒体内容审核往期链接 01 数组02 链表03 栈04 队列05 二叉树06 二叉搜索树07 AVL树08 红黑树09 B树10 B+树11 线段…...
看了大厂用AI审简历,我才发现社会的残酷真相!今年的秋招太可怕了
太可怕了!今年秋招,大厂竟然引进黑科技—— AI 面试、AI 智能分析简历, 这让打工人以后咋敢写精通 Office 三件套,就怕被 AI 一眼识破 劝你现在掌握 AI 技能,真的不是说说而已! 微软的最新职场 AI 统计数…...
京东大模型革命电商搜推技术:挑战、实践与未来趋势
大模型对搜推技术产生了深远的影响,极大地推动了搜推技术的演进趋势,使得搜推更加的智能化和个性化,然而在搜推中引入大模型时同样面临一系列的挑战,例如商品知识的幻觉,复杂查询的理解,个性化商品推荐&…...
深入学习二叉树(BinaryTree)(纯小白进)
目录: 一、 前言二、 正文2.1、 树的概念2.1.1、 树的结构2.1.2、 树的小知识 2.2、 认识二叉树2.2.1、 二叉树的概念2.2.2、 特殊的二叉树 2.3、 实现二叉树2.3.1、 结构2.3.2、 节点数2.3.3、 树深度2.3.4、 前、中、后序遍历 销毁2.3.4.1、 前序遍历2.3.4.2、 中…...
诗风秦韵诗词学习画廊宣言
诗风秦韵诗词学习画廊宣言 弘扬传统传承文明,奋斗路上不断前进,青春不朽梦想扬帆,华夏赞歌我心飞扬...
ZXing条形码扫描库终极指南:如何实现自定义字体加载与多语言支持
ZXing条形码扫描库终极指南:如何实现自定义字体加载与多语言支持 【免费下载链接】zxing ZXing ("Zebra Crossing") barcode scanning library for Java, Android 项目地址: https://gitcode.com/gh_mirrors/zx/zxing ZXing("Zebr…...
nli-distilroberta-base零基础上手:非算法工程师也能部署的逻辑推理服务
nli-distilroberta-base零基础上手:非算法工程师也能部署的逻辑推理服务 1. 项目介绍 nli-distilroberta-base是一个基于DistilRoBERTa模型的自然语言推理(NLI)服务,专门为没有算法背景的开发者设计。它能帮你快速判断两个句子之间的逻辑关系ÿ…...
华硕笔记本终极性能调校指南:GHelper开源控制工具完全解析
华硕笔记本终极性能调校指南:GHelper开源控制工具完全解析 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops. Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar and other models 项目…...
终极桌面伴侣BongoCat:让键盘鼠标操作变得生动有趣的虚拟猫咪
终极桌面伴侣BongoCat:让键盘鼠标操作变得生动有趣的虚拟猫咪 【免费下载链接】BongoCat 让呆萌可爱的 Bongo Cat 陪伴你的键盘敲击与鼠标操作,每一次输入都充满趣味与活力! 项目地址: https://gitcode.com/gh_mirrors/bong/BongoCat …...
GTE文本向量中文模型保姆级教程:从环境搭建到API调用全流程
GTE文本向量中文模型保姆级教程:从环境搭建到API调用全流程 1. 环境准备与快速部署 1.1 系统要求与依赖安装 在开始之前,确保你的系统满足以下基本要求: 操作系统:推荐使用Ubuntu 18.04或更高版本Python版本:Pytho…...
Python金融计算效率翻倍的7个隐藏技巧:pandas加速300%、numba编译优化、向量化避坑指南
第一章:Python金融计算效率翻倍的底层逻辑与性能瓶颈诊断Python在金融量化分析中广泛应用,但其默认解释执行机制常导致大规模时间序列回测、蒙特卡洛模拟或协方差矩阵运算时出现显著延迟。效率瓶颈并非源于算法本身,而集中于CPython解释器的G…...
Clawdbot+Python爬虫实战:自动化数据采集与智能分析
ClawdbotPython爬虫实战:自动化数据采集与智能分析 1. 为什么数据采集需要Clawdbot这样的智能体 你有没有遇到过这样的场景:市场部同事凌晨三点发来消息,“老板急要竞品价格数据,明早九点前要出分析报告”。你打开浏览器&#x…...
探索照片转3D模型:用Meshroom实现7步从2D到3D的蜕变
探索照片转3D模型:用Meshroom实现7步从2D到3D的蜕变 【免费下载链接】Meshroom 3D Reconstruction Software 项目地址: https://gitcode.com/gh_mirrors/me/Meshroom 定位3D重建价值:打破技术壁垒的开源方案 在数字创作领域,3D模型一…...
保姆级教程:用Halcon的cooc_feature_image算子搞定LCD屏幕缺陷检测(附完整代码)
工业级LCD屏幕缺陷检测实战:Halcon纹理特征分析与优化策略 在液晶显示屏(LCD)制造过程中,微米级的缺陷可能导致产品报废。传统人工检测不仅效率低下,且漏检率高达15%-30%。Halcon的cooc_feature_image算子通过灰度共生…...
计算机毕业设计:懂车帝车质网汽车数据分析平台 Django框架 Scrapy爬虫 可视化 车辆 懂车帝大数据 数据分析 机器学习(建议收藏)✅
博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久,选择我们就是选择放心、选择安心毕业✌ > 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与…...

