搭建Struts2.1.8.1 Spring3.0.5 Hibernate3.6环境


搭建Struts2.1.8.1 Spring3.0.5 Hibernate3.6环境
2010年12月04日 星期六 15:18

一个项目最近要继续第二阶段开发,希望把开发环境里的类库更新为最新的,于是这几天就一直忙这个。

之前的几篇文摘都是花了很久摘录的,可以做参考

但是绝对不要妄想有什么绝对精简的包

每个人、每一次项目开发的功能不同,依赖的包自然也不同

纵然是Struts2 Spring3 Hibernate3.6版本已经确定了,各个模块也未必全部要用到

 

没办法,被迫无奈一个一个查,即使这样也容易出问题

于是我先找了一个简单的例子,用以前实验好的类库运行起来保证应用无错误,再用最新的类库替换原来的库

基本上和我之前一篇文摘‍的类库差不多,但是仍然少了很多

 

 

例如

1.dbcp依赖common-pool,而c3p0就不需要

2.dbcp和c3p0的properties名字会不同 url vs. jdbcurl

3.spring-web里才有contextloader

4.slf4j-api需要有至少一个实现

5.spring类库彼此依赖,应该先大致加一些,然后再增减

6.common-fileupload依赖common-io

7.spring-web-struts是struts的辅助类库,不是struts2,我添加或去掉后并没什么影响

 

 

反正经验教训一箩筐,而且随着项目的进展肯定会增减新类库

一个一个挑选吧,实践检验道理

 

应该研究一下maven,但那家伙离开网络就玩不起来,学起来也很麻烦,等哪一天手工加到崩溃,再依靠它

 

 

有人说把所有的类库堆在一起运行应用,出了错再说,那你就会死得很惨,同名的类库就找到吐,然后还有冲突的,缺少的(是的,就是把官方的类库全加在路径里也会有缺少的),以及版本太新不兼容的,还是一点一点加比较好。

 

下面是项目的ant片段 32个类包 参考一下 祝你好运

‍file.reference.antlr-2.7.6.jar=lib/antlr-2.7.6.jar
file.reference.c3p0-0.9.1.jar=lib/c3p0-0.9.1.jar
file.reference.cglib-2.2.jar=lib/cglib-2.2.jar
file.reference.commons-collections-3.1.jar=lib/commons-collections-3.1.jar
file.reference.commons-fileupload-1.2.1.jar=lib/commons-fileupload-1.2.1.jar
file.reference.commons-io-1.3.2.jar=lib/commons-io-1.3.2.jar
file.reference.commons-logging-1.0.4.jar=lib/commons-logging-1.0.4.jar
file.reference.commons-logging-api-1.1.jar=lib/commons-logging-api-1.1.jar
file.reference.dom4j-1.6.1.jar=lib/dom4j-1.6.1.jar
file.reference.freemarker-2.3.15.jar=lib/freemarker-2.3.15.jar
file.reference.hibernate-jpa-2.0-api-1.0.0.Final.jar=lib/hibernate-jpa-2.0-api-1.0.0.Final.jar
file.reference.hibernate3.jar=lib/hibernate3.jar
file.reference.javassist-3.12.0.GA.jar=lib/javassist-3.12.0.GA.jar
file.reference.jta-1.1.jar=lib/jta-1.1.jar
file.reference.log4j-1.2.16.jar=lib/log4j-1.2.16.jar
file.reference.mysql-connector-java-5.1.12-bin.jar=lib/mysql-connector-java-5.1.12-bin.jar
file.reference.ognl-2.7.3.jar=lib/ognl-2.7.3.jar
file.reference.org.springframework.asm-3.0.5.RELEASE.jar=lib/org.springframework.asm-3.0.5.RELEASE.jar
file.reference.org.springframework.beans-3.0.5.RELEASE.jar=lib/org.springframework.beans-3.0.5.RELEASE.jar
file.reference.org.springframework.context-3.0.5.RELEASE.jar=lib/org.springframework.context-3.0.5.RELEASE.jar
file.reference.org.springframework.context.support-3.0.5.RELEASE.jar=lib/org.springframework.context.support-3.0.5.RELEASE.jar
file.reference.org.springframework.core-3.0.5.RELEASE.jar=lib/org.springframework.core-3.0.5.RELEASE.jar
file.reference.org.springframework.expression-3.0.5.RELEASE.jar=lib/org.springframework.expression-3.0.5.RELEASE.jar
file.reference.org.springframework.jdbc-3.0.5.RELEASE.jar=lib/org.springframework.jdbc-3.0.5.RELEASE.jar
file.reference.org.springframework.orm-3.0.5.RELEASE.jar=lib/org.springframework.orm-3.0.5.RELEASE.jar
file.reference.org.springframework.transaction-3.0.5.RELEASE.jar=lib/org.springframework.transaction-3.0.5.RELEASE.jar
file.reference.org.springframework.web-3.0.5.RELEASE.jar=lib/org.springframework.web-3.0.5.RELEASE.jar
file.reference.slf4j-api-1.6.1.jar=lib/slf4j-api-1.6.1.jar
file.reference.slf4j-nop-1.6.1.jar=lib/slf4j-nop-1.6.1.jar
file.reference.struts2-core-2.2.1.jar=lib/struts2-core-2.2.1.jar
file.reference.struts2-spring-plugin-2.1.8.1.jar=lib/struts2-spring-plugin-2.1.8.1.jar
file.reference.xwork-core-2.1.6.jar=lib/xwork-core-2.1.6.jar


