当前位置: 首页 > 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后台验证

http://www.lryc.cn/news/424507.html

相关文章:

  • ansible playbook使用jinja2语法渲染inventory下的主机名和IP到/etc/hosts
  • 张飞硬件1~9电阻篇笔记
  • 探索Golang的微观世界:用net/trace包追踪网络操作
  • Unity开发抖音小游戏广告部分接入
  • World of Warcraft [CLASSIC] 80 WLK [Gundrak] BUG
  • 极狐GitLab 密钥推送保护如何保护密钥信息被泄露?
  • Qt+TSC打印机调试
  • QT 添加程序图标
  • 数据结构与算法 - 贪心算法
  • sed 一点点记忆
  • PyTorch--卷积神经网络(CNN)模型实现手写数字识别
  • 前端程序员回忆工作第1年的记录总结(一)
  • SQL Server端口设置完整详细步骤
  • 【2024】k8s集群 图文详细 部署安装使用(两万字)
  • CSS 伪类和伪元素
  • 某动一面——算法题
  • kubernetes中共享内存和内存区别
  • JavaWeb04-MyBatis与Spring结合
  • Mybatis-springBoot
  • 【中国数据库前世今生】数据存储管理的起源与现代数据库发展启蒙
  • 拉卡拉上半年营收29.82亿元 外卡、数字化服务提升业绩增长空间
  • 数学建模——启发式算法(蚁群算法)
  • 【Pytorch实用教程】在做模型融合时非常关键的代码:nn.Identity()详解
  • 【开源力荐】一款基于web的可视化视频剪辑工具
  • 鸿萌数据恢复服务: 如何修复 SQL Server 数据库错误 829?
  • OpenCV图像处理——按最小外接矩形剪切图像
  • 《熬夜整理》保姆级系列教程-玩转Wireshark抓包神器教程(4)-再识Wireshark
  • 调用yolov3模型进行目标检测
  • linux文件——重定向原理——dup、重定向与execl、VFS
  • 【STM32 FreeRTOS】任务