摘要:本文将介紹Struts,Spring與hibernate的內建。希望大家能從中受用。
1、在工程中導入spring支援,導入的Jar包有:
◆ Spring 2.0 Core Libraries
◆Spring 2.0 ORM/DAO/Hibernate3 Libraries
◆ Spring 2.0 AOP Libraries
◆ Spring 2.0 Web Libraries
2、在Spring配置檔案中配置dataSource和SessionFactory,将hibernate配置與Spring配置整合在一起(可以删除hibernate.cfg.xml檔案);
3、導入資料庫源所要使用的Jar包,如:DBCP所用的JAR包(commons-pool.jar);
4、修改所有DAO的hibernate實作,因為Spring中提供了一個HibernateDAOSupport類,可以簡化資料庫的操作。使用所有DAO類都繼承自該類;
5、将DAO采用依賴注入的方式注入到Biz中,再将Biz采用依賴注入的方式注入到Action中,在Spring配置檔案中做相應配置;
6、将Spring與Struts內建:
1)在spring配置檔案配置Action:将Biz注入到Action中;
2)修改Struts的配置檔案:将Action的type屬性修改為:org.springframework.web.struts.DelegatingActionProxy;
3)在web.xml檔案中配置監聽器以及web應用的初始化參數:
7、為了解決應用中的中文亂碼問題,我們可以不用自己開發過濾器類,Spring為我們提供了一個,隻需要配置一下即可:
8、為了解決hibernate延遲加載的問題,使用Spring中提供的過濾器來解決,它能夠讓Session
在請求解釋完成之後再關閉,配置方式如下:
9、因為OpenSessionInViewFilter在getSession的時候,會把擷取回來的session的flush mode 設為FlushMode.NEVER。故進行insert、 update和delete操作時會産生異常:org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition. 是以需要采用spring的事務聲明,使方法受transaction控制:
<!-- 配置事務管理器 -->
<bean class="org.springframework.orm.hibernate3.
HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- 配置Advice(事務的傳播特性) -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="del*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="get*" propagation="SUPPORTS" read-only="true"/>
<tx:method name="search*" propagation="SUPPORTS" read-only="true"/>
</tx:attributes>
</tx:advice>
<!-- 配置事務管理器應用的範圍 -->
<aop:config>
<aop:pointcut id="affectMethods" expression="execution(* edu.accp.dao.
hibImpl.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="affectMethods"/>
</aop:config>
10、 部署應用程式,啟動伺服器,如果發現異常: java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V 這是由于整合時Jar包的沖突引起的。應将"Web應用程式/WEB-INF/lib/asm-2.2.3.jar"删除即可。