Struts2+Spring+Hibernate 整合

说明:本整合使用版本为Struts2-2.1.8、Spring-2.5.6、Hibernate-3.2 使用注解方式进行整合

必要jar包:antlr-2.7.6.jar、asm.jar、asm-attrs.jar、aspectjweaver.jar、cglib-nodep-2.1_3.jar

一、 Spring+Hibernate整合:
Spring整合Hibernate,是做了一个很大的调整的,因为spring可以把管理Hibernate的工作都做了,以前的hibernate.cfg.xml文件都去掉了,而将这些内容都交给了spring来管理了。
1、 applicationContext.xml文件中应该配置如下内容:
Xml代码
//配置数据连接类  
<bean id="dataSource" 
        class="org.apache.commons.dbcp.BasicDataSource"> 
        <property name="driverClassName" 
            value="org.gjt.mm.mysql.Driver"> 
        </property> 
        <property name="url" value="jdbc:mysql://localhost:3306/test"></property> 
        <property name="username" value="root"></property> 
</bean> 
//配置session工厂类  
<bean id="sessionFactory" 
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
        <property name="dataSource"> 
            <ref bean="dataSource" /> 
        </property> 
        <property name="hibernateProperties"> 
            <props> 
                <prop key="hibernate.dialect"> 
                    org.hibernate.dialect.MySQLDialect  
                </prop> 
                <prop key="hibernate.show_sql">true</prop> 
            </props> 
        </property> 
        <property name="mappingResources"> 
         <value>com/hejianjiao/vo/Person.hbm.xml</value> 
        </property> 
</bean> 

//配置数据连接类
<bean id="dataSource"
  class="org.apache.commons.dbcp.BasicDataSource">
  <property name="driverClassName"
   value="org.gjt.mm.mysql.Driver">
  </property>
  <property name="url" value="jdbc:mysql://localhost:3306/test"></property>
  <property name="username" value="root"></property>
</bean>
//配置session工厂类
<bean id="sessionFactory"
 class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  <property name="dataSource">
   <ref bean="dataSource" />
  </property>
  <property name="hibernateProperties">
   <props>
    <prop key="hibernate.dialect">
     org.hibernate.dialect.MySQLDialect
    </prop>
    <prop key="hibernate.show_sql">true</prop>
   </props>
  </property>
  <property name="mappingResources">
   <value>com/hejianjiao/vo/Person.hbm.xml</value>
  </property>
</bean>


2、可以使用spring中的HibernateDAOSupport与HibernateTemplate类来进行数据持久化操作:
A、HibernateDAOSupport类中定义了对session、sessionFactory的操作方法与getHibernateTemplate方法来获得一个HibernateTemplate实例;
B、HibernateTemplate类中定义了对数据持久化的各种封装的方法,我们可以用它来对数据进行操作。
因此在使用时,我们可以继承HibernateDAOSupport类,然后实例化HibernateTemplate类来进行数据持久化。

二、 Spring+Struts2整合:
1、spring配置在web.xml文件中的上下文监听器:
Xml代码
<context-param> 
  <param-name>contextConfigLocation</param-name> 
  <param-value>/WEB-INF/applicationContext*.xml</param-value> 
</context-param> 
 
<listener> 
<listener-class>org.springframwork.web.content.ContextLoaderListener</listener-class> 
</listener> 

<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>/WEB-INF/applicationContext*.xml</param-value>
</context-param>

<listener>
<listener-class>org.springframwork.web.content.ContextLoaderListener</listener-class>
</listener>

 

2、struts2配置在web.xml文件中的过滤器:
Xml代码
<filter> 
<filter-name>struts2</filter-name> 
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> 
</filter> 
 
<filter-mapping> 
  <filter-name>struts2</filter-name> 
  <url-patter>/*</url-patter> 
</filter-mapping> 

<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>

<filter-mapping>
  <filter-name>struts2</filter-name>
  <url-patter>/*</url-patter>
</filter-mapping>

 

3、设置struts.xml文件,就可以使用spring的IOC来管理struts的Action:
Xml代码
<constent name="struts.objectFactory" value="spring" /> 

<constent name="struts.objectFactory" value="spring" />


4、第三步设置后,以后在struts.xml 文件中配置一个action时,它的class就不是一个类了,而是在applicationContext.xml文件中定义过的类的ID,在struts.xml文件中就只需要引用定义好的类的id 就可以了。
然后特别要注意的一个问题:action是一个请求就是一个action对象,而在spring中则不是的,它是自动分配类的实例的,是使用的单态模式来 生产类的实例的,不符合action,因此在applicationContext.xml文件中定义每个action时,都要在类后加上:
Xml代码
scope="prototype" 属性 

scope="prototype" 属性


三、 三者组合开发:
一般在组合开发时,没有什么难的,只要把上面两步做好就可以是三个组合开发了。
[img]

[/img]

[img][/img]

上图则是对于进行组合开发时,一般使用的系统架构:
1、 先从最底层开发,先开发POJO类,和Hibernate映射文件。它相当于系统的数据库层。
2、 再开发DAO层,它是对于数据进行持久化的一层,专门处理各种数据增、删、改、查的功能。并且使用DAO工厂模式,以保证和上层没有任何的联系,并且可以方便于类与接口的扩展。
3、 第三是开发manager层,它相当于软件的业务逻辑层,即专门处理各种业务逻辑。实现系统的业务处理功能。并且它隔离事务,使与下层的数据持久和上层的数据操作没有任何的联系。
4、 Action层,也即软件的表示层,处理action的接收与回复。各action由spring管理。

五、 组合开发中的一些问题:

1、 在组合开发中,常见的一个问题就是session的管理,当我们使用HibernateTemplate操作数据库时,可以不对session进行显示的操作,spring可以自动处理session的打开与关闭。
我们可以在web.xml文件中显示的配置一个session管理的过滤器,它专门帮助我们关闭session:

Xml代码
<filter> 
        <filter-name>lazyLoadingFilter</filter-name> 
<filter-class> 
org.springframwork.orm.hibernate3.support.OpenSessionInViewFilter  
</filter-class> 
</filter> 
 
<filter-mapping> 
         <filter-name>lazyLoadingFilter</filter-name> 
         <url-pattern>*.action</url-pattern> 
</filter-mapping> 
注:它一定要在struts2的过滤器之前。因为web.xml文件的过滤器执行是有顺序的。而session一定在前面进行。 

<filter>
        <filter-name>lazyLoadingFilter</filter-name>
<filter-class>
org.springframwork.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
</filter>

<filter-mapping>
         <filter-name>lazyLoadingFilter</filter-name>
         <url-pattern>*.action</url-pattern>
</filter-mapping>
注:它一定要在struts2的过滤器之前。因为web.xml文件的过滤器执行是有顺序的。而session一定在前面进行。

 

它会在所有的action处理完了,页面显示完了,就会自动关闭session。

六、 spring事务处理

1、事务的处理也交给了spring来管理,要在applicationContext.xml文件中上配置事务管理类:
Xml代码
//实施事务管理的bean  
<bean id=”transactionManager”   
class=”org.springframwork.orm.hibernate3.HibernateTransactionManager”> 
       <property name=”sessionFactory”> 
           <ref bean=”sessionFactory” /> 
</property> 
</bean> 

//实施事务管理的bean
<bean id=”transactionManager”
class=”org.springframwork.orm.hibernate3.HibernateTransactionManager”>
       <property name=”sessionFactory”>
           <ref bean=”sessionFactory” />
</property>
</bean>


它是通过sessionFactory来管理,因此在传进来一个sessionFactory来接管事务处理。
2、 声明式事务处理:
在spring中对事务进行管理时,可以显示地进行事务处理的定义:
Xml代码
//给事务添加的属性  
<tx:advice id=”txAdvice” transaction-manager=”transactionManager”> 
     <tx:attributes > 
//propagation表示的是事务的传播特性,使用required时,是当检测到add开头的方法时,就看此时有没有开启的事务,如果有则将方法放进事务中去,如果没有,则新建一个事务。然后将方法放进去。  
          <tx:method name=”add*” propagation=”REQUIRED”> 
          <tx:method name=”delete*” propagation=”REQUIRED”> 
           <tx:method name=”update*” propagation=”REQUIRED”> 
//如果检测到其它的方法,则给其只读数据库的属性。即当本方法在读时,其它的方法不能再去写了。保证一个事务的完整性。  
           <tx:method name=”*” read-only=”true”> 
</tx:attributes> 
</tx:advice> 

//给事务添加的属性
<tx:advice id=”txAdvice” transaction-manager=”transactionManager”>
     <tx:attributes >
//propagation表示的是事务的传播特性,使用required时,是当检测到add开头的方法时,就看此时有没有开启的事务,如果有则将方法放进事务中去,如果没有,则新建一个事务。然后将方法放进去。
          <tx:method name=”add*” propagation=”REQUIRED”>
          <tx:method name=”delete*” propagation=”REQUIRED”>
           <tx:method name=”update*” propagation=”REQUIRED”>
//如果检测到其它的方法,则给其只读数据库的属性。即当本方法在读时,其它的方法不能再去写了。保证一个事务的完整性。
           <tx:method name=”*” read-only=”true”>
</tx:attributes>
</tx:advice>


对于事务的其它传播属性,则可以参考其它文档进行相关的了解。

上一个配置是针对于所有包中类的事务处理方法的设置。下面一段是<aop:config/> 的定义,它确保由 'txAdvice' bean定义的事务通知在应用中合适的点被执行。首先我们定义了 一个切面,它匹配 HibernateDAO 接口定义的所有操作,我们把该切面叫做 'allManagerMethod'。然后我们用一个通知器(advisor)把这个切面与 'txAdvice' 绑定在一起,表示当 'allManagerMethod' 执行时,'txAdvice' 定义的通知事务逻辑将被执行。这就是AOP切面工程:
Xml代码
<aop:config> 
      <aop:pointcut id=”allManagerMethod”   
expression=”execution(*  com.hejianjiao.hibernate.HibernateDAO.*(..))”/> 
//调用上面配置的事务属性,可以将它给本aop pointcut。  
      <aop:advisor advice-ref=”txAdvice” pointcut-ref=”allManagerMethod”/> 
//如果还有其它的定义,则可以再加上pointcut、advisor来定义本切面点的事务逻辑。  
</aop:config> 

<aop:config>
      <aop:pointcut id=”allManagerMethod”
expression=”execution(*  com.hejianjiao.hibernate.HibernateDAO.*(..))”/>
//调用上面配置的事务属性,可以将它给本aop pointcut。
      <aop:advisor advice-ref=”txAdvice” pointcut-ref=”allManagerMethod”/>
//如果还有其它的定义,则可以再加上pointcut、advisor来定义本切面点的事务逻辑。
</aop:config>


//expression中的内容是要执行本切面的一个接口,中的所有方法:如:一个接口中定义了操作数据的方 法:com.hejianjiao.hibernate.HibernateDAO,则下面execution括号中的内容就为:* com.hejianjiao.hibernate.HibernateDAO.*(..)。而如果在com.hejianjiao.hibernate 包中还有其它的类也有操作方法,我们要一起定义的话,就可以写为:*  com.hejianjiao.*.*(..),其中(..)表示的是方法,前面的第一个*是操作的接口或者类。
上面的配置将为由 'HibernateDAO' 定义的bean创建一个代理对象,这个代理对象被装配了事务通知,所以当它的相应方法被调用时,一个事务将被启动、挂起、被标记为只读,或者其它(根据该方法所配置的事务语义)。

使用优化算法,以优化VMD算法的惩罚因子惩罚因子 (α) 和分解层数 (K)。 1、将量子粒子群优化(QPSO)算法与变分模态分解(VMD)算法结合 VMD算法背景: VMD算法是一种自适应信号分解算法,主要用于分解信号为不同频率带宽的模态。 VMD的关键参数包括: 惩罚因子 α:控制带宽的限制。 分解层数 K:决定分解出的模态数。 QPSO算法背景: 量子粒子群优化(QPSO)是一种基于粒子群优化(PSO)的一种改进算法,通过量子行为模型增强全局搜索能力。 QPSO通过粒子的量子行为使其在搜索空间中不受位置限制,从而提高算法的收敛速度与全局优化能力。 任务: 使用QPSO优化VMD中的惩罚因子 α 和分解层数 K,以获得信号分解的最佳效果。 计划: 定义适应度函数:适应度函数根据VMD分解的效果来定义,通常使用重构信号的误差(例如均方误差、交叉熵等)来衡量分解的质量。 初始化QPSO粒子:定义粒子的位置和速度,表示 α 和 K 两个参数。初始化时需要在一个合理的范围内为每个粒子分配初始位置。 执行VMD分解:对每一组 α 和 K 参数,运行VMD算法分解信号。 更新QPSO粒子:使用QPSO算法更新粒子的状态,根据适应度函数调整粒子的搜索方向和位置。 迭代求解:重复QPSO的粒子更新步骤,直到满足终止条件(如适应度函数达到设定阈值,或最大迭代次数)。 输出优化结果:最终,QPSO算法会返回一个优化的 α 和 K,从而使VMD分解效果最佳。 2、将极光粒子(PLO)算法与变分模态分解(VMD)算法结合 PLO的优点与适用性 强大的全局搜索能力:PLO通过模拟极光粒子的运动,能够更高效地探索复杂的多峰优化问题,避免陷入局部最优。 鲁棒性强:PLO在面对高维、多模态问题时有较好的适应性,因此适合海上风电时间序列这种非线性、多噪声的数据。 应用场景:PLO适合用于优化VMD参数(α 和 K),并将其用于风电时间序列的预测任务。 进一步优化的建议 a. 实现更细致的PLO更新策略,优化极光粒子的运动模型。 b. 将PLO优化后的VMD应用于真实的海上风电数据,结合LSTM或XGBoost等模型进行风电功率预测。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值