对于日志和事件的记录在每个项目中都会用到,如果在每个manager层中触发时间记录的话,会比较难以扩展和维护,所以可配置的日志和事件记录在项目中会用到!
首先在spring的配置文件中加入hibernate拦截器
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="entityInterceptor">
<ref bean="myInterceptor"/>
</property>
</bean>
<bean id="myInterceptor" class="com.creawor.cbsms.util.MyInterceptor" />
MyInterceptor拦截器为:
package com.creawor.cbsms.util;
import java.io.Serializable;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Iterator;
import javacommon.util.ApplicationContextHolder;
import org.hibernate.CallbackException;
import org.hibernate.EntityMode;
import org.hibernate.Interceptor;
import org.hibernate.Transaction;
import org.hibernate.type.Type;
import com.creawor.cbsms.event.EventRecord;
import com.creawor.cbsms.model.CbsChannel;
import com.creawor.cbsms.model.CbsMessage;
public class MyInterceptor implements Interceptor{
//删除时记录时间
public void onDelete(Object obj, Serializable arg1, Object[] arg2, String[] arg3, Type[] arg4) throws CallbackException {
// TODO Auto-generated method stub
String[] entitys = EventRecord.getDeleteEntitysFireEvent();
for (String entityName : entitys) {
if (entityName.equals(obj.getClass().getSimpleName())) {
getEventRecordMethod(entityName, obj,EventRecord.getDeleteInfo());
}
}
}
//修改时记录事件
public boolean onFlushDirty(Object obj, Serializable id, Object[] currentState, Object[] previousState , String[] propertyNames, Type[] types){
String[] entitys = EventRecord.getUpdateEntitysFireEvent();
for (String entityName : entitys) {
if (entityName.equals(obj.getClass().getSimpleName())) {
getEventRecordMethod(entityName, obj, EventRecord.getUpdateInfo());
}
}
return false;
}
public String onPrepareStatement(String arg0) {
// TODO Auto-generated method stub
return arg0;
}
//保存时记录事件
public boolean onSave(Object obj, Serializable arg1, Object[] arg2, String[] arg3, Type[] arg4) throws CallbackException {
// TODO Auto-generated method stub
String[] entitys = EventRecord.getSaveEntitysFireEvent();
for (String entityName : entitys) {
if (entityName.equals(obj.getClass().getSimpleName())) {
getEventRecordMethod(entityName, obj,EventRecord.getSaveInfo());
}
}
return false;
}
//根据反射机制执行事件记录类中相应的函数
public void getEventRecordMethod(String entityName,Object obj,String info){
try {
Class[] parameterTypes = {String.class,Class.forName(EventRecord.getPrefixPackageName()+entityName)};
Method method = EventRecord.class.getMethod(EventRecord.getPrefixMethodName()+entityName, parameterTypes);
Object[] objs = {info, Class.forName(EventRecord.getPrefixPackageName()+entityName).cast(obj)};
method.invoke((EventRecord)ApplicationContextHolder.getBean("eventRecord"),objs);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
事件记录类:
package com.creawor.cbsms.event;
import java.sql.Timestamp;
import javacommon.util.ApplicationContextHolder;
import com.creawor.cbsms.dao.CbsEventDao;
import com.creawor.cbsms.model.CbsBsc;
import com.creawor.cbsms.model.CbsBscCells;
import com.creawor.cbsms.model.CbsChannel;
import com.creawor.cbsms.model.CbsEvent;
import com.creawor.cbsms.model.CbsUserRegister;
import com.creawor.cbsms.service.CbsEventManager;
import com.creawor.security.model.PermUser;
public class EventRecord {
// 保存时要记录事件的对象
private static String[] saveEntitysFireEvent = { "CbsBscCells",
"CbsChannel",
"CbsBsc" };
// 删除时要记录事件的对象
private static String[] deleteEntitysFireEvent = { "CbsBscCells",
"CbsChannel",
"CbsBsc" };
// 更新时要记录事件的对象
private static String[] updateEntitysFireEvent = { "CbsBscCells",
"CbsChannel",
"CbsBsc" };
// 包的前缀,反射得到类时使用
private static String prefixPackageName = "com.creawor.cbsms.model.";
// 记录该次操作的登录用户名:EventRecord为session范围
private String userName;
// 调用函数的前缀,反射执行函数时使用
private static String prefixMethodName = "recordFor";
// 执行save时,事件描述
private static String saveInfo = "创建";
// 执行delete时,事件描述
private static String deleteInfo = "删除";
// 执行update时,事件描述
private static String updateInfo = "修改";
private CbsEventManager cbsEventManager;
// spring自动注入
public void setCbsEventManager(CbsEventManager cbsEventManager) {
this.cbsEventManager = cbsEventManager;
}
/**
* 存储频道修改的事件
*
* @param desc
* @param channel
*/
public void recordForCbsChannel(String desc, CbsChannel channel) {
StringBuffer eventDesc = new StringBuffer(desc);
eventDesc.append("频道" + channel.getChannelName()).append("[").append(
channel.getChannelNum()).append("]");
record(eventDesc.toString(), null);
}
/**
* 存储小区修改的事件
*
* @param desc
* @param cell
*/
public void recordForCbsBscCells(String desc, CbsBscCells cell) {
StringBuffer eventDesc = new StringBuffer(desc);
eventDesc.append("小区"+cell.getCellName()).append("[").append(
cell.getCellId()).append("]");
record(eventDesc.toString(), null);
}
/**
* 存储**修改的事件
* 根据不同的对象拼接时间描述语句
* @param desc
* @param bsc
*/
public void record(String eventDesc, String eventOrigin) {
CbsEvent event = new CbsEvent();
event.setEventDesc(userName + " " + eventDesc);
event.setEventOrigin(eventOrigin);
event.setStartTime(new Timestamp(System.currentTimeMillis()));
cbsEventManager.save(event);
}
public void setUserName(String userName) {
this.userName = userName;
}
public static String[] getDeleteEntitysFireEvent() {
return deleteEntitysFireEvent;
}
public static String[] getSaveEntitysFireEvent() {
return saveEntitysFireEvent;
}
public static String[] getUpdateEntitysFireEvent() {
return updateEntitysFireEvent;
}
public static String getPrefixPackageName() {
return prefixPackageName;
}
public static void setPrefixPackageName(String prefixPackageName) {
EventRecord.prefixPackageName = prefixPackageName;
}
public static String getPrefixMethodName() {
return prefixMethodName;
}
public static String getDeleteInfo() {
return deleteInfo;
}
public static String getSaveInfo() {
return saveInfo;
}
public static String getUpdateInfo() {
return updateInfo;
}
}
其中EventRecord 在spring中的配置为:
<bean id="eventRecord" class="com.creawor.cbsms.event.EventRecord" scope="session" autowire="byName"/>
EventRecord 为session范围可以使字段userName记录每次登录人员的姓名
具体在每次登录后从spring容器中得到EventRecord然后set其userName即可!
最后一步要想让session范围生效还要在web.xml中添加配置:
<web-app>
...
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
...
</web-app>
这样如果想要记录一个业务bean增删改的操作只需在EventRecord中设置saveEntitysFireEvent,deleteEntitysFireEvent,updateEntitysFireEvent属性即可,同样也可使用配置文件配置,这样都可以使日志和事件的记录变得很简单!
分享到:
相关推荐
拦截器允许开发者在对象状态变化时执行自定义逻辑,比如更新时间戳、记录审计日志等。 #### 定义拦截器 拦截器是通过实现 `Interceptor` 接口来创建的。在本示例中,定义了一个名为 `MyInterceptor` 的拦截器类,...
在本例中,AOP与日志拦截器结合,可以实现在方法执行前后自动插入日志记录,提高代码的可维护性和可读性。 3. Log4j:Log4j是Apache的一个开源项目,它是一个广泛使用的日志记录工具,提供灵活的日志记录配置,包括...
数据日志:设计中提供数据日志注入接口,管理数据日志注入,业务系统可过基于hibernate Listener 拦截数据表操作,注入数据日志(此为业务系统实现,设计中提供数据日志注入接口),提供 日志管理:通过统一的...
拦截器在Action执行前后插入代码,可以用来实现日志记录、权限检查、性能监控等多种功能。在EventLogInterceptor中,我们可以定义before()和after()方法,分别在Action执行前和执行后被调用,用于记录日志信息。 ...
数据日志:设计中提供数据日志注入接口,管理数据日志注入,业务系统可过基于hibernate Listener 拦截数据表操作,注入数据日志(此为业务系统实现,设计中提供数据日志注入接口),提供 日志管理:通过统一的...
我们可以通过定义切面(Aspect),指定切点(Pointcut)来标识需要拦截的方法,并定义通知(Advice)来执行实际的日志记录逻辑。通知可以是在方法调用前、后或异常发生时执行。 接下来,**Hibernate**是一个对象...
拦截器配置** 在Struts1中,拦截器的配置通常在struts-config.xml文件中进行。你需要找到对应的标签,然后在其中添加子标签,定义拦截器的堆栈顺序。SAIF插件可能提供了特定的拦截器类,你需要按照文档或示例代码...
1. **拦截器配置**:在`struts.xml`配置文件中,我们需要定义拦截器并将其与特定的Action关联。例如,可以创建一个名为`LoginInterceptor`的拦截器,然后在`<package>`标签内使用`<interceptors>`和`<interceptor>`...
拦截器可以实现权限验证、日志记录等功能,增强了应用的灵活性和可扩展性。 当Hibernate和Struts2结合使用时,我们可能还需要在Struts2的配置文件中添加对Hibernate的依赖,例如配置一个数据源插件,以便在Action中...
此外,Struts2还支持拦截器(Interceptors),这是一种强大的中间件,可以实现如验证、日志、性能监控等功能。 **Hibernate框架** Hibernate是一个流行的ORM框架,它通过映射Java对象到数据库表,消除了手动编写SQL...
6. **项目结构**:项目文件列表中提到的"regi"可能是指与注册相关的文件或目录,可能包含Action类、拦截器实现、配置文件(如struts.xml)、JSP页面等。Action类负责接收用户的请求,调用业务逻辑,而JSP页面则展示...
在Struts2中,拦截器是实现业务逻辑增强的一种方式,它们在Action执行前后执行,可以实现日志记录、权限验证、性能监控等功能。要添加拦截器,你需要在struts.xml配置文件中定义拦截器栈,并关联到特定的Action或者...
拦截器可以用来实现日志记录、权限检查、事务处理等跨切面的功能。在登录场景中,拦截器通常用于验证用户的身份,防止未授权的访问。 下面是如何在SSH框架中实现一个简单的登录拦截器的步骤: 1. **创建拦截器类**...
框架通过拦截器(Interceptor)机制增强了Action的功能,如日志记录、权限验证等。此外,Struts2支持多种结果类型,包括JSP、FreeMarker、 Velocity等,使得视图层的实现更加多样化。 2. **Hibernate ORM**:...
在SSH(Struts2、Spring、Hibernate)系统中,拦截器用于增强应用程序的功能,比如权限检查、日志记录、事务管理等。在本场景中,我们关注的是如何利用Struts拦截器来实现一个等待页面,以提升用户体验。 当系统...
在Spring AOP(面向切面编程)中,我们可以通过定义拦截器来实现对系统操作日志和异常日志的记录,这些日志信息通常会被存储到数据库中以便于后续的分析和故障排查。下面将详细介绍如何使用Spring AOP实现这个功能。...
此外,Struts 2 还提供强大的拦截器机制,可以实现权限控制、数据校验等功能,确保论坛系统的安全性和稳定性。 接着,Hibernate 是一个对象关系映射(ORM)框架,它简化了数据库操作,将Java对象和数据库表之间的...
Struts2的核心组件包括Action、Result、Interceptor等,其中Action负责处理请求,Result负责呈现结果,Interceptor则提供了拦截请求和响应的能力,用于实现如日志记录、权限验证等功能。 **Spring** 是一个全面的...
同时,Spring的AOP特性可以方便地实现日志记录、权限控制等功能。 4. **整合与协作** 在这个项目中,Struts 2、Hibernate和Spring通过合理的配置协同工作。Struts 2的动作(Action)通常会依赖Spring管理的Service...
此外,Spring还提供了AOP(面向切面编程)功能,用于处理如日志记录、事务管理等横切关注点。 2. **Hibernate框架**:Hibernate是一个强大的ORM(对象关系映射)工具,用于简化Java应用程序与数据库之间的交互。...