struts2.1.8+spring3.0.2+hibernate3.3

 

IT的技术日新月异.我还真怕有点跟不上潮流,其实每个项目都用最新的技术,对于学习成本来说是很大的,而且也间接影响到开发效率.这里我配置只是个人爱好.如果是IT管理者,个人建议不要老用新技术.稳定熟悉最好.

1.首先配置struts2.1.8

1.1 这东西大家熟烂了.我个手工添加的.jar包如下:

 


 
对于struts2.1.8,我一般最开始是用最少量的包,如果要添加json等一些,我会另外再到官网找最新的.


1.2 修改web.xml


view plaincopy to clipboardprint?
<!-- struts2.1.6  FilterDispatcher START --> 
    <filter> 
        <filter-name>struts2</filter-name> 
        <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> 
    </filter> 
      
    <filter-mapping> 
        <filter-name>struts2</filter-name> 
        <url-pattern>/*</url-pattern> 
        <dispatcher>FORWARD</dispatcher> 
        <dispatcher>REQUEST</dispatcher> 
    </filter-mapping> 
<!-- struts2.1.6  FilterDispatcher END --> 
<!-- struts2.1.6  FilterDispatcher START -->
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
    </filter>
 
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>FORWARD</dispatcher>
    <dispatcher>REQUEST</dispatcher>
    </filter-mapping>
<!-- struts2.1.6  FilterDispatcher END -->
加入这一段就好了.很方便的struts2配置.


1.3 添加struts.xml


在src下新建立struts.xml.内容如下
view plaincopy to clipboardprint?
<constant name="struts.enable.DynamicMethodInvocation" value="false" /> 
    <constant name="struts.devMode" value="false" /> 
    <include file ="struts-default.xml" />   
      
    <package name="default" namespace="/" extends="struts-default"> 
        <default-action-ref name="test" /> 
        <action name="test"  class="testActionBean" >    
            <result>/test.jsp</result>    
        </action> 
          
    </package> 
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="false" />
    <include file ="struts-default.xml" />
   
    <package name="default" namespace="/" extends="struts-default">
     <default-action-ref name="test" />
     <action name="test"  class="testActionBean" > 
            <result>/test.jsp</result> 
        </action>
     
    </package>
也非常简单..大家能从这里看到.我新添加了一个test.jsp作为测试用页面.还有建立了包test.action;里面有个action:TestAction;


至于里面做问么,大家喜欢怎么测试就怎么测试吧.

 

 

2. 配置spring3.0.2 结合 struts2.1.8


2.1 添加spring3.0.2的jar包如下:


 


其中蓝色的包,代表是加进去了项目的lib里面了.很多吧?是的,因为我懒,这些全加进去不会有冲突,以后还可能得用上不用找.所以就全加了几乎.
这个是我写这篇文章时最新的spring3.0.2的release包.你们看的时候可能不同咯.


2.2 修改web.xml


view plaincopy to clipboardprint?
<!-- 配置spring3.x的上下文配置文件.没有的话spring会报错 --> 
    <context-param> 
        <param-name>contextConfigLocation</param-name> 
        <param-value>classpath*:applicationContext*.xml</param-value> 
    </context-param> 
      
    <!-- struts2.1.6  FilterDispatcher START --> 
    <filter> 
        <filter-name>struts2</filter-name> 
        <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> 
    </filter> 
      
    <filter-mapping> 
        <filter-name>struts2</filter-name> 
        <url-pattern>/*</url-pattern> 
        <dispatcher>FORWARD</dispatcher> 
        <dispatcher>REQUEST</dispatcher> 
    </filter-mapping> 
    <!-- struts2.1.6  FilterDispatcher END --> 
      
    <!-- spring3.x上下文监听器 START --> 
    <listener> 
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 
    <!-- spring3.x上下文监听器 END --> 
<!-- 配置spring3.x的上下文配置文件.没有的话spring会报错 -->
 <context-param>
     <param-name>contextConfigLocation</param-name>
     <param-value>classpath*:applicationContext*.xml</param-value>
 </context-param>
 
 <!-- struts2.1.6  FilterDispatcher START -->
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
    </filter>
 
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>FORWARD</dispatcher>
    <dispatcher>REQUEST</dispatcher>
    </filter-mapping>
    <!-- struts2.1.6  FilterDispatcher END -->
   
    <!-- spring3.x上下文监听器 START -->
    <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
    <!-- spring3.x上下文监听器 END -->


这里跟配置struts2.1.8的时候是有相同的地方,只是加了2段代码.一段是spring3的上下文监听器,一段是spring3的上下文配置文件.不难发现.把struts2.1.8的配置夹在中间了.


2.3 添加applicationContext.xml,内容如下:


view plaincopy to clipboardprint?
<!-- struts2的TestAction托管给spring3.在spring的配置文件也有对应的配置bean --> 
    <bean name="testActionBean" class="test.action.TestAction" /> 
<!-- struts2的TestAction托管给spring3.在spring的配置文件也有对应的配置bean -->
 <bean name="testActionBean" class="test.action.TestAction" />


这是其中最主要的内容.其他的applicationContext.xml格式你们可别节省了!这里我把struts2的action托管给spring3管理.(现实中我不喜欢,都只让spring管理数据访问层做事务.不过删掉就好了.)


2.4 修改struts.xml内容如下:


view plaincopy to clipboardprint?
<!-- Configuration for the default package. --> 
    <constant name="struts.enable.DynamicMethodInvocation" value="false" /> 
    <constant name="struts.devMode" value="false" /> 
    <include file ="struts-default.xml" />   
    <!-- 在struts.xml声明,action交予spring3.x托管 --> 
    <constant name="struts.objectFactory" value="spring"/> 
      
      
    <package name="default" namespace="/" extends="struts-default"> 
        <default-action-ref name="test" /> 
        <action name="test"  class="testActionBean" >    
            <result>/test.jsp</result>    
        </action> 
          
    </package> 
<!-- Configuration for the default package. -->
    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="false" />
    <include file ="struts-default.xml" />
    <!-- 在struts.xml声明,action交予spring3.x托管 -->
    <constant name="struts.objectFactory" value="spring"/>
   
   
    <package name="default" namespace="/" extends="struts-default">
     <default-action-ref name="test" />
     <action name="test"  class="testActionBean" > 
            <result>/test.jsp</result> 
        </action>
     
    </package>


是的,不单只要在spring的配置文件做声明,在struts.xml里也要做声明,而且还有改变了哦.注意看action的地方.
对了,忘记说了,对于struts2-struts1-plugin-2.1.8.1.jar 要不要加呢?我是加了.但remove后,也没问题.迟点再研究吧.


至此.spring3.0.2+struts2.1.8完成!!

 


3. 配置spring3.0.2 结合 hibernate3.3


3.1 导入hibernate3.3的包


在这里,由于我用的是myeclipse8.5,所以我是采用IDE自动导入的方法.我懒.途中的hibernate配置一切按照IDE导入的正常程序进行.
当然,我有3个表:user,address,user_address
从字面上理解是user与address是一对多关系,但由于我要测试多对多,所以,这里是多对多关系,不然也不会有个中间表出现了.


3.2  配置spring3的applicationContext.xml文件:


view plaincopy to clipboardprint?
<!-- 配置hibernate DataSource --> 
    <bean id="DataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/> 
        <property name="url" value="jdbc:mysql://localhost:3306/test"/> 
        <property name="username" value="root"/> 
        <property name="password" value="oookkk"/> 
        <!-- 连接池启动时的初始值 --> 
        <property name="initialSize" value="1"/> 
        <!-- 连接池的最大值 --> 
        <property name="maxActive" value="500"/> 
        <!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 --> 
        <property name="maxIdle" value="3"/> 
        <!--  最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 --> 
        <property name="minIdle" value="2"/> 
    </bean> 
      
    <!-- 配置hibernate的sessionFactory --> 
    <bean id="SessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="DataSource"/> 
    <property name="mappingResources"> 
      <list> 
        <value>test/hibernate/User.hbm.xml</value> 
        <value>test/hibernate/Address.hbm.xml</value> 
      </list> 
    </property> 
    <property name="hibernateProperties"> 
      <value> 
          
        hibernate.dialect=org.hibernate.dialect.MySQL5Dialect  
        hibernate.hbm2ddl.auto=update 
        hibernate.show_sql=false 
        hibernate.format_sql=false 
        hibernate.cache.use_second_level_cache=true 
        hibernate.cache.use_query_cache=false 
        hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider  
      </value> 
    </property> 
  </bean> 
<!-- 配置hibernate DataSource -->
 <bean id="DataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
     <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
     <property name="url" value="jdbc:mysql://localhost:3306/test"/>
     <property name="username" value="root"/>
     <property name="password" value="oookkk"/>
     <!-- 连接池启动时的初始值 -->
        <property name="initialSize" value="1"/>
        <!-- 连接池的最大值 -->
        <property name="maxActive" value="500"/>
        <!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->
        <property name="maxIdle" value="3"/>
        <!--  最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->
        <property name="minIdle" value="2"/>
   </bean>
   
   <!-- 配置hibernate的sessionFactory -->
   <bean id="SessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="DataSource"/>
    <property name="mappingResources">
      <list>
        <value>test/hibernate/User.hbm.xml</value>
        <value>test/hibernate/Address.hbm.xml</value>
      </list>
    </property>
    <property name="hibernateProperties">
      <value>
       
        hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
        hibernate.hbm2ddl.auto=update
        hibernate.show_sql=false
        hibernate.format_sql=false
        hibernate.cache.use_second_level_cache=true
        hibernate.cache.use_query_cache=false
        hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider
      </value>
    </property>
  </bean>


以上是新添加进去的内容段落哦,并不是全部.都有注释了.相信大家很容易明白.当然.如果想程序脱离IDE运行的话,记得给tomcat或者在工程的Lib中加入mysql的驱动包 哦.!我用的是mysql


3.3  阶段测试


   3.3.1 顺利运行
   运行一下以上的配置,很快,你就会在tomcat的命令行里看到 No configuration found. Configuring ehcache from ehcache-failsafe.xml   这个不好看的东西.
原因:报这个错是因为在/sandh/web-inf/classes下面没有ehcache.xml这个文件!这个文件是hibernate缓存配置文件。

解决方法: 从ehcache-1.1.jar   中把文件ehcache-failsafe.xml 解压出来改名 ehcache.xml 复制到classes下面就行了!

然后再运行看看?!  很好,一切正常!

  

   3.3.2  配置DAO运行

   既然可以普通运行通过,那就继续咯.

   myeclipse8.5自动生成的DAO都是继承与BaseHibernateDao的.所以我在这里改了 一下.由于spring3通过sessionFacroty来管理事务的.因此,DAO中需要注入受管的sessionFacroty(虽然我们暂时没配置事务管理器).

   稍微改一下 BaseHibernateDao.继承于HibernateDaoSupport.

view plaincopy to clipboardprint?
public class BaseHibernateDAO extends HibernateDaoSupport{  
      

public class BaseHibernateDAO extends HibernateDaoSupport{
 
}

本来的getSession()可以去掉了.因为 HibernateDaoSupport就是这样的一个接口,并且是final.

然后,在spring里配置一个DAObean,再注入到Action里面试下.

成功了吧? : )


3.4 配置事务

这里就比较麻烦了.希望我的表达能力能够使除我之外的其他朋友们都能理解吧.

3.4.1 首先配置还是配置spring3.0.2的applicationContext.xml,以下会是我完整的配置文件:

view plaincopy to clipboardprint?
<?xml version="1.0" encoding="UTF-8"?> 
<!-- 
  - Middle tier application context definition for the image database. 
  --> 
<beans xmlns="http://www.springframework.org/schema/beans
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance
        xmlns:context="http://www.springframework.org/schema/context
        xmlns:aop="http://www.springframework.org/schema/aop
        xmlns:tx="http://www.springframework.org/schema/tx
        xsi:schemaLocation="http://www.springframework.org/schema/beans  
                http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
                http://www.springframework.org/schema/context   
                http://www.springframework.org/schema/context/spring-context-2.5.xsd  
                http://www.springframework.org/schema/tx   
                http://www.springframework.org/schema/tx/spring-tx-2.5.xsd  
                http://www.springframework.org/schema/aop  
                http://www.springframework.org/schema/aop/spring-aop.xsd"> 
      
    <!-- 配置hibernate DataSource --> 
    <bean id="DataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/> 
        <property name="url" value="jdbc:mysql://localhost:3306/test"/> 
        <property name="username" value="root"/> 
        <property name="password" value="oookkk"/> 
        <!-- 连接池启动时的初始值 --> 
        <property name="initialSize" value="1"/> 
        <!-- 连接池的最大值 --> 
        <property name="maxActive" value="500"/> 
        <!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 --> 
        <property name="maxIdle" value="3"/> 
        <!--  最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 --> 
        <property name="minIdle" value="2"/> 
    </bean> 
      
    <!-- 配置hibernate的sessionFactory --> 
    <bean id="mySessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
        <property name="dataSource" ref="DataSource"/> 
        <property name="mappingResources"> 
        <list> 
            <value>test/hibernate/User.hbm.xml</value> 
            <value>test/hibernate/Address.hbm.xml</value> 
        </list> 
        </property> 
        <property name="hibernateProperties"> 
            <value> 
                hibernate.dialect=org.hibernate.dialect.MySQL5Dialect  
                hibernate.hbm2ddl.auto=update 
                hibernate.show_sql=false 
                hibernate.format_sql=false 
                hibernate.cache.use_second_level_cache=true 
                hibernate.cache.use_query_cache=false 
                hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider  
            </value> 
        </property> 
    </bean> 
    <!--  hibernate.dialect=org.hibernate.dialect.HSQLDialect  --> 
      
    <!-- 配置事务管理器 --> 
    <bean id="myTxManager"  class="org.springframework.orm.hibernate3.HibernateTransactionManager" > 
        <property name="sessionFactory" ref="mySessionFactory"/> 
    </bean> 
      
    <!-- 配置事务的属性 --> 
    <tx:advice id="txAdvice" transaction-manager="myTxManager"> 
        <tx:attributes> 
            <tx:method name="find*" propagation="REQUIRED"/> 
            <tx:method name="save*" propagation="REQUIRED"/> 
            <tx:method name="someOtherBusinessMethod" propagation="REQUIRES_NEW"/> 
            <tx:method name="*" propagation="SUPPORTS" read-only="true"/> 
        </tx:attributes> 
    </tx:advice> 
      
    <!-- 切面配置, --> 
    <aop:config> 
        <aop:pointcut id="userServiceMethods" expression="execution(* test.service.UserService.*(..))"/> 
        <aop:advisor advice-ref="txAdvice" pointcut-ref="userServiceMethods"/> 
    </aop:config> 
      
    <!-- 配置userService的bean --> 
    <bean id="userService" class="test.service.UserServiceImpl"> 
        <property name="userDAO" ref="userDAO" /> 
    </bean> 
      
    <bean id="userDAO" class="test.hibernate.UserDAO"> 
        <property name="sessionFactory" ref="mySessionFactory"/> 
    </bean> 
      
      
      
      
    <!-- struts2的TestAction托管给spring3.在spring的配置文件也有对应的配置bean --> 
    <bean name="testActionBean" class="test.action.TestAction" > 
        <property name="userService" ref="userService" /> 
    </bean> 
      
</beans> 
<?xml version="1.0" encoding="UTF-8"?>
<!--
  - Middle tier application context definition for the image database.
  -->
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:context="http://www.springframework.org/schema/context"
  xmlns:aop="http://www.springframework.org/schema/aop"
  xmlns:tx="http://www.springframework.org/schema/tx"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
     http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-2.5.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop.xsd">
 
 <!-- 配置hibernate DataSource -->
 <bean id="DataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
     <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
     <property name="url" value="jdbc:mysql://localhost:3306/test"/>
     <property name="username" value="root"/>
     <property name="password" value="oookkk"/>
     <!-- 连接池启动时的初始值 -->
        <property name="initialSize" value="1"/>
        <!-- 连接池的最大值 -->
        <property name="maxActive" value="500"/>
        <!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->
        <property name="maxIdle" value="3"/>
        <!--  最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->
        <property name="minIdle" value="2"/>
   </bean>
   
   <!-- 配置hibernate的sessionFactory -->
   <bean id="mySessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
     <property name="dataSource" ref="DataSource"/>
     <property name="mappingResources">
       <list>
         <value>test/hibernate/User.hbm.xml</value>
         <value>test/hibernate/Address.hbm.xml</value>
       </list>
     </property>
     <property name="hibernateProperties">
        <value>
          hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
          hibernate.hbm2ddl.auto=update
          hibernate.show_sql=false
          hibernate.format_sql=false
          hibernate.cache.use_second_level_cache=true
          hibernate.cache.use_query_cache=false
          hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider
        </value>
     </property>
   </bean>
   <!--  hibernate.dialect=org.hibernate.dialect.HSQLDialect  -->
   
   <!-- 配置事务管理器 -->
   <bean id="myTxManager"  class="org.springframework.orm.hibernate3.HibernateTransactionManager" >
     <property name="sessionFactory" ref="mySessionFactory"/>
   </bean>
   
 <!-- 配置事务的属性 -->
   <tx:advice id="txAdvice" transaction-manager="myTxManager">
     <tx:attributes>
        <tx:method name="find*" propagation="REQUIRED"/>
        <tx:method name="save*" propagation="REQUIRED"/>
        <tx:method name="someOtherBusinessMethod" propagation="REQUIRES_NEW"/>
        <tx:method name="*" propagation="SUPPORTS" read-only="true"/>
     </tx:attributes>
   </tx:advice>
   
   <!-- 切面配置, -->
   <aop:config>
     <aop:pointcut id="userServiceMethods" expression="execution(* test.service.UserService.*(..))"/>
     <aop:advisor advice-ref="txAdvice" pointcut-ref="userServiceMethods"/>
   </aop:config>
   
 <!-- 配置userService的bean -->
 <bean id="userService" class="test.service.UserServiceImpl">
  <property name="userDAO" ref="userDAO" />
 </bean>
 
 <bean id="userDAO" class="test.hibernate.UserDAO">
     <property name="sessionFactory" ref="mySessionFactory"/>
   </bean>
 
 
 
 
 <!-- struts2的TestAction托管给spring3.在spring的配置文件也有对应的配置bean -->
 <bean name="testActionBean" class="test.action.TestAction" >
  <property name="userService" ref="userService" />
 </bean>
 
</beans>

其中里面需要额外增加的配置标签有:myTxManager;txAdvice;aop:config.

这3个是spring3.0.2中配置事务的重要标签(当然,不包括你说的注解方式等等等等).这里只演示声明式的一般的用法.

我这里偷懒了.其实在你慢慢一步一步配置的时候,应该会遇到3个错误:

第一个:少了com.springsource.org.aopalliance-1.0.0.jar 这个包.其实不用太注重名字,认得aopalliance就好了

第二个:少了com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar 这个包.

第三个:就是你写<aop:config> 可能会提示错误.这是由于你的<beans> 的声明处少了aop的一些规则.在我的以上的文件都配置好了.可以对照自己出错时的来看.

当然咯,你们没出错就更好了.由于包是我手动的,所以肯定会有漏的时候.

3.4.2  就是要写你的service类咯

我这里就不详细贴出我的代码了.免得太臃肿.其实你看我以上的配置,可以完全确定我的包路径的了.跟spring2.5的基本一样.

这里需要注意的是,配置事务的时候.service的class以及spring3中对于aop的切面的表达式,这里容易犯的错误是大小写以及写错了impl还是interface.

3.4.3  接着我就随便弄了几个方法来玩,一个是有事务,一个没有事务.都用相同的代码,都会抛出异常.实验证明配置正确.有事务的回滚了.没事务的没有回滚.

**注意:最后配置完,需要谨慎的检查自己的代码,不要全按着我写哦.这样很容易跟自己的混乱难以找出错误.就像我上面配置完了spring+hibernate后,其实action bean那我将userDAO换成了userService注入了.所以大家还是得谨慎再谨慎.其他细节我就没说咯.

希望大家能够成功!

4.  配置proxool

4.1 添加proxool包

 


我用的是写着文章时的最新版本

proxool-0.9.1.jar

proxool-cglib.jar

4.2  配置applicationContext.xml

view plaincopy to clipboardprint?
<!--  配置hibernate DataSource Proxool的连接池 --> 
    <bean id="DataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource"> 
        <property name="driver" value="com.mysql.jdbc.Driver" /> 
        <property name="driverUrl" 
            value="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8" /> 
        <property name="user" value="root" /> 
        <property name="password" value="oookkk" /> 
        <property name="alias"> 
            <value>DB</value> 
        </property> 
        <!--<property name="delegateProperties"> 
            <value>user=bestvsns,password=bestvwin</value> 
        </property> 
        --><!-- 自动检查连接是否断掉开关 --> 
        <property name="testBeforeUse"> 
            <value>true</value> 
        </property> 
        <!-- 自动检查连接是否断的测试sql语句 --> 
        <property name="houseKeepingTestSql"> 
            <value>select sysdate() from dual</value> 
        </property> 
        <!-- 一个活动连接的最长时间15分钟,单位毫秒 --> 
        <property name="maximumActiveTime"> 
            <value>900000</value> 
        </property> 
        <!-- 一个连接的最长活动时间4小时,单位毫秒   
        <property name="maximum-connection-count"> 
            <value>14400000</value> 
        </property> 
        <property name="houseKeepingSleepTime"> 
            <value>90000</value> 
        </property> 
        <property name="prototypeCount"> 
            <value>5</value> 
        </property>--> 
        <property name="maximumConnectionCount"> 
            <value>100</value> 
        </property> 
        <property name="minimumConnectionCount"> 
            <value>10</value> 
        </property> 
        <property name="trace"> 
            <value>true</value> 
        </property> 
        <property name="verbose"> 
            <value>true</value> 
        </property> 
    </bean> 
<!--  配置hibernate DataSource Proxool的连接池 -->
 <bean id="DataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource">
  <property name="driver" value="com.mysql.jdbc.Driver" />
  <property name="driverUrl"
   value="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8" />
  <property name="user" value="root" />
  <property name="password" value="oookkk" />
  <property name="alias">
   <value>DB</value>
  </property>
  <!--<property name="delegateProperties">
   <value>user=bestvsns,password=bestvwin</value>
  </property>
  --><!-- 自动检查连接是否断掉开关 -->
  <property name="testBeforeUse">
   <value>true</value>
  </property>
  <!-- 自动检查连接是否断的测试sql语句 -->
  <property name="houseKeepingTestSql">
   <value>select sysdate() from dual</value>
  </property>
  <!-- 一个活动连接的最长时间15分钟,单位毫秒 -->
  <property name="maximumActiveTime">
   <value>900000</value>
  </property>
  <!-- 一个连接的最长活动时间4小时,单位毫秒
  <property name="maximum-connection-count">
   <value>14400000</value>
  </property>
  <property name="houseKeepingSleepTime">
   <value>90000</value>
  </property>
  <property name="prototypeCount">
   <value>5</value>
  </property>-->
  <property name="maximumConnectionCount">
   <value>100</value>
  </property>
  <property name="minimumConnectionCount">
   <value>10</value>
  </property>
  <property name="trace">
   <value>true</value>
  </property>
  <property name="verbose">
   <value>true</value>
  </property>
 </bean>

很多人其实会很奇怪为什么我会用这样的配置.(可以写proxool.xml等很多引入的配置方式)

 


但是我可以非常清晰的告诉你们,在SSH+PROXOOL这样的配置中.如果用引入的方式,会导致查找不到proxool的别名数据库错误.

这是由于在proxool还没生成链接池的时候,spring3就先它一步引用了它,所以出现异常.

网上有其他的解决办法,例如延迟spring3的加载,可是这样又会致使struts2跟spring3的结合异常.所以我才使用以上的配置方式.

就这样.没其他事了.当然,如果你喜欢可以加上proxool的检查连接池的APP.不过....我没加,因为我懒.

 


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值