SSM项目如何记录用户的操作日志?
- 创建记录变化的对照实体Bean,Comparison.java。
public class Comparison {
//字段名称
private String Field;
//字段旧值
private Object before;
//字段新值
private Object after;
/**
* @return the field
*/
public String getField() {
return Field;
}
/**
* @param field the field to set
*/
public void setField(String field) {
Field = field;
}
/**
* @return the before
*/
public Object getBefore() {
return before;
}
/**
* @param before the before to set
*/
public void setBefore(Object before) {
this.before = before;
}
/**
* @return the after
*/
public Object getAfter() {
return after;
}
/**
* @param after the after to set
*/
public void setAfter(Object after) {
this.after = after;
}
}
- 创建工具类/对象比较类 CompareObjUtil.java
public class CompareObjUtil {
public static List<Comparison> compareObj(Object beforeObj,Object afterObj) throws Exception{
List<Comparison> differents = new ArrayList<Comparison>();
if(beforeObj == null) throw new Exception("原对象不能为空");
if(afterObj == null) throw new Exception("新对象不能为空");
if(!beforeObj.getClass().isAssignableFrom(afterObj.getClass())){
throw new Exception("两个对象不相同,无法比较");
}
//取出属性
Field[] beforeFields = beforeObj.getClass().getDeclaredFields();
Field[] afterFields = afterObj.getClass().getDeclaredFields();
Field.setAccessible(beforeFields, true);
Field.setAccessible(afterFields, true);
//遍历取出差异值
if(beforeFields != null && beforeFields.length > 0){
for(int i=0; i<beforeFields.length; i++){
Object beforeValue = beforeFields[i].get(beforeObj);
Object afterValue = afterFields[i].get(afterObj);
if((beforeValue != null && !"".equals(beforeValue) && !beforeValue.equals(afterValue)) || ((beforeValue == null || "".equals(beforeValue)) && afterValue != null)){
Comparison comparison = new Comparison();
comparison.setField(beforeFields[i].getName());
comparison.setBefore(beforeValue);
comparison.setAfter(afterValue);
differents.add(comparison);
}
}
}
return differents;
}
}
调用方法:创建对象比较类 CompareObjUti,调用方法compareObj即可。
//记录更新字段和字段值
List<Comparison> differents = new ArrayList<Comparison>();
try {
//调用比较新旧对象的工具
differents = CompareObjUtil.compareObj(devOld, devNew);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
devOld, devNew是同一种对象类型,包含不同的属性值。differents 是一个Comparison对象类型的List集合,记录每个属性值的变化。你可以把这些属性值存入日志数据表中。
测试结果: