步骤五:struts+spring 集成
在 struts 的配置文件 struts-config.xml 中以插件的方式集成spring,同时配置全局的委托代理(可选)。
注意:plug-in 插件必须写在配置文件的最后一项。
struts-config.xml配置文件:
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE struts-config PUBLIC
- "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
- "http://struts.apache.org/dtds/struts-config_1_2.dtd">
- <struts-config>
- <data-sources />
- <form-beans >
- </form-beans>
- <global-exceptions />
- <global-forwards />
- <action-mappings >
- </action-mappings>
- <!-- 集成Spring -->
- <!-- 全局委托代理 -->
- <controller>
- <set-property value="org.springframework.web.struts.DelegatingRequestProcessor" property="processorClass"/>
- </controller>
- <!-- 注入spring插件 -->
- <plug-in
- className="org.springframework.web.struts.ContextLoaderPlugIn">
- <set-property property="contextConfigLocation"
- value="/WEB-INF/applicationContext.xml"/>
- </plug-in>
- </struts-config>
步骤六:在Spring中配置事务管理—applicationContext.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <beans
- xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:p="http://www.springframework.org/schema/p"
- xsi:schemaLocation="
- http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
- <!-- 配置数据源 -->
- <bean id="dataSource"
- class="org.apache.commons.dbcp.BasicDataSource"
- destroy-method="close">
- <!--JDBC驱动-->
- <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
- <!--数据库URL-->
- <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl" />
- <!--数据库用户名-->
- <property name="username" value="scott" />
- <!--数据库密码-->
- <property name="password" value="tiger" />
- </bean>
- <!-- 事务管理器 -->
- <bean id="transactionManager"
- class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
- <property name="dataSource" ref="dataSource" />
- </bean>
- <!-- 事务代理基类 -->
- <bean id="txProxyTemplate" abstract="true" lazy-init="true"
- class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
- <property name="transactionManager" ref="transactionManager"></property>
- <property name="transactionAttributes">
- <props>
- <prop key="do*">PROPAGATION_REQUIRED,-Exception</prop>
- </props>
- </property>
- </bean>
- </beans>
事务特性:
PROPAGATION_REQUIRED: 在当前的事务中进行,如果没有就建立一个新的事务
PROPAGATION_REQUIRES_NEW: 建立一个新的事务,如果现存一个事务就暂停它
PROPAGATION_MANDATORY: 方法必须在一个现存的事务中进行,否则丢出异常
PROPAGATION_NESTED: 在一个嵌入的事务中进行,如果不是,则同PROPAGATION_REQUIRED
PROPAGATION_NEVER: 指出不应在事务中进行,如果有就丢出异常
PROPAGATION_NOT_SUPPORTED: 指出不应在事务中进行,如果有就暂停现存的事务
PROPAGATION_SUPPORTS: 支持现在的事务,如果没有就以非事务的方式执行
事务应用:
- <bean id="EmpService" parent="txProxyTemplate">
- <property name="target">
- <bean class="com.test.EmpServiceImpl">
- <property name="empDao" ref="EmpDao"></property>
- </bean>
- </property>
- </bean>
注意:
不应该调用一个数据源的 getConnection()方法和Connection的close()方法,而必须使用Spring的 org.springframework.jdbc.datasource.DataSourceUtils类
如下:
Connection conn = DataSourceUtils.getConnection(dataSource);
…
DataSourceUtils.releaseConnection(conn, dataSource);