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内容如下: [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电阻篇笔记
电阻有标定值和实际值,关于误差的问题: 精密的电流、电压采样可能会用到1%的精度。如果只是做限流用途的话,用5%就足够。 电阻功率:标定值、额定值、瞬态值: 标定值由封装所决定,例如5W额定值由电路中平…...
探索Golang的微观世界:用net/trace包追踪网络操作
标题:探索Golang的微观世界:用net/trace包追踪网络操作 在Go语言的丰富生态系统中,net/trace包是一个强大的工具,它允许开发者深入网络请求的微观世界,洞察每一次数据的流动和操作的执行。本文将详细探讨如何使用net/…...
Unity开发抖音小游戏广告部分接入
Unity开发抖音小游戏广告部分接入 介绍环境确保开通流量主获取广告位广告部分代码测试如下总结 介绍 最近在使用Unity做抖音小游戏这块的内容,因为要接入广告,所以这里我把我接入广告的部分代码和经验分享一下。 环境确保 根据抖音官方的文档我们是先…...
World of Warcraft [CLASSIC] 80 WLK [Gundrak] BUG
World of Warcraft [CLASSIC] 80 WLK [Gundrak] BUG 魔兽世界怀旧版,80级,5人副本古达克,科技队伍(BUG队伍) 副本有两个门口 这样看,是不是觉得很怪。是的,和图1刚好相反的。 因此应该翻转180…...
极狐GitLab 密钥推送保护如何保护密钥信息被泄露?
极狐GitLab 是 GitLab 在中国的发行版,专门面向中国程序员和企业提供企业级一体化 DevOps 平台,用来帮助用户实现需求管理、源代码托管、CI/CD、安全合规,而且所有的操作都是在一个平台上进行,省事省心省钱。可以一键安装极狐GitL…...
Qt+TSC打印机调试
前言 最近被TSC打印机整的死去活来,记录一下使用方法。 一、环境 Qt5.15.2 mingw tsc TE244 二、使用步骤 1.引入库 从官网下载windows C SDK,引入库,以下是.pro文件 QT core gui printsupportgreaterThan(QT_MAJOR_VERSION, 4)…...
QT 添加程序图标
1. 使用免费网站将其他图片格式转化成ico格式 Ico转换器 : https://cn.free-converter.com/ico-converter 2.qmake项目添加程序图标 在.pro文件内添加语句,如下图 RC_ICONS favicon.ico2.1 程序图标文件添加到项目目录内 2.2 通过windeployqt xxx.exe构建生成的…...
数据结构与算法 - 贪心算法
一、贪心例子 贪心算法或贪婪算法的核心思想是: 1. 将寻找最优解的问题分为若干个步骤 2. 每一步骤都采用贪心原则,选取当前最优解 3. 因为没有考虑所有可能,局部最优的堆叠不一定让最终解最优 贪心算法是一种在每一步选择中都采取在当前…...
sed 一点点记忆
sed用法实例1(我用的最多,超级无敌的用法) 格式:/ # b 可以换成你想要的字符 sed -i //s/// 文本文件 sed -i ##s### 文本文件 sed -i bbsbbb 文本文件描述 通过正则表达式过滤你想要的行,替换该行的内容 1、s前面用…...
PyTorch--卷积神经网络(CNN)模型实现手写数字识别
文章目录 前言完整代码代码解析1. 导入必要的库2. 设备配置3. 超参数设置4. 加载MNIST数据集5. 创建数据加载器6. 定义卷积神经网络模型7. 实例化模型并移动到设备8. 定义损失函数和优化器9. 训练模型10. 测试模型11. 保存模型 常用函数解析小改进数据集部分可视化训练过程可视…...
前端程序员回忆工作第1年的记录总结(一)
更多详情:爱米的前端小笔记(csdn~xitujuejin~zhiHu~Baidu~小红shu)同步更新,等你来看!都是利用下班时间整理的,整理不易,大家多多👍💛➕🤔哦!你们…...
SQL Server端口设置完整详细步骤
大家好,我是程序员小羊! 前言: 前面是对SQLserver服务器一些介绍,不想了解的可直接点击目录跳入正题,谢谢!!! SQL Server 是由微软公司开发的关系数据库管理系统 (RDBMS)。它主要…...
【2024】k8s集群 图文详细 部署安装使用(两万字)
目录💻 一、前言二、下载依赖配置环境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 伪类和伪元素
也是选择器的一种,被称为伪类和伪元素。这一类选择器的数量众多,通常用于很明确的目的。 伪类 什么是伪类 伪类是选择器的一种,它用于选择处于特定状态的元素。 比如当它们是这一类型的第一个元素时(:first-child)&…...
某动一面——算法题
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中共享内存和内存区别
计算机科学中的内存与共享内存 在计算机科学中,“内存”和“共享内存”是两个不同的概念,但它们之间有着密切的关系。为了更好地理解这两个概念及其相互关系,我们可以分别解释一下: 内存 (Memory) 内存通常指的是计算机系统的主…...
JavaWeb04-MyBatis与Spring结合
目录 前言 一、MyBatis入门(MyBatis官网) 1.1 创建mybatis项目(使用spring项目整合式方法) 1.2 JDBC 1.3 数据库连接池 1.4 实用工具:Lombok 二、MyBatis基础操作 2.1 准备工作 2.2 导入项目并实现操作 2.3 具…...
Mybatis-springBoot
MyBatis 是一个流行的 Java 持久层框架,它简化了与关系型数据库的交互。通过将 SQL 语句与 Java 代码进行映射,MyBatis 提供了一种方便、灵活的方式来执行数据库操作。它支持动态SQL、缓存机制和插件扩展,使得开发人员能够更高效地编写和管理…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...
redis和redission的区别
Redis 和 Redisson 是两个密切相关但又本质不同的技术,它们扮演着完全不同的角色: Redis: 内存数据库/数据结构存储 本质: 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能: 提供丰…...
第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)
第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10pip3.10) 一:前言二:安装编译依赖二:安装Python3.10三:安装PIP3.10四:安装Paddlepaddle基础框架4.1…...
使用SSE解决获取状态不一致问题
使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...
软件工程 期末复习
瀑布模型:计划 螺旋模型:风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合:模块内部功能紧密 模块之间依赖程度小 高内聚:指的是一个模块内部的功能应该紧密相关。换句话说,一个模块应当只实现单一的功能…...
