现货信息学奥赛一本通+训练教程

80元

包邮

(需用券)

去购买 >

需求点

在很多场景中信息是不能轻易被修改的,修改时要么需要具备权限,要么需要审批,但是无论是哪种方式,修改前后的数据都是需要留有“案底”的,也就是说关键的信息被修改后是有修改记录的,一般修改记录会记录修改人、修改日期和修改的数据字段。

比如,修改一个人的姓名从“张三”变为了“李四”,那么在进行记录的时候,记录的信息可能如下:

姓名:(张三)=>(李四);性别:(女)=>(男);

这样就很好的体现出了修改了哪个字段,修改前后的数据分别是什么。关键的信息无论怎么修改都会有据可查,时间、人物、修改数据前后信息等。

判断被修改的数据

在页面中将数据修改并提交页面后,数据会从 JSP 传递到 Controller 中,这时数据还没有被更新到数据库中,从提交到 Controller 的对象中用数据的 id 从数据库中查出它现有的数据,然后使用现有的数据和提交的数据进行对比,就可以得到被修改过的数据字段有哪些了。

这里比较繁琐的是如何进行比对,逐个字段的使用 if 进行判断肯定不是好方法,毕竟字段太多的时候是要写死人的。那么如何进行,直接比较两个对象就行,源码我是从网上找的,好用,符合需求,源码如下:

1 /**

2 * 获取两个对象同名属性内容不相同的列表3 *@paramclass1 对象14 *@paramclass2 对象25 *@return

6 *@throwsClassNotFoundException7 *@throwsIllegalAccessException8 */

9 public static List>compareTwoClass(Object class1, Object class2) {10 List> list=new ArrayList>();11 //获取对象的class

12 Class> clazz1 =class1.getClass();13 Class> clazz2 =class2.getClass();14 //获取对象的属性列表

15 Field[] field1 =clazz1.getDeclaredFields();16 Field[] field2 =clazz2.getDeclaredFields();17 //遍历属性列表field1

18 for(int i=0;i

20 for(int j=0;j

22 if(field1[i].getName().equals(field2[j].getName())){23 if(field1[i].getName().equals(field2[j].getName())){24 field1[i].setAccessible(true);25 field2[j].setAccessible(true);26 //如果field1[i]属性值与field2[j]属性值内容不相同

27 try{28 if (!compareTwo(field1[i].get(class1), field2[j].get(class2))){29 Map map2=new HashMap();30 map2.put("name",field1[i].getName());31 map2.put("old",field1[i].get(class1));32 map2.put("new",field2[j].get(class2));33 list.add(map2);34 }35 } catch(IllegalArgumentException e) {36 //TODO Auto-generated catch block

37 e.printStackTrace();38 } catch(IllegalAccessException e) {39 //TODO Auto-generated catch block

40 e.printStackTrace();41 }42 break;43 }44 }45 }46 }47 returnlist;48 }49

50 /**

51 * 对比两个数据是否内容相同52 *53 *@paramobject1,object254 *@returnboolean类型55 */

56 public static booleancompareTwo(Object object1,Object object2){57 if ( object1 == null && object2 == null) {58 return true;59 }60 if ( object1 == null && object2 != null) {61 return false;62 }63 if( object1.equals(object2) ) {64 return true;65 }66 return false;67 }

源码是从哪里找到的忘记了,在这里感谢愿意分享的网友,是你的源码让我快速解决了项目中的问题。(当时虽然不懂 Java,但是对于类似的处理我认为一定有相应的方法,而不是傻傻的去逐个比较,后来了解到这是 Java 中的反射,发现反射与注解真是好东西,用在项目当中会省很多事,现在我写 PHP 时,虽然 PHP 不支持注解,但是我也会通过反射去解析注释的方式,实现类似 Java 中注解的功能,真的很省事。)

属性解析

上面的函数会返回两个对象中属性值不同的 List,获得该列表后,再次遍历解析属性对应的字段含义,进而拼接成一个字符串就可以生成修改日志进行保存了。

通常情况下只要把类中的属性和属性对应的中文进行关联后就可以了,但是在 JeeSite 中存在字典类型,比如“男”和“女”,在页面上会显示“男”和“女”,而在数据库中可能是以 “0” 和 “1” 进行存储的,所以一般在选择“男”或“女”后页面提交的也是 “0” 或 “1”,以这种方式进行日志记录显然不直观,因此在这种情况下就需要将字段的中文和字典名也进行关联,这样就可以将字段中文匹配到字典的值的描述。

具体代码如下:

1 public String catModifyInfo(List>list) {2 Map mapField = new HashMap() {{3 //类中的属性,属性对应的中文

4 put("sex","性别");5 }};6 Map mapDict = new HashMap() {{7 //属性对应的中文,在JeeSite中字典的描述

8 put("性别", "SEX");9 }};10

11 //构造的修改字符串

12 String modInfo = "";13

14 for ( Mapmp : list) {15 System.out.println(mp.get("name") + "---" + mp.get("old") + "---" + mp.get("new"));16 System.out.println(mapField.get(mp.get("name")));17

18 //判断修改的值是否为字典

19 if ( mapDict.containsKey(mapField.get(mp.get("name"))) ) {20 String oldValue = mp.get("old").toString();21 String newValue = mp.get("new").toString();22 String type = mapDict.get(mapField.get(mp.get("name")));23 String oldStr = DictUtils.getDictLabel(oldValue, type, "");24 String newStr = DictUtils.getDictLabel(newValue, type, "");25 System.out.println(mapField.get(mp.get("name")) + ":(" + oldStr + ") => (" + newStr + ");");26 modInfo += mapField.get(mp.get("name")) + ":(" + oldStr + ") => (" + newStr + ");";27 } else{28 modInfo += mapField.get(mp.get("name")) + ":(" + mp.get("old") + ") => (" + mp.get("new") + ");";29 }30 }31

32 returnmodInfo;33 }

函数传入的参数是两个对象差异的属性,在循环进行解析并进行字符串拼接后,就可以获得对应的日志了。

调用方法

在 JeeSite 中提交数据后,无论是修改还是新建,都会调用相关 Controller 中的 save 方法,因此上面的方法需要在 save 方法中进行调用。

相同的方法如何判断当前是新建,还是修改呢?判断的方法就是判断传入的对象中是否有 id,如果有 id 则说明是修改,如果没有 id 则说明是新建。

具体代码如下:

1 /*

2 * 如果id不为空,则表示为修改3 */

4 if( StringUtils.isNotBlank(newXxx.getId()) ) {5 Xxx oldXxx = newXxx();6 //获取原来的信息

7 oldXxx =xxxService.get(newXxx.getId());8

9 //比较修改后的信息和未修改的信息

10 List> modList =compareTwoClass(oldXxx, newXxx);11 //生成差异信息

12 String strModifyInfo =catModifyInfo(modList);13 //输出差异字符串

14 System.out.println(strModifyInfo);15

16 //把修改记录保存到日志表中17 //...

18 }

有了以上的方式就可以实现修改信息前后的日志记录了,修改后的情况如下:

不过该方式并不完美,如果修改了表字段的名称或数量,那么代码也要相应的修改,如果新添加的字段有对应的字典,那么也要添加字典对应的关联,这样就需要每次修改代码,十分的不方便了。

解决的方式很简单,使用 JeeSite 中代码生成的功能,就可以解决该问题。

我的微信公众号:“码农UP2U”

原文链接:https://www.cnblogs.com/tosser/p/11674268.html

java 11官方入门(第8版)教材

79.84元

包邮

(需用券)

去购买 >

