0.为了防止service切面影像hibernate过滤器参数,需声明设定后者初始参数。
<!-- Spring 整合 Hibernate -->
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
<init-param>
<param-name>singleSession</param-name>
<param-value>true</param-value>
<param-name> flushMode </param-name>
<param-value>AUTO </param-value>
</init-param>
</filter>
1.部署切面
applicationContext.xml
<!-- 定义事务属性 -->
<aop:config proxy-target-class="true">
<aop:advisor
pointcut="execution(java.lang.String com.sunwin.*.service.*.*(..))"
advice-ref="txAdvice" order="1" />
<!-- 定义操作日志切入点(Service包下的所有类的以sav,upd,del开头的方法) -->
<aop:aspect id="logAspect" ref="logInterceptor" order="2">
<aop:pointcut id="logPointcut"
expression="execution(* com.sunwin.*.service.*.sav*(..)) || execution(* com.sunwin.*.service.*.del*(..))|| execution(* com.sunwin.*.service.*.upd*(..))" />
<aop:after pointcut-ref="logPointcut" method="serviceIntercept" />
</aop:aspect>
</aop:config>
<!-- 用户操作日志拦截器类 -->
<bean id="logInterceptor" class="com.sunwin.interceptor.EventLogInterceptor">
<property name="baseService" ref="baseService"></property>
<property name="userAction" ref="userAction"></property>
</bean>
2.创建日志拦截器类
/**
* 拦截操作日志类
* @param point
* @return
* @throws Throwable
*/
public Object serviceIntercept(JoinPoint point) throws Throwable{
//获取操作方法名称
String methodName = point.getSignature().getName();
//获取方法参数
Object[] args =point.getArgs();
//操作日志信息
String logUserId=null;
String logUserName=null;
String bizType1=GlobalConstants.OPERATE;
if (methodName.startsWith("sav"))
{
logUserId=(String) userAction.getSession().get(SessionConstants.LOGIN_USER_ID);
logUserName=(String) userAction.getSession().get(SessionConstants.LOGIN_USER_NAME);
userAction.setLogType(GlobalConstants.CREATE);
//保存操作日志
this.baseService.saveLog(args[0], userAction.getIpAddr(), logUserId, logUserName, userAction.getLogType(), bizType1);
}
else if(methodName.startsWith("upd"))
{
logUserId=(String) userAction.getSession().get(SessionConstants.LOGIN_USER_ID);
logUserName=(String) userAction.getSession().get(SessionConstants.LOGIN_USER_NAME);
userAction.setLogType(GlobalConstants.UPDATE);
//保存操作日志
this.baseService.saveLog(args[0], userAction.getIpAddr(), logUserId, logUserName, userAction.getLogType(), bizType1);
}
else if(methodName.startsWith("del"))
{
logUserId=(String) userAction.getSession().get(SessionConstants.LOGIN_USER_ID);
logUserName=(String) userAction.getSession().get(SessionConstants.LOGIN_USER_NAME);
userAction.setLogType(GlobalConstants.DELETE);
//保存操作日志
this.baseService.saveLog(args[0], userAction.getIpAddr(), logUserId, logUserName, userAction.getLogType(), bizType1);
}
return null;
}
3.反射方法智能解析pojo对象(或对象列表)中定义的表名anotation:table_id、主键值(包括联合主键,逗号分隔)
/**
* 保存操作日志
*
* @param obj
* @param logIp
* @param logUserId
* @param logUserName
* @param logType
* @param bizType1
*/
public void saveLog(Object obj, String logIp, String logUserId,
String logUserName, String logType, String bizType1) {
try {
// 初始化log表
CahsmsLog log = new CahsmsLog();
if (null != obj) // 业务操作
{
Object logRecordPk = "";//主键值
if (obj instanceof List)
{
List logList = new ArrayList<CahsmsLog>();
List list = (List) obj;
// 获取物理表名
AbstractEntityPersister classMetadata = (SingleTableEntityPersister) this.logDao
.getSessionFactory().getClassMetadata(
list.get(0).getClass());
for (int i = 0; i < list.size(); i++) {
log=new CahsmsLog();
if (classMetadata != null) {
String logTable = classMetadata.getTableName();
log.setLogTable(logTable);
}
// 获取主键值
logRecordPk = this.logDao.getSessionFactory()
.getCurrentSession().getIdentifier(list.get(i));
if(logRecordPk instanceof String )//非联合主键
{
log.setLogRecordPk((String)logRecordPk);
}
else//联合主键
{
Field[] field = logRecordPk.getClass().getDeclaredFields();
String logRecordPkValue="";//主键值
for(int j=0;j<field.length;j++)
{
String attributeName = field[j].getName(); //获取属性的名字
String methodName=attributeName.substring(0, 1).toUpperCase() + attributeName.substring(1);
Method m = logRecordPk.getClass().getMethod("get"+methodName);
String attributeValue = (String) m.invoke(logRecordPk); //调用getter方法获取属性值
logRecordPkValue+=attributeName+":"+attributeValue;
if(j<field.length-1)
{
logRecordPkValue+=",";
}
}
log.setLogRecordPk(logRecordPkValue);
}
log.setLogId(DataTypeUtil
.getDateTimeStemp(GlobalConstants.PREFIX_LOG
)+ i);// 日志id
log.setLogDate(new Date(new Date().getTime()));// 获取操作时间
log.setLogUserId(logUserId);// 登陆用户id
log.setLogUserName(logUserName);// 登陆用户姓名
log.setLogIp(logIp);// ip地址
log.setLogType(logType);// 操作类型(C:Create;R:
// Read;U:Update;D:Delete)
log.setBizType1(bizType1);// 业务大类(1:登陆;2:业务操作;3:退出)
logList.add(log);
}
this.logDao.getHibernateTemplate().getSessionFactory()
.getCurrentSession().setFlushMode(FlushMode.AUTO);
this.logDao.saveList(logList);
this.logDao.getHibernateTemplate().getSessionFactory()
.getCurrentSession().flush();
}
else
{
// 获取物理表名
AbstractEntityPersister classMetadata = (SingleTableEntityPersister) this.logDao
.getSessionFactory().getClassMetadata(
obj.getClass());
if (classMetadata != null) {
String logTable = classMetadata.getTableName();
log.setLogTable(logTable);
}
// 获取主键值
logRecordPk = this.logDao.getSessionFactory()
.getCurrentSession().getIdentifier(obj);
if(logRecordPk instanceof String )//非联合主键
{
log.setLogRecordPk((String)logRecordPk);
}
else//联合主键
{
Field[] field = logRecordPk.getClass().getDeclaredFields();
String logRecordPkValue="";//主键值
for(int j=0;j<field.length;j++)
{
String attributeName = field[j].getName(); //获取属性的名字
String methodName=attributeName.substring(0, 1).toUpperCase() + attributeName.substring(1);//设置属性值的方法名
Method m = logRecordPk.getClass().getMethod("get"+methodName);
String attributeValue = (String) m.invoke(logRecordPk); //调用getter方法获取属性值
logRecordPkValue+=attributeName+":"+attributeValue;
if(j<field.length-1)
{
logRecordPkValue+=",";
}
}
log.setLogRecordPk(logRecordPkValue);
}
log.setLogId(DataTypeUtil
.getDateTimeStemp(GlobalConstants.PREFIX_LOG));// 日志id
log.setLogDate(new Date(new Date().getTime()));// 获取操作时间
log.setLogUserId(logUserId);// 登陆用户id
log.setLogUserName(logUserName);// 登陆用户姓名
log.setLogIp(logIp);// ip地址
log.setLogType(logType);// 操作类型(C:Create;R:
// Read;U:Update;D:Delete)
log.setBizType1(bizType1);// 业务大类(1:登陆;2:业务操作;3:退出)
this.logDao.getHibernateTemplate().getSessionFactory()
.getCurrentSession().setFlushMode(FlushMode.AUTO);
this.logDao.save(log);
this.logDao.getHibernateTemplate().getSessionFactory()
.getCurrentSession().flush();
}
}
else//登录和退出操作
{
log.setLogId(DataTypeUtil
.getDateTimeStemp(GlobalConstants.PREFIX_LOG));// 日志id
log.setLogDate(new Date(new Date().getTime()));// 获取操作时间
log.setLogUserId(logUserId);// 登陆用户id
log.setLogUserName(logUserName);// 登陆用户姓名
log.setLogIp(logIp);// ip地址
log.setLogType(logType);// 操作类型(C:Create;R:
// Read;U:Update;D:Delete)
log.setBizType1(bizType1);// 业务大类(1:登陆;2:业务操作;3:退出)
this.logDao.getHibernateTemplate().getSessionFactory()
.getCurrentSession().setFlushMode(FlushMode.AUTO);
this.logDao.save(log);
this.logDao.getHibernateTemplate().getSessionFactory()
.getCurrentSession().flush();
}
} catch (Exception e) {
e.printStackTrace();
}
}
分享到:
相关推荐
Struts2提供了丰富的拦截器机制,可以方便地进行权限控制、日志记录、异常处理等操作。 Spring则是一个全面的企业级应用框架,不仅支持IoC(Inversion of Control,控制反转)和AOP(Aspect-Oriented Programming,...
Spring框架则在业务层起到了核心作用,它是一个全面的企业应用框架,支持依赖注入(DI)、面向切面编程(AOP)、事务管理等关键特性。Spring2.5版本进一步完善了这些功能,增强了对其他框架如Struts和Hibernate的...
1. **struts.properties**:这是Struts2框架的核心配置文件,它定义了Struts2的基本属性,如全局的默认主题、拦截器栈等。例如,你可以在这里指定是否开启调试模式,或者设置应用的默认结果类型。通过修改这个文件,...
- **AOP编程**:Spring的面向切面编程允许你定义拦截器和通知,实现如日志、事务管理等功能。 3. **Hibernate配置**: - **添加依赖**:在项目中引入Hibernate的相关库。 - **创建Hibernate配置文件(hibernate....
2. **Spring**: 作为依赖注入(DI)和面向切面编程(AOP)的容器,Spring允许开发者管理对象的生命周期和依赖关系。在S2SH中,Spring负责协调其他两个框架,例如配置数据源、事务管理、Bean的实例化等。Spring 2.5.5...
Spring是一个全面的企业级应用开发框架,它通过依赖注入(DI)和面向切面编程(AOP)来简化Java应用的开发。在S2SH整合中,Spring主要负责管理Bean的生命周期,包括初始化、装配和销毁,同时也提供了事务管理和数据...
同时,Struts2支持多种插件和拦截器,可以实现灵活的权限控制和日志记录等功能。 **三、Spring框架** Spring是一个全面的企业级应用开发框架,它的核心特性包括依赖注入(DI)和面向切面编程(AOP)。Spring通过DI...
【标题】"s2sh ssh 架包和配置文档集合" 涉及的主要知识点是企业级Java开发中的三大框架整合——Struts2、Spring和Hibernate(简称S2SH),以及相关的jar包管理和XML配置文件。 【Struts2】:Struts2是一个基于MVC...
通过IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)理念,Spring能够简化应用程序的开发和维护。在S2SH整合中,Spring主要负责事务管理和数据源配置,以及Struts2和...
Spring是一个全面的企业级应用框架,提供IOC(Inversion of Control,控制反转)和AOP(Aspect-Oriented Programming,面向切面编程)等核心功能。在S2SH框架中,Spring主要负责管理对象的生命周期,实现依赖注入,...
1. **struts.xml**:配置Struts 2的Action、结果类型、拦截器等。 2. **spring.xml**:定义Bean,包括Service、DAO和它们的依赖。这里也可以配置事务管理策略。 3. **persistence.xml**:JPA的配置文件,声明实体...
Spring框架是Java企业级应用的核心,它提供了一个全面的编程和配置模型,支持依赖注入(DI)和面向切面编程(AOP)。在S2SH中,Spring主要负责管理对象的生命周期和依赖关系,可以将Struts2和Hibernate的实例化、...
Struts2.0的优势在于其强大的拦截器机制和灵活的配置,能够处理复杂的HTTP请求,提供丰富的动作和结果类型,简化了前端与后端的交互,使系统的可维护性和扩展性得到保障。 其次,Spring2.5框架则扮演了依赖注入...
它的拦截器机制使得在请求处理前后的逻辑可以被灵活定制,如登录验证、日志记录等。此外,Struts2的模板技术和OGNL表达式增强了视图与模型数据的交互。 Hibernate作为对象关系映射(ORM)工具,实现了Java对象与...
Struts2的核心包括Action、Interceptor(拦截器)、Result等概念,通过配置文件来定义请求处理流程。在s2sh项目中,Struts2的jar包将用于处理HTTP请求,实现视图与控制器的分离,以及业务逻辑的调度。 Spring框架则...
在S2SH中,Spring主要负责IoC(Inversion of Control,控制反转)和AOP(Aspect-Oriented Programming,面向切面编程)。IoC使得对象的创建和依赖关系的维护变得更加简单,AOP则允许我们在不修改原有代码的情况下,...
Struts2的优势在于其强大的拦截器机制,可以自定义拦截器进行权限控制、日志记录等操作。此外,Struts2支持多种结果类型和模板技术,如JSP、FreeMarker、Velocity等,方便灵活地构建视图层。 2. **Spring框架** ...
它提供了丰富的拦截器(Interceptor)机制,可以方便地进行AOP(面向切面编程)操作,如日志记录、权限验证等。Struts2的配置文件(struts.xml)用于定义Action和结果,以及Action与视图间的映射。 2. **Spring**:...
AOP则用于实现跨切面关注点,如日志、事务管理等。Spring3还包含了Spring MVC,作为另一种MVC框架,可以与Struts2互补或替代,提供更灵活的Web层控制。此外,Spring3还提供了数据访问集成、测试、任务调度等多种功能...