当前位置: 首页 > news >正文

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());}}
  1. 使用hasErrors判断是否有校验错误
  2. 如果有,使用getFieldErrors()获取错误集合,
  3. 使用getField()获取错误字段,
  4. 使用getDefaultMessage获取错误信息
  5. 如果违反了定义的校验规则,则会报错

 测试

表单提交页面

故意将日期和交易金额填写错误,并提交

后台控制台显示数据错误提示

  • 箭头指向的第一个,是date,即日期格式错误
  • 箭头指向的第二个,表示交易金额错误,为我们自定义的提示信息 

总结

数据校验在实际开发中很重要,而仅仅做了前端校验,还是不安全的,因此我们还可以进行后台的数据校验。

相关文章:

SpringMVC后台控制端校验-表单验证深度分析与实战优化

前言 在实战开发中&#xff0c;数据校验也是十分重要的环节之一&#xff0c;数据校验大体分为三部分&#xff1a; 前端校验后端校验数据库校验 本文讲解如何在后端控制端进行表单校验的工作 案例实现 在进行项目开发的时候,前端(jquery-validate),后端,数据库都要进行相关的数据…...

Codeforces Round 770 (Div. 2)

比赛链接&#xff1a;Dashboard - Codeforces Round 770 (Div. 2) - Codeforces A. Reverse and Concatenate 题意&#xff1a; 思路&#xff1a; 假设 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&#xff1a; [1] Word空白页怎么都删除不掉&#xff1f;用这6个方法随便删&#xff01; - 知乎 (zhihu.com)...

RabbitMQ 如何保证消息不丢失?

为了保证消息在 RabbitMQ 中不丢失&#xff0c;必须从生产者、Exchange 路由、Broker 和消费者等多个方面采取有效措施。RabbitMQ 消息丢失的场景主要分为以下三种情况&#xff1a;生产者端、路由过程以及消费者端。 一、RabbitMQ 消息丢失的三种情况 在讨论如何保证消息不丢…...

Oracle或者PL/SQL导入pde文件

目录 pde文件使用pl/sql developer的 tools-> import tables-> pl/sql developer来导入&#xff1b;...

【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函数是用于执行特定计算、分析和数据处理任务的预定义公式。它们可处理数学计算、文本处理、逻辑判断、日期和时间运算、查找和引用数据等。例如&#xff0c;SUM函数可以计算一系列数字的总和&#xff0c;IF函数进行逻辑测试&#xff0c;VLOOKUP函数在表格中查找数据&…...

php生成PDF文件(FPDF)

FPDF即“Free PDF”&#xff0c;FPDF类库提供了基本的PDF创建功能&#xff0c;其源代码和使用权是免费的。 PDF格式文档优势 通用&#xff1a;PDF文档在UNIX和Windows系统均可正常使用。 安全&#xff1a;PDF文档可设置为只读模式&#xff0c;并且可以添加密码等保护措施。 美…...

(接口测试)day01接口测试理论 http理论 接口测试流程 接口文档解析

一.接口测试理论 1.接口和接口测试 服务器为客户端开了一个验证接口&#xff08;接口本质&#xff1a;函数方法&#xff09;客户端向服务器传送的消息可以相当于函数的参数&#xff0c;接口是用来让客户端传递数据的 接口&#xff1a;相当于开了一个通道 当服务器要给客户端响…...

Telegram——Bot 机器人/小程序入门指南

一、Bot 介绍 在 TG 中,机器人可以用于接收和发送消息、管理群组(在有权限的情况下可以封禁用户、删除消息、置顶消息等)、通过API进行编程操作、使用 Inline 查询功能在不同的聊天室中提供查询服务、创建自定义键盘按钮、发出账单并收款、接入小程序游戏等。 然而,Bot 默…...

tauri build 后界面样式失效

其中一种情况&#xff1a;你为了使用 convertFileSrc 来加载本地资源&#xff0c;按照官方文档在 tauri.conf.json 中 设置了 tauri.security.csp 为 "default-src self; img-src self asset: https://asset. Localhost"&#xff0c;恰好你在组件中编写了一部分的内联…...

打印自然常数E

自然常数E 自然常数&#xff0c;符号e&#xff0c;为数学中一个常数&#xff0c;是一个无限不循环小数&#xff0c;且为超越数&#xff0c;其值约为2.718281828459045。它是自然对数函数的底数。 我们打印表达式(11/x)的x次方的值以及获取第一次大于2.718的正整数 新建C#控制…...

澳鹏干货 | 大语言模型的上下文窗口 (Context Windows)

大语言模型&#xff08;LLMs&#xff09;极大地提升了人工智能在理解和生成文本方面的能力。其中一个影响其效用的重要方面是“上下文窗口”&#xff08;Context Windows&#xff09;—— 这个概念直接影响着模型接收和生成语言的有效性。 本期澳鹏干货将深入探讨上下文窗口对…...

为什么k8s不支持docker-kubernetes

为什么Kubernetes不再支持Docker&#xff1f; 在Kubernetes 1.20版本之后&#xff0c;Kubernetes宣布逐步停止对Docker作为容器运行时的支持。这一改变在容器管理领域引起了广泛关注。许多人不禁疑惑&#xff1a;Kubernetes与Docker一向密切合作&#xff0c;为何会做出这样的决…...

数据结构编程实践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审简历,我才发现社会的残酷真相!今年的秋招太可怕了

太可怕了&#xff01;今年秋招&#xff0c;大厂竟然引进黑科技—— AI 面试、AI 智能分析简历&#xff0c; 这让打工人以后咋敢写精通 Office 三件套&#xff0c;就怕被 AI 一眼识破 劝你现在掌握 AI 技能&#xff0c;真的不是说说而已&#xff01; 微软的最新职场 AI 统计数…...

京东大模型革命电商搜推技术:挑战、实践与未来趋势

大模型对搜推技术产生了深远的影响&#xff0c;极大地推动了搜推技术的演进趋势&#xff0c;使得搜推更加的智能化和个性化&#xff0c;然而在搜推中引入大模型时同样面临一系列的挑战&#xff0c;例如商品知识的幻觉&#xff0c;复杂查询的理解&#xff0c;个性化商品推荐&…...

深入学习二叉树(BinaryTree)(纯小白进)

目录&#xff1a; 一、 前言二、 正文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、 中…...

诗风秦韵诗词学习画廊宣言

诗风秦韵诗词学习画廊宣言 弘扬传统传承文明&#xff0c;奋斗路上不断前进&#xff0c;青春不朽梦想扬帆&#xff0c;华夏赞歌我心飞扬...

百川2-13B模型微调实战:提升OpenClaw中文邮件处理准确率

百川2-13B模型微调实战&#xff1a;提升OpenClaw中文邮件处理准确率 1. 问题背景与挑战 去年在尝试用OpenClaw自动化处理公司内部邮件时&#xff0c;我发现了一个棘手的问题&#xff1a;当邮件内容涉及复杂业务术语或非标准表达时&#xff0c;基于通用大模型的OpenClaw经常出…...

保姆级教程:用Project AirSim的Python脚本,5分钟复现无人机深度图避障Demo

5分钟实战&#xff1a;用Project AirSim实现无人机深度图避障全流程指南 刚接触无人机仿真的开发者常会遇到一个困境&#xff1a;想快速验证某个算法效果&#xff0c;却被复杂的配置和代码绊住脚步。本文将带你用Project AirSim提供的Python脚本&#xff0c;在5分钟内跑通完整的…...

LLVM指令调度实战:如何用llvm-mca优化AArch64代码性能(附TSV110配置示例)

LLVM指令调度实战&#xff1a;如何用llvm-mca优化AArch64代码性能&#xff08;附TSV110配置示例&#xff09; 在ARM架构的性能优化领域&#xff0c;指令调度质量直接影响着关键计算任务的吞吐量。本文将带您深入llvm-mca工具链的实际应用&#xff0c;通过TSV110处理器的具体案例…...

Web3j区块链开发实战:Java开发者的以太坊交互指南

Web3j区块链开发实战&#xff1a;Java开发者的以太坊交互指南 【免费下载链接】web3j Lightweight Java and Android library for integration with Ethereum clients 项目地址: https://gitcode.com/gh_mirrors/we/web3j 1. 核心价值解析&#xff1a;Web3j为何成为Java…...

MSE、MAE、Binary/Categorical Cross-Entropy、HingeLoss五种损失函数的典型应用场景

目录第一类&#xff1a;回归任务&#xff08;预测具体数值&#xff09;&#x1f453;1. MSE (均方误差) —— 重罚离群点&#x1f453;2. MAE (平均绝对误差) —— 鲁棒性强第二类&#xff1a;分类任务&#xff08;判断属于哪一类&#xff09;&#x1f453;3. Binary Cross-Ent…...

【Android FWK】VR一体机全局菜单实战:从VirtualDisplay原理到系统级交互(上)

文章目录 一、从弹窗穿透到VR全局菜单 二、VirtualDisplay在VR中的适配原理 2.1 VR显示系统的特殊性 2.2 VR适配的核心代码 三、VR全局菜单的完整实现 3.1 系统架构设计 3.2 菜单呼出机制:手势+语音双重触发 3.3 菜单界面:适配VR的3D布局 3.4 系统交互:调节系统设置 四、VR环…...

SMUDebugTool硬件调试实战:如何通过系统管理单元实现AMD Ryzen处理器深度优化

SMUDebugTool硬件调试实战&#xff1a;如何通过系统管理单元实现AMD Ryzen处理器深度优化 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. …...

给硬件工程师的PCIe协议栈拆解:从FPGA IP核视角看三层协议如何协同工作

给硬件工程师的PCIe协议栈拆解&#xff1a;从FPGA IP核视角看三层协议如何协同工作 当你在Xilinx UltraScale或Intel Stratix 10 FPGA中集成PCIe硬核IP时&#xff0c;是否曾好奇过那个配置向导里勾选的"Enable Advanced Mode"究竟在底层做了什么&#xff1f;物理层的…...

Photoshop AI绘画革命:3分钟学会Auto-Photoshop-StableDiffusion-Plugin终极指南

Photoshop AI绘画革命&#xff1a;3分钟学会Auto-Photoshop-StableDiffusion-Plugin终极指南 【免费下载链接】Auto-Photoshop-StableDiffusion-Plugin A user-friendly plug-in that makes it easy to generate stable diffusion images inside Photoshop using either Automa…...

Keil多工程工作空间创建与管理实践

Keil系列教程14&#xff1a;创建多工程工作空间的技术实践1. 项目概述在嵌入式开发中&#xff0c;当项目复杂度增加时&#xff0c;往往需要管理多个相互关联的工程。Keil MDK-ARM开发环境提供了多工程工作空间&#xff08;Multi-Project Workspace&#xff09;功能&#xff0c;…...