java编辑好保存后在哪里_JeeSite|保存信息修改记录相关推荐

  1. c语言保存后怎么打开文件,保存打开文件之后,怎么也不能在显示函数中出来。。...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 抑郁了..各位指点一下.. void WritetoText(Person per[],int n) { int i=0; FILE *fp;       ...

  2. vscode php函数提醒,解决vscode格式保存后出现的问题

    修改settings.json文件配置 1.格式化后函数后空格被删问题"vetur.format.defaultFormatter.js": "vscode-typesc ...

  3. 横屏模式下,编辑手机联系人添加图片,保存后联系人头像与之前默认的图片重叠或者是有阴影在头像上

    测试步骤: 横屏模式下,编辑手机联系人添加图片,保存后联系人头像显示模糊不清晰.退出该联系人界面,再次进入的时候显示清晰,后续在横屏模式下再编辑该联系人头像都是清晰的.只有第一次的时候显示不清晰. 期 ...

  4. java 保存后中文乱码_sublime编写java程序保存编译,运行之后中文显示乱码

    sublime是常见的java编辑工具之一,在初学者使用时可以更好的熟悉每条命令,以及逻辑关系.但在编写的java程序里包含中文字符的时候,在通过cmd命令提示符编译并运行之后会出现乱码,如下图: 很 ...

  5. v-region 地址组件无法回显问题(选择地址保存后,打开编辑,发现刚才选择的地址【省市县乡】信息消失,信息不回显)

    (Avue) 1.问题 v-region 地址组件无法回显(选择地址保存后,打开编辑,发现刚才选择的地址[省市县乡]信息消失,信息不回显) 选择好省市县乡后,保存,再次编辑,发现如下: 2.解决方案: ...

  6. excel保存后编辑内容消失

    产品信息: 问题发生过程 周一:新建excel文档,建了两个sheet页,保存 周二:继续编辑excel文档,新增一个sheet页,保存 周三:编辑excel文档第一个sheet页,新增一个sheet ...

  7. word文档中找不到服务器,【在WORD文件中插入excel表格,编辑保存后重新打开word文件并双击excel时提示“找不到服务器应用程序、源文件】excel整个表格不见了...

    为什么PPT插入EXCEL表格时显示无法找到服务器应用程序 这是由于excel或者ppt只能兼容.低版本的ppt和excel是无法打版本excel插入的表格的. 解决如下: 1.新建一个文本,将后缀名 ...

  8. 关闭eslint检查2020_2020 vscode配置eslint保存后自动fix

    2020 vscode配置eslint保存后自动fix 这篇文章发布于 2019/10/12,归类于 计算机基础与开发工具 标签: vscode 保存自动fix,vscode 保存执行fix,esli ...

  9. MathType公式保存后为什么字体会变化

    在使用MathType数学公式编辑器的时候,很多的用户朋友是新手会遇到一些问题,比如,有时我们保存后却发现MathType公式字体变化了,原本的斜体变成了正体,面对这种问题我们该如何解决呢?下面就来给 ...

最新文章

  1. 只有20%的iOS程序员能看懂:详解intrinsicContentSize 及 约束优先级/content Hugging/content Compression Resistance
  2. System Center 2012 r2优点
  3. 第十七届全国大学生智能车竞赛智能视觉组培训第一弹
  4. 优化杭州某著名电子商务网站高并发千万级大型数据库经验之- 磁盘I/O性能
  5. Java设计模式详解
  6. hdu6375(2018 “百度之星”程序设计大赛 - 初赛(A))
  7. html iframe 播放视频播放,播放iframe视频点击链接javascript
  8. 【MATLAB统计分析与应用100例】案例012:matlab读取Excel数据,调用robustfit函数作稳健回归
  9. 内部时钟和外部时钟隔离的Σ-Δ调制器
  10. Python 调试工具 PDB(Linux 环境下调试)
  11. B系列台达服务器解密码步骤,台达HMI解密,DOP-A解密,DOP-B解密,文件密码解密
  12. JNI通过线程c回调java层的函数
  13. 3.4 SE55表维护生成器
  14. linux常用翻页,20150823-Linux常用命令
  15. 模型需要对特征进行归一化吗_模型融合完全手册 - 套娃的艺术:将模型作为特征进行建模...
  16. element table多选表格_【经验总结】vue + element-ui 踩坑—— table 篇
  17. Tina-TI 电路仿真 多参数交流传输特性分析 频率与相位增益的关系 选择控制对象
  18. cemtos7重置mysql root,Centos7重置MySQL8.0 root密码
  19. 2017VS2018年非工作日日期大集合
  20. 网络模型|分割模型|Vnet

热门文章

  1. 让你【愉快上(mo)班(yu)】必不可少的十个窗口快捷键
  2. 基于Python和TensorFlow的AI作曲的设计与实现
  3. mysql my.cnf 不生效_MySQL修改my.cnf配置不生效的解决方法
  4. 微信小程序之----视频上传
  5. 003 免格式化U盘部署PE(UEFI)
  6. 前端Vue项目——课程详情页面实现
  7. Coding and Paper Letter(六十)
  8. splint在linux的简单使用
  9. 联发科MTK手机线刷错误代码信息解译以及解决方法大全
  10. 每日营养摄入计算与主要的食物成分表(健身必备)