锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
TransactionTemplate 鍜?tt class="classname">TransactionInterceptor 閮芥槸灝嗙湡姝g殑浜嬪姟澶勭悊浠g悊緇欎竴涓?tt class="classname">PlatformTransactionManager瀹炰緥錛?姣斿鍦℉ibernate搴旂敤涓畠鍙互鏄竴涓?tt class="classname">HibernateTransactionManager 錛堝浜庡崟鐙竴涓殑Hibernat SessionFactory錛?瀹炶川涓婁嬌鐢ㄤ竴涓猅hreadLocal鐨凷ession錛夋垨涓涓?tt class="classname">JtaTransactionManager 錛堜唬鐞嗙粰瀹瑰櫒鐨凧TA瀛愮郴緇燂級銆?浣犵敋鑷沖彲浠ヤ嬌鐢ㄨ嚜瀹氫箟鐨?tt class="classname">PlatformTransactionManager鐨勫疄鐜般?鎵浠ュ憿錛屽鏋滀綘鐨勫簲鐢ㄩ渶瑕佸垎甯冨紡浜嬪姟鐨勬椂鍊欙紝 灝嗗師鏉ョ殑Hibernate浜嬪姟綆$悊杞彉涓篔TA涔嬬被鐨勶紝鍙笉榪囨槸鏀瑰彉閰嶇疆鏂囦歡鐨勪簨鎯呫?綆鍗曞湴錛屽皢Hibernate transaction manager鏇挎崲涓篠pring鐨凧TA transaction瀹炵幇銆?浜嬪姟鐨勫垝鍒嗗拰鏁版嵁璁塊棶浠g爜鍒欎笉闇瑕佹敼鍙橈紝鍥犱負浠栦滑浣跨敤鐨勬槸閫氱敤鐨勪簨鍔$鐞咥PI銆?瀵逛簬妯法澶氫釜Hibernate SessionFacotry鐨勫垎甯冨紡浜嬪姟錛?鍙渶綆鍗曞湴灝?tt class="classname">JtaTransactionManager 鍚屽涓?tt class="classname">LocalSessionFactoryBean 瀹氫箟緇撳悎璧鋒潵浣滀負涓涓簨鍔$瓥鐣ャ?浣犵殑姣忎竴涓狣AO閫氳繃bean灞炴у緱鍒板悇鑷殑SessionFactory寮曠敤銆?濡傛灉鎵鏈夌殑搴曞眰JDBC datasource閮芥槸鏀寔浜嬪姟鐨勫鍣紝 閭d箞鍙涓涓笟鍔″璞′嬌鐢ㄤ簡 JtaTransactionManager絳栫暐錛?瀹冨氨鍙互妯法澶氫釜DAO鍜屽涓猻ession factories鏉ュ垝鍒嗕簨鍔★紝鑰屼笉闇瑕佺壒孌婄殑瀵瑰緟.
HibernateTransactionManager 鍜?tt class="classname">JtaTransactionManager 閮戒嬌鐢ㄤ簡涓庡鍣ㄦ棤鍏崇殑Hibernate浜嬪姟綆$悊鍣ㄧ殑lookup鎴朖CA榪炴帴鍣紙鍙浜嬪姟涓嶆槸鐢‥JB鍙戣搗鐨勶級錛?浠庤岃冭檻鍒板湪閫傚綋JVM綰у埆涓婄殑cache澶勭悊銆?鑰屼笖HibernateTransactionManager 鑳藉涓烘櫘閫氱殑JDBC璁塊棶浠g爜杈撳嚭JDBC Connection銆?榪欏氨鍙互浣垮緱娣峰悎鐨凥ibernate/JDBC鏁版嵁璁塊棶鍙互涓嶇敤JTA鑰屽湪楂樺眰嬈′笂榪涜浜嬪姟鍒掑垎錛?鍙瀹冧滑浣跨敤鐨勬槸鍚屼竴涓暟鎹簱! 鎴戜滑鍙互浣跨敤Spring鐨凙OP TransactionInterceptor鏉ユ浛鎹簨鍔″垝鍒嗙殑鎵嬪伐浠g爜錛?榪欓渶瑕佸湪application context涓畾涔塱nterceptor銆?榪欎釜鏂規(guī)浣垮緱浣犲彲浠ユ妸涓氬姟瀵硅薄浠庢瘡涓笟鍔℃柟娉曚腑閲嶅鐨勪簨鍔″垝鍒嗕唬鐮佷腑瑙f斁鍑烘潵銆?姝ゅ錛屽儚浼犳挱琛屼負鍜岄殧紱葷駭鍒瓑浜嬪姟姒傚康鑳藉鍦ㄩ厤緗枃浠朵腑鏀瑰彉錛岃屼笉浼氬獎鍝嶄笟鍔″璞$殑瀹炵幇銆?<beans>
<bean id="myDataSource1" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>java:comp/env/jdbc/myds1</value>
</property>
</bean>
<bean id="myDataSource2" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>java:comp/env/jdbc/myds2</value>
</property>
</bean>
<bean id="mySessionFactory1" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
<property name="mappingResources">
<list>
<value>product.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">net.sf.hibernate.dialect.MySQLDialect</prop>
</props>
</property>
<property name="dataSource">
<ref bean="myDataSource1"/>
</property>
</bean>
<bean id="mySessionFactory2" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
<property name="mappingResources">
<list>
<value>inventory.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">net.sf.hibernate.dialect.OracleDialect</prop>
</props>
</property>
<property name="dataSource">
<ref bean="myDataSource2"/>
</property>
</bean>
<bean id="myTransactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager"/>
<bean id="myProductDao" class="product.ProductDaoImpl">
<property name="sessionFactory">
<ref bean="mySessionFactory1"/>
</property>
</bean>
<bean id="myInventoryDao" class="product.InventoryDaoImpl">
<property name="sessionFactory">
<ref bean="mySessionFactory2"/>
</property>
</bean>
<bean id="myProductServiceTarget" class="product.ProductServiceImpl">
<property name="productDao">
<ref bean="myProductDao"/>
</property>
<property name="inventoryDao">
<ref bean="myInventoryDao"/>
</property>
</bean>
<bean id="myProductService"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="myTransactionManager"/>
</property>
<property name="target">
<ref bean="myProductServiceTarget"/>
</property>
<property name="transactionAttributes">
<props>
<prop key="increasePrice*">PROPAGATION_REQUIRED</prop>
<prop key="someOtherBusinessMethod">PROPAGATION_MANDATORY</prop>
</props>
</property>
</bean>
</beans>
<beans>
...
<bean id="myTransactionManager"
class="org.springframework.orm.hibernate.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="mySessionFactory"/>
</property>
</bean>
<bean id="myTransactionInterceptor"
class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager">
<ref bean="myTransactionManager"/>
</property>
<property name="transactionAttributeSource">
<value>
product.ProductService.increasePrice*=PROPAGATION_REQUIRED
product.ProductService.someOtherBusinessMethod=PROPAGATION_MANDATORY
</value>
</property>
</bean>
<bean id="myProductServiceTarget" class="product.ProductServiceImpl">
<property name="productDao">
<ref bean="myProductDao"/>
</property>
</bean>
<bean id="myProductService" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces">
<value>product.ProductService</value>
</property>
<property name="interceptorNames">
<list>
<value>myTransactionInterceptor</value>
<value>myProductServiceTarget</value>
</list>
</property>
</bean>
</beans>
public class ProductServiceImpl implements ProductService {
private ProductDao productDao;
public void setProductDao(ProductDao productDao) {
this.productDao = productDao;
}
public void increasePriceOfAllProductsInCategory(final String category) {
List productsToChange = this.productDAO.loadProductsByCategory(category);
...
}
...
}
涓涓畝渚垮彲閫夌殑鍒涘緩澹版槑寮忎簨鍔$殑鏂規(guī)硶鏄細TransactionProxyFactoryBean錛?鐗瑰埆鏄湪娌℃湁鍏朵粬AOP interceptor鐗墊壇鍒扮殑鎯呭喌涓嬨傚涓涓壒瀹氱殑鐩爣bean錛?br />TransactionProxyFactoryBean鐢ㄤ簨鍔¢厤緗嚜宸辮仈鍚坧roxy瀹氫箟銆?榪欐牱灝辨妸閰嶇疆宸ヤ綔鍑忓皯涓洪厤緗竴涓洰鏍嘼ean浠ュ強涓涓?proxy bean鐨勫畾涔?br />錛堝皯浜唅nterceptor鐨勫畾涔夛級銆?姝ゅ浣犱篃涓嶉渶瑕佹寚瀹氫簨鍔℃柟娉曞畾涔夊湪鍝竴涓帴鍙f垨綾諱腑銆?<beans>
...
<bean id="myTransactionManager"
class="org.springframework.orm.hibernate.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="mySessionFactory"/>
</property>
</bean>
<bean id="myProductServiceTarget" class="product.ProductServiceImpl">
<property name="productDao">
<ref bean="myProductDao"/>
</property>
</bean>
<bean id="myProductService"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="myTransactionManager"/>
</property>
<property name="target">
<ref bean="myProductServiceTarget"/>
</property>
<property name="transactionAttributes">
<props>
<prop key="increasePrice*">PROPAGATION_REQUIRED</prop>
<prop key="someOtherBusinessMethod">PROPAGATION_MANDATORY</prop>
</props>
</property>
</bean>
</beans>
聽聽聽聽聽聽<struts-config>
聽 <data-sources />
聽 <form-beans >
聽聽聽 <form-bean name="logonForm" type="com.xcblcx.struts.form.LogonForm">
聽聽聽 <!-- <form-property name="userName" type="java.lang.String"/>
聽聽聽 <form-property name="password" type="java.lang.String"/> -->
聽聽聽 </form-bean>
聽 </form-beans>
聽 <global-exceptions />
聽 <global-forwards />
聽 <action-mappings >
聽聽聽 <action
聽聽聽聽聽 attribute="logonForm"
聽聽聽聽聽 input="/form/logon.jsp"
聽聽聽聽聽 name="logonForm"
聽聽聽聽聽 path="/Logon"
聽聽聽聽聽 scope="request"
聽聽聽聽聽 type="org.springframework.web.struts.DelegatingActionProxy">
聽聽聽聽聽 <forward name="logon_sc" path="/success.jsp" />
聽聽聽 </action>
聽 </action-mappings>
聽 <message-resources parameter="com.xcblcx.struts.ApplicationResources" />
聽
聽 <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
聽<set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml" />
</plug-in>
</struts-config>
spring鐨勯厤緗枃浠訛細錛堢浉鍏崇墖孌碉級
<beans>
聽聽聽聽聽聽聽聽聽........
聽聽聽聽聽聽聽<bean name="/Logon" class="com.xcblcx.struts.action.LogonAction">
聽聽聽聽聽聽聽聽聽聽聽聽聽聽<property name="CSCEDAO">
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽<ref bean="programmerDAOImpl"/>
聽聽聽聽聽聽聽聽聽聽聽聽聽聽</property>
聽聽聽聽聽聽</bean>
聽</bean>
</beans>
娉ㄥ叆鍒癮ction涓殑programmerDAOImpl娌℃湁闂錛屾垜宸茬粡浣跨敤鏅氬簲鐢ㄧ▼搴忔祴璇曡繃浜嗐?br />鐜板湪闂鏄紝榪愯logon.jsp鐐瑰嚮鎻愪氦鍚庯紝tomcat鎶ラ敊錛?br />
type Status report
message Servlet LogonAction is not available
description
The requested resource (Servlet LogonAction is not available) is not available.
涓嶇煡閬撲負浠涔堬紝 榪樿澶у鍙戣〃鎰忚錛?br />闄勫甫闂竴涓棶棰橈紝鍏充簬spring綆$悊action鐨勯棶棰橈細涓縐嶆槸鍦⊿truts鐨凙ction涓洿鎺ヨ皟鐢⊿pring鐨凚ean錛涘彟涓縐嶆柟寮忔槸灝哠truts鐨凙ction浣滀負Spring Beans錛岀洿鎺ユ敞鍏ユ墍闇璧勬簮錛岀敱Spring榪涜綆$悊銆傞偅縐嶆柟娉曟洿濂戒竴鐐瑰憿錛?/p>