Spring2.5.6+Struts2.3.1+Hibernate3的整合

要整合SSH,简言之:将struts的Action交由Spring的容器来管理,hibernate的sessionFactory交由Spring容器来管理,而让web container启动时自动加载相关的Spring容器。

说是很简单,但我在进行整合时也是遇到了一些问题,主要是相关的jar包导入不全或导入的版本不相兼容所至,所以特别的在最后用图的形式贴出来。

如下图:

Struts (Web page) <---> Spring DI <--> Hibernate (DAO) <---> Database
the summary is:

To integrate all those technologies together, you should..

  1. Integrate Spring with Hibernate with Spring’s “LocalSessionFactoryBean” class.
  2. Integrate Spring with Struts via Spring’s ready make Struts plug-in – “ContextLoaderListener“. 如下为项目结构图:见projectView.jpg, 项目用到的lib:见projectViewLibs.jpg。 主要步骤如下: 1,新建一web project后,修改web.xml如下:
  3. <?xml version="1.0" encoding="UTF-8"?>
  4. <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
  5. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  6. xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
  7. http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  8. <display-name>java_eBooking</display-name>
  9. <welcome-file-list>
  10. <welcome-file>index.jsp</welcome-file>
  11. </welcome-file-list>
  12. <!--  
  13. 1、指定spring的配置文件,默认从webroot根目录(即webroot/WEB-INF/,跟web.xml要并列同级目录)寻找配置文件,  
  14. 我们可以通过spring提供的classpath*:前缀指定从类路径下寻找  contextConfigLocation
  15. -->
  16. <!-- 
  17. <context-param>
  18. <param-name>contextConfigLocation</param-name>
  19. <param-value>/WEB-INF/classes/applicationContext.xml
  20. </param-value>
  21. </context-param>
  22. -->
  23. <listener>
  24. <listener-class>
  25. org.springframework.web.context.ContextLoaderListener
  26. </listener-class>
  27. </listener>
  28. <context-param>
  29. <param-name>contextConfigLocation</param-name>
  30. <param-value>classpath*:applicationContext.xml</param-value>
  31. </context-param>
  32. <filter>
  33. <filter-name>struts2</filter-name>
  34. <filter-class>
  35. org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
  36. </filter-class>
  37. </filter>
  38. <filter-mapping>
  39. <filter-name>struts2</filter-name>
  40. <url-pattern>/*</url-pattern>
  41. </filter-mapping>
  42. </web-app> 2,在src下新建struts.xml.具体如下:
  43. <?xml version="1.0" encoding="UTF-8" ?>
  44. <!DOCTYPE struts PUBLIC
  45.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
  46.     "http://struts.apache.org/dtds/struts-2.0.dtd">
  47. <struts>
  48.     <constant name="struts.objectFactory" value="spring" />
  49.     <constant name="struts.devMode" value="true" />
  50.     <package name="product" extends="struts-default">
  51.         <action name="list" class="hellowordAction" method="execute">
  52.             <result>ebooking/list.jsp</result>
  53.             <result name="input">ebooking/list.jsp</result>
  54.         </action>
  55.         <action name="remove" class="hellowordAction" method="remove">
  56.             <result>ebooking/list.jsp</result>
  57.             <result name="input">ebooking/list.jsp</result>
  58.         </action>
  59.         <action name="save" class="hellowordAction" method="save">
  60.             <result>ebooking/list.jsp</result>
  61.             <result name="input">ebooking/list.jsp</result>
  62.         </action>
  63.     </package>
  64. </struts> 3,在src下新建applicationContext.xml.具体如下:
  65. <?xml version="1.0" encoding="UTF-8"?>
  66. <beans xmlns="http://www.springframework.org/schema/beans"
  67. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  68. xmlns:context="http://www.springframework.org/schema/context"
  69. xsi:schemaLocation="http://www.springframework.org/schema/beans
  70.            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
  71.            http://www.springframework.org/schema/context 
  72.         http://www.springframework.org/schema/context/spring-context-2.5.xsd">
  73. <bean id="productService"
  74. class="com.ebooking.service.EbookingService" />
  75. <bean id="hellowordService"
  76. class="com.ebooking.service.HelloWordService">
  77. <property name="helloWordDao" ref="helloWordDao"></property>
  78. </bean>
  79. <bean id="eBookingAction"
  80. class="com.ebooking.web.struts.action.EbookingAction"
  81. scope="prototype">
  82. </bean>
  83. <bean id="hellowordAction"
  84. class="com.ebooking.web.struts.action.HelloWordAction"
  85. scope="prototype">
  86. <constructor-arg ref="hellowordService" />
  87. </bean>
  88. <bean id="helloWordDao"
  89. class="com.ebooking.dao.impl.HelloWordDaoImpl">
  90. <property name="sessionFactory" ref="sessionFactory" />
  91. </bean>
  92. <!--加载PropertyPlaceholderConfigurer后,就可以使用${jdbc.username}占位符了-->
  93. <bean
  94. class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  95. <property name="locations">
  96. <value>classpath:conn/jdbc.properties</value>
  97. </property>
  98. </bean>
  99. <bean id="sessionFactory"
  100. class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  101. <property name="dataSource" ref="dataSource" />
  102. <property name="mappingResources">
  103. <list>
  104. <value>com/ebooking/model/ebooking.hbm.xml</value>
  105. </list>
  106. </property>
  107. <property name="hibernateProperties">
  108. <props>
  109. <prop key="hibernate.dialect">
  110. org.hibernate.dialect.SQLServerDialect
  111. </prop>
  112. <prop key="hibernate.show_sql">true</prop>
  113. <prop key="hibernate.generate_statistics">true</prop>
  114. </props>
  115. </property>
  116. </bean>
  117. <bean id="dataSource"
  118. class="com.mchange.v2.c3p0.ComboPooledDataSource"
  119. destroy-method="close">
  120. <property name="driverClass" value="${jdbc.driverClassName}" />
  121. <property name="jdbcUrl" value="${jdbc.url}" />
  122. <property name="user" value="${jdbc.username}" />
  123. <property name="password" value="${jdbc.password}" />
  124. <property name="minPoolSize" value="2" />
  125. <property name="initialPoolSize" value="3" />
  126. <property name="maxPoolSize" value="10" />
  127. <property name="maxIdleTime" value="1800" />
  128. <property name="acquireIncrement" value="2" />
  129. <property name="maxStatements" value="3" />
  130. <property name="idleConnectionTestPeriod" value="1800" />
  131. <property name="acquireRetryAttempts" value="3" />
  132. </bean>
  133. </beans>  4,在“src/conn/”新建jdbc.properties:
  134. jdbc.driverClassName=net.sourceforge.jtds.jdbc.Driver
  135. jdbc.url=jdbc:jtds:sqlserver://localhost:1433/jpetstore
  136. jdbc.username=sa
  137. jdbc.password=db*888  5,src目录下新建log4j.xml,具体如下:
  138. <?xml version="1.0" encoding="UTF-8" ?>
  139. <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
  140. <log4j:configuration>
  141. <appender name="logs"
  142. class="org.apache.log4j.RollingFileAppender">
  143. <param name="Encoding" value="GBK" />
  144. <param name="File" value="logs/logs.log" />
  145. <param name="MaxBackupIndex" value="300" />
  146. <param name="MaxFileSize" value="100000" />
  147. <layout class="org.apache.log4j.PatternLayout">
  148. <param name="ConversionPattern"
  149. value="%d{ISO8601} %p - %m %n" />
  150. </layout>
  151. <filter class="org.apache.log4j.varia.LevelRangeFilter">
  152. <param name="LevelMin" value="info" />
  153. <param name="LevelMax" value="error" />
  154. <param name="acceptOnMatch" value="true" />
  155. </filter>
  156. </appender>
  157. <logger name="com.ebooking.service" additivity="false">
  158. <level value="info" />
  159. <appender-ref ref="logs" />
  160. </logger>
  161.   <root>
  162. <priority value="info" />
  163. <appender-ref ref="logs" />
  164. </root>
  165. </log4j:configuration>
  166. 注意: 由于 我并没有用到事务,所有在web.xml中并没有配置 openSessionInView这个filter, 如有用到或者当进行session.load(id)时必须在web.xml中作如下配置,否则会报错。 报错信息大致如下: 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. 当有用到事务,但并没有指定用 openSessionInView时,spring就会将所有的事务当作是只读事务来处理,当进行hibernateTemplate.save(ebooking)时就会报一个说是当前session处理于 read only状态,禁止进行写操作。  <filter> <filter-name>openSessionInView</filter-name> <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class> <init-param> <param-name>sessionFactoryBeanName</param-name> <param-value>sf</param-value> </init-param> </filter> <filter-mapping> <filter-name>openSessionInView</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
===增加事务配置如下,当然如果有许多服务对象,你想为他们分别设置 完全不同 的事务语义。 在Spring中,你可以通过分别定义特定的 <advisor></advisor> 元素, 让每个advisor采用不同的 'pointcut' 和 'advice-ref' 属性,来达到目的。 <!-- //jdbc datasource txManager <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> --> <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"><property name="sessionFactory" ref="sessionFactory"></property></bean><config><pointcut id="bussinessService" expression="execution(public * com.ebooking.service.*.*(..))"></pointcut><advisor pointcut-ref="bussinessService" advice-ref="txAdvice"></advisor></config><advice id="txAdvice" transaction-manager="txManager"><attributes><method name="list" read-only="true"></method><method name="*" propagation="REQUIRED"></method></attributes></advice>

猜你喜欢

转载自hunter090730.iteye.com/blog/1338897