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

Jfinal与hibernate-validator实现后台表单

一. pom.xml配置

jfianl maven项目基础上增加

		<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>${hibernate-validator.version}</version></dependency><dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId><version>2.0.1.Final</version></dependency>

二.代码要求

1.根据表结构生成java Model

@Data
public class Demo {@Size(min = 0,max = 40,message = "ID长度不能超40!")public String id;@NotBlank(message = "名称不能为空!")@Size(min = 0,max = 40,message = "名称长度不能超40!")public String name;@NotBlank(message = "备注不能为空!")@Size(min = 0,max = 200,message = "备注长度不能超200!")public String remark;@TableColumn(exist = false)    //这个是自己添加的注解过滤非数据库字段public int sort;
}

2.集成重写拦截器

public class ParamValidateInterceptor  implements Interceptor {private static Validator validator = null;public ParamValidateInterceptor(){ValidatorFactory factory = Validation.buildDefaultValidatorFactory();validator = factory.getValidator();}@Overridepublic void intercept(Invocation inv) {// 获取方法参数数组Parameter[] params = inv.getMethod().getParameters();for (int i = 0; i < params.length; i++) {Parameter parameter = params[i];// 判断参数Valid valid = parameter.getAnnotation(Valid.class);if (valid == null) { continue; }Object object = inv.getArg(i);Set<ConstraintViolation<Object>> set = validator.validate(object);// 没有错误继续下一次循环if (set.isEmpty()) { continue; }// 校验错误信息返回ConstraintViolation<Object> v = set.stream().findFirst().get();AjaxResult ret = AjaxResult.error(v.getMessage());// 返回错误jsoninv.getController().renderJson(ret);return;}inv.invoke();}
}

3.controller中的保存方法保存,使用jfinal中获取参数方式

//controller中方法
public void save(@Valid Demo demo) {renderJson(demoService.save(demo));
}//抽出的Service方法public AjaxResult save(Demo demo) {Record rec = new ModelToRecord<Demo>().modelTo(Demo.class, demo);rec.remove("create");    //这里可以删除Record中无用字段String id = demo.getId();Record record = getData(id);    //查重是编辑还是新增boolean isedit = true;if (record == null) {isedit = false;record = new Record();record.set("id", IdUtil.fastUUID());record.set("create_time", DateUtils.getNowDate());}record.setColumns(rec);record.set("update_time", DateUtils.getNowDate());if (DbUtils.save("demo", "id", record, isedit)) {return success("保存成功!");} else {return error("保存失败!");}}//ModelToRecord.java
public class ModelToRecord<T> {/**** @param model 样式* @param data 数据* @return*/public Record modelTo(Class<T> model, Object data){String jsonStr = JSON.toJSONString(data);JSONObject jsonObject=JSON.parseObject(jsonStr);Field[] fields = model.getDeclaredFields();//判断处理标注字段情况TableColumn tbcolumn = model.getAnnotation(TableColumn.class);boolean exist=true;if(tbcolumn!=null){exist=tbcolumn.exist();}Record record=new Record();for (Field field:fields) {String key=field.getName();String typeName = field.getType().getTypeName();if(jsonObject.get(key)!=null){if(typeName.contains("String")){if(!jsonObject.getString(key).equals("")&&exist==true){record.set(key,jsonObject.get(key));}}else if(typeName.contains("Date")&&exist==true){record.set(key,jsonObject.getDate(key));}else{if(!jsonObject.getString(key).equals("")&&exist==true){record.set(key,jsonObject.get(key));}}}/*else{record.set(key,null);}*/}return record;}}

4.如果有特殊处理不在方法中使用@Valid去拦截参数

//单独验证 方法 ValidateUtils.java
public class ValidateUtils {/*** 校验参数** @param voObject* @return*/public static AjaxResult validateParams(Object voObject) {ValidatorFactory factory = Validation.buildDefaultValidatorFactory();Validator validator = factory.getValidator();Set<ConstraintViolation<Object>> violations = validator.validate(voObject);if (violations.size() > 0) {List<String> msgList = new ArrayList<>();for (ConstraintViolation<Object> violation : violations) {msgList.add(violation.getMessage());}return AjaxResult.error(msgList.toArray()[0].toString());} else {return null;}}/*** 分组校验参数** @param voObject* @return*/public static AjaxResult validateParams(Object voObject, Class<?>... groupClass) {ValidatorFactory factory = Validation.buildDefaultValidatorFactory();Validator validator = factory.getValidator();Set<ConstraintViolation<Object>> violations = validator.validate(voObject, groupClass);if (violations.size() > 0) {List<String> msgList = new ArrayList<>();for (ConstraintViolation<Object> violation : violations) {msgList.add(violation.getMessage());}return AjaxResult.error(msgList.toArray()[0].toString());} else {return null;}}
}//独立使用验证,这个基本是在上传附件上应用,也是在controller中的保存
public void save() {UploadFile file=getFile("file");//这里上传附件 enctype="multipart/form-data"// 无法ParamValidateInterceptor直接进行参数拦截验证,// 只能单独获取参数进行验证数据Demo data = getBean(Demo.class);    //jfinal 使用getBean获取java ModelString img="";if(file!=null){Record recordFile = UploadFileService.uploadFile(getResponse(),getRequest(),file,"demo");    //自己的上传附件类img=recordFile.getStr("furl");data.setImg_src(img);}AjaxResult ajaxResult= ValidateUtils.validateParams(data);  //验证数据if(ajaxResult==null){renderJson(demoService.save(data));}else{renderJson(ajaxResult);}}

前端参数

<!-- form中的name值需要处理,参照jfianl官网 -->
<div class="form-group"><label class="col-sm-2 control-label is-required">名称:</label><div class="col-sm-4"><input name="demo.name" class="form-control" type="text"required></div><label class="col-sm-2 control-label is-required">备注:</label><div class="col-sm-4"><input name="demo.remark" class="form-control" type="text"required></div></div>

这样就可以实现jfianl+hibernate-validator后台验证

相关文章:

Jfinal与hibernate-validator实现后台表单

一. pom.xml配置 jfianl maven项目基础上增加 <dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>${hibernate-validator.version}</version></dependency><dependency…...

ansible playbook使用jinja2语法渲染inventory下的主机名和IP到/etc/hosts

1. ansible inventory 下面的 hosts内容如下&#xff1a; [all_host] app1 ansible_host10.2.162.147 app2 ansible_host10.2.162.148 app3 ansible_host10.2.162.149 app4 ansible_host10.2.162.150 app5 ansible_host10.2.162.151[nginx] app12. hosts.j2内容如下 127.0.0…...

张飞硬件1~9电阻篇笔记

电阻有标定值和实际值&#xff0c;关于误差的问题&#xff1a; 精密的电流、电压采样可能会用到1%的精度。如果只是做限流用途的话&#xff0c;用5%就足够。 电阻功率&#xff1a;标定值、额定值、瞬态值&#xff1a; 标定值由封装所决定&#xff0c;例如5W额定值由电路中平…...

探索Golang的微观世界:用net/trace包追踪网络操作

标题&#xff1a;探索Golang的微观世界&#xff1a;用net/trace包追踪网络操作 在Go语言的丰富生态系统中&#xff0c;net/trace包是一个强大的工具&#xff0c;它允许开发者深入网络请求的微观世界&#xff0c;洞察每一次数据的流动和操作的执行。本文将详细探讨如何使用net/…...

Unity开发抖音小游戏广告部分接入

Unity开发抖音小游戏广告部分接入 介绍环境确保开通流量主获取广告位广告部分代码测试如下总结 介绍 最近在使用Unity做抖音小游戏这块的内容&#xff0c;因为要接入广告&#xff0c;所以这里我把我接入广告的部分代码和经验分享一下。 环境确保 根据抖音官方的文档我们是先…...

World of Warcraft [CLASSIC] 80 WLK [Gundrak] BUG

World of Warcraft [CLASSIC] 80 WLK [Gundrak] BUG 魔兽世界怀旧版&#xff0c;80级&#xff0c;5人副本古达克&#xff0c;科技队伍&#xff08;BUG队伍&#xff09; 副本有两个门口 这样看&#xff0c;是不是觉得很怪。是的&#xff0c;和图1刚好相反的。 因此应该翻转180…...

极狐GitLab 密钥推送保护如何保护密钥信息被泄露?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门面向中国程序员和企业提供企业级一体化 DevOps 平台&#xff0c;用来帮助用户实现需求管理、源代码托管、CI/CD、安全合规&#xff0c;而且所有的操作都是在一个平台上进行&#xff0c;省事省心省钱。可以一键安装极狐GitL…...

Qt+TSC打印机调试

前言 最近被TSC打印机整的死去活来&#xff0c;记录一下使用方法。 一、环境 Qt5.15.2 mingw tsc TE244 二、使用步骤 1.引入库 从官网下载windows C SDK&#xff0c;引入库&#xff0c;以下是.pro文件 QT core gui printsupportgreaterThan(QT_MAJOR_VERSION, 4)…...

QT 添加程序图标

1. 使用免费网站将其他图片格式转化成ico格式 Ico转换器 &#xff1a; https://cn.free-converter.com/ico-converter 2.qmake项目添加程序图标 在.pro文件内添加语句,如下图 RC_ICONS favicon.ico2.1 程序图标文件添加到项目目录内 2.2 通过windeployqt xxx.exe构建生成的…...

数据结构与算法 - 贪心算法

一、贪心例子 贪心算法或贪婪算法的核心思想是&#xff1a; 1. 将寻找最优解的问题分为若干个步骤 2. 每一步骤都采用贪心原则&#xff0c;选取当前最优解 3. 因为没有考虑所有可能&#xff0c;局部最优的堆叠不一定让最终解最优 贪心算法是一种在每一步选择中都采取在当前…...

sed 一点点记忆

sed用法实例1&#xff08;我用的最多&#xff0c;超级无敌的用法&#xff09; 格式&#xff1a;/ # b 可以换成你想要的字符 sed -i //s/// 文本文件 sed -i ##s### 文本文件 sed -i bbsbbb 文本文件描述 通过正则表达式过滤你想要的行&#xff0c;替换该行的内容 1、s前面用…...

PyTorch--卷积神经网络(CNN)模型实现手写数字识别

文章目录 前言完整代码代码解析1. 导入必要的库2. 设备配置3. 超参数设置4. 加载MNIST数据集5. 创建数据加载器6. 定义卷积神经网络模型7. 实例化模型并移动到设备8. 定义损失函数和优化器9. 训练模型10. 测试模型11. 保存模型 常用函数解析小改进数据集部分可视化训练过程可视…...

前端程序员回忆工作第1年的记录总结(一)

更多详情&#xff1a;爱米的前端小笔记&#xff08;csdn~xitujuejin~zhiHu~Baidu~小红shu&#xff09;同步更新&#xff0c;等你来看&#xff01;都是利用下班时间整理的&#xff0c;整理不易&#xff0c;大家多多&#x1f44d;&#x1f49b;➕&#x1f914;哦&#xff01;你们…...

SQL Server端口设置完整详细步骤

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; 前面是对SQLserver服务器一些介绍&#xff0c;不想了解的可直接点击目录跳入正题&#xff0c;谢谢&#xff01;&#xff01;&#xff01; SQL Server 是由微软公司开发的关系数据库管理系统 (RDBMS)。它主要…...

【2024】k8s集群 图文详细 部署安装使用(两万字)

目录&#x1f4bb; 一、前言二、下载依赖配置环境1、配置系统环境1.1、配置桥接网络1.1.1、parallels desktop配置1.1.2、VMware配置 1.2、配置root用户登陆 2、环境配置安装下载2.1、安装ipset和ipvsadm2.2、关闭SWAP分区 3、配置Containerd容器3.1、下载安装Containerd3.2、创…...

CSS 伪类和伪元素

也是选择器的一种&#xff0c;被称为伪类和伪元素。这一类选择器的数量众多&#xff0c;通常用于很明确的目的。 伪类 什么是伪类 伪类是选择器的一种&#xff0c;它用于选择处于特定状态的元素。 比如当它们是这一类型的第一个元素时&#xff08;:first-child&#xff09;&…...

某动一面——算法题

function restoreIpAddresses(s) {const result = [];function backtrack(start, path) {// 如果剩余的字符数不符合IP地址的要求,则剪枝if (s.length - start > (4 - path.length) * 3) return;if (s.length - start < (4 - path.length)) return;// 当找到了四段IP地址…...

kubernetes中共享内存和内存区别

计算机科学中的内存与共享内存 在计算机科学中&#xff0c;“内存”和“共享内存”是两个不同的概念&#xff0c;但它们之间有着密切的关系。为了更好地理解这两个概念及其相互关系&#xff0c;我们可以分别解释一下&#xff1a; 内存 (Memory) 内存通常指的是计算机系统的主…...

JavaWeb04-MyBatis与Spring结合

目录 前言 一、MyBatis入门&#xff08;MyBatis官网&#xff09; 1.1 创建mybatis项目&#xff08;使用spring项目整合式方法&#xff09; 1.2 JDBC 1.3 数据库连接池 1.4 实用工具&#xff1a;Lombok 二、MyBatis基础操作 2.1 准备工作 2.2 导入项目并实现操作 2.3 具…...

Mybatis-springBoot

MyBatis 是一个流行的 Java 持久层框架&#xff0c;它简化了与关系型数据库的交互。通过将 SQL 语句与 Java 代码进行映射&#xff0c;MyBatis 提供了一种方便、灵活的方式来执行数据库操作。它支持动态SQL、缓存机制和插件扩展&#xff0c;使得开发人员能够更高效地编写和管理…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...