struts2.1.8+spring3.0.2+hibernate3.3

来源:互联网 发布:python jsonrpc 编辑:程序博客网 时间:2024/04/29 00:53

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

1.首先配置struts2.1.8

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


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

1.2 修改web.xml

[xhtml] view plaincopyprint?
  1. <!-- struts2.1.6  FilterDispatcher START --> 
  2.     <filter> 
  3.         <filter-name>struts2</filter-name> 
  4.         <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> 
  5.     </filter> 
  6.      
  7.     <filter-mapping> 
  8.         <filter-name>struts2</filter-name> 
  9.         <url-pattern>/*</url-pattern> 
  10.         <dispatcher>FORWARD</dispatcher> 
  11.         <dispatcher>REQUEST</dispatcher> 
  12.     </filter-mapping> 
  13. <!-- struts2.1.6  FilterDispatcher END --> 
加入这一段就好了.很方便的struts2配置.

1.3 添加struts.xml

在src下新建立struts.xml.内容如下
[xhtml] view plaincopyprint?
  1. <constantname="struts.enable.DynamicMethodInvocation"value="false"/> 
  2.     <constantname="struts.devMode"value="false"/> 
  3.     <includefile ="struts-default.xml"/>  
  4.      
  5.     <packagename="default"namespace="/"extends="struts-default"> 
  6.         <default-action-refname="test"/> 
  7.         <actionname="test" class="testActionBean">   
  8.             <result>/test.jsp</result>   
  9.         </action> 
  10.          
  11.     </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

[xhtml] view plaincopyprint?
  1. <!-- 配置spring3.x的上下文配置文件.没有的话spring会报错 --> 
  2.     <context-param> 
  3.         <param-name>contextConfigLocation</param-name> 
  4.         <param-value>classpath*:applicationContext*.xml</param-value> 
  5.     </context-param> 
  6.      
  7.     <!-- struts2.1.6  FilterDispatcher START --> 
  8.     <filter> 
  9.         <filter-name>struts2</filter-name> 
  10.         <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> 
  11.     </filter> 
  12.      
  13.     <filter-mapping> 
  14.         <filter-name>struts2</filter-name> 
  15.         <url-pattern>/*</url-pattern> 
  16.         <dispatcher>FORWARD</dispatcher> 
  17.         <dispatcher>REQUEST</dispatcher> 
  18.     </filter-mapping> 
  19.     <!-- struts2.1.6  FilterDispatcher END --> 
  20.      
  21.     <!-- spring3.x上下文监听器 START --> 
  22.     <listener> 
  23.         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
  24.     </listener> 
  25.     <!-- spring3.x上下文监听器 END --> 

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

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

[xhtml] view plaincopyprint?
  1. <!-- struts2的TestAction托管给spring3.在spring的配置文件也有对应的配置bean --> 
  2.     <bean name="testActionBean"class="test.action.TestAction"/> 

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

2.4 修改struts.xml内容如下:

[xhtml] view plaincopyprint?
  1. <!-- Configuration for the default package. --> 
  2.     <constantname="struts.enable.DynamicMethodInvocation"value="false"/> 
  3.     <constantname="struts.devMode"value="false"/> 
  4.     <includefile ="struts-default.xml"/>  
  5.     <!-- 在struts.xml声明,action交予spring3.x托管 --> 
  6.     <constantname="struts.objectFactory"value="spring"/> 
  7.      
  8.      
  9.     <packagename="default"namespace="/"extends="struts-default"> 
  10.         <default-action-refname="test"/> 
  11.         <actionname="test" class="testActionBean">   
  12.             <result>/test.jsp</result>   
  13.         </action> 
  14.          
  15.     </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文件:

[xhtml] view plaincopyprint?
  1. <!-- 配置hibernate DataSource --> 
  2.     <bean id="DataSource"class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close"> 
  3.         <propertyname="driverClassName"value="com.mysql.jdbc.Driver"/> 
  4.         <propertyname="url"value="jdbc:mysql://localhost:3306/test"/> 
  5.         <propertyname="username"value="root"/> 
  6.         <propertyname="password"value="oookkk"/> 
  7.         <!-- 连接池启动时的初始值 --> 
  8.         <propertyname="initialSize"value="1"/> 
  9.         <!-- 连接池的最大值 --> 
  10.         <propertyname="maxActive"value="500"/> 
  11.         <!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 --> 
  12.         <propertyname="maxIdle"value="3"/> 
  13.         <!--  最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 --> 
  14.         <propertyname="minIdle"value="2"/> 
  15.     </bean> 
  16.      
  17.     <!-- 配置hibernate的sessionFactory --> 
  18.     <bean id="SessionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
  19.     <propertyname="dataSource"ref="DataSource"/> 
  20.     <propertyname="mappingResources"> 
  21.       <list> 
  22.         <value>test/hibernate/User.hbm.xml</value> 
  23.         <value>test/hibernate/Address.hbm.xml</value> 
  24.       </list> 
  25.     </property> 
  26.     <propertyname="hibernateProperties"> 
  27.       <value> 
  28.          
  29.         hibernate.dialect=org.hibernate.dialect.MySQL5Dialect 
  30.         hibernate.hbm2ddl.auto=update 
  31.         hibernate.show_sql=false 
  32.         hibernate.format_sql=false 
  33.         hibernate.cache.use_second_level_cache=true 
  34.         hibernate.cache.use_query_cache=false 
  35.         hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider 
  36.       </value> 
  37.     </property> 
  38.   </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.

[java] view plaincopyprint?
  1. public class BaseHibernateDAOextends HibernateDaoSupport{ 
  2.      

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

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

成功了吧? : )

3.4 配置事务

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

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

[xhtml] view plaincopyprint?
  1. <?xmlversion="1.0"encoding="UTF-8"?> 
  2. <!--
  3.   - Middle tier application context definition for the image database.
  4.   --> 
  5. <beansxmlns="http://www.springframework.org/schema/beans" 
  6.         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  7.         xmlns:context="http://www.springframework.org/schema/context" 
  8.         xmlns:aop="http://www.springframework.org/schema/aop" 
  9.         xmlns:tx="http://www.springframework.org/schema/tx" 
  10.         xsi:schemaLocation="http://www.springframework.org/schema/beans 
  11.                 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
  12.                 http://www.springframework.org/schema/context  
  13.                 http://www.springframework.org/schema/context/spring-context-2.5.xsd 
  14.                 http://www.springframework.org/schema/tx  
  15.                 http://www.springframework.org/schema/tx/spring-tx-2.5.xsd 
  16.                 http://www.springframework.org/schema/aop 
  17.                 http://www.springframework.org/schema/aop/spring-aop.xsd"> 
  18.      
  19.     <!-- 配置hibernate DataSource --> 
  20.     <bean id="DataSource"class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close"> 
  21.         <propertyname="driverClassName"value="com.mysql.jdbc.Driver"/> 
  22.         <propertyname="url"value="jdbc:mysql://localhost:3306/test"/> 
  23.         <propertyname="username"value="root"/> 
  24.         <propertyname="password"value="oookkk"/> 
  25.         <!-- 连接池启动时的初始值 --> 
  26.         <propertyname="initialSize"value="1"/> 
  27.         <!-- 连接池的最大值 --> 
  28.         <propertyname="maxActive"value="500"/> 
  29.         <!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 --> 
  30.         <propertyname="maxIdle"value="3"/> 
  31.         <!--  最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 --> 
  32.         <propertyname="minIdle"value="2"/> 
  33.     </bean> 
  34.      
  35.     <!-- 配置hibernate的sessionFactory --> 
  36.     <bean id="mySessionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
  37.         <propertyname="dataSource"ref="DataSource"/> 
  38.         <propertyname="mappingResources"> 
  39.         <list> 
  40.             <value>test/hibernate/User.hbm.xml</value> 
  41.             <value>test/hibernate/Address.hbm.xml</value> 
  42.         </list> 
  43.         </property> 
  44.         <propertyname="hibernateProperties"> 
  45.             <value> 
  46.                 hibernate.dialect=org.hibernate.dialect.MySQL5Dialect 
  47.                 hibernate.hbm2ddl.auto=update 
  48.                 hibernate.show_sql=false 
  49.                 hibernate.format_sql=false 
  50.                 hibernate.cache.use_second_level_cache=true 
  51.                 hibernate.cache.use_query_cache=false 
  52.                 hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider 
  53.             </value> 
  54.         </property> 
  55.     </bean> 
  56.     <!--  hibernate.dialect=org.hibernate.dialect.HSQLDialect  --> 
  57.      
  58.     <!-- 配置事务管理器 --> 
  59.     <beanid="myTxManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
  60.         <propertyname="sessionFactory"ref="mySessionFactory"/> 
  61.     </bean> 
  62.      
  63.     <!-- 配置事务的属性 --> 
  64.     <tx:adviceid="txAdvice"transaction-manager="myTxManager"> 
  65.         <tx:attributes> 
  66.             <tx:methodname="find*"propagation="REQUIRED"/> 
  67.             <tx:methodname="save*"propagation="REQUIRED"/> 
  68.             <tx:methodname="someOtherBusinessMethod"propagation="REQUIRES_NEW"/> 
  69.             <tx:methodname="*"propagation="SUPPORTS"read-only="true"/> 
  70.         </tx:attributes> 
  71.     </tx:advice> 
  72.      
  73.     <!-- 切面配置, --> 
  74.     <aop:config> 
  75.         <aop:pointcutid="userServiceMethods"expression="execution(* test.service.UserService.*(..))"/> 
  76.         <aop:advisoradvice-ref="txAdvice"pointcut-ref="userServiceMethods"/> 
  77.     </aop:config> 
  78.      
  79.     <!-- 配置userService的bean --> 
  80.     <bean id="userService"class="test.service.UserServiceImpl"> 
  81.         <propertyname="userDAO"ref="userDAO"/> 
  82.     </bean> 
  83.      
  84.     <bean id="userDAO"class="test.hibernate.UserDAO"> 
  85.         <propertyname="sessionFactory"ref="mySessionFactory"/> 
  86.     </bean> 
  87.      
  88.      
  89.      
  90.      
  91.     <!-- struts2的TestAction托管给spring3.在spring的配置文件也有对应的配置bean --> 
  92.     <bean name="testActionBean"class="test.action.TestAction"> 
  93.         <propertyname="userService"ref="userService"/> 
  94.     </bean> 
  95.      
  96. </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

[xhtml] view plaincopyprint?
  1. <!--  配置hibernate DataSource Proxool的连接池 --> 
  2.     <bean id="DataSource"class="org.logicalcobwebs.proxool.ProxoolDataSource"> 
  3.         <propertyname="driver"value="com.mysql.jdbc.Driver"/> 
  4.         <propertyname="driverUrl" 
  5.             value="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8"/> 
  6.         <propertyname="user"value="root"/> 
  7.         <propertyname="password"value="oookkk"/> 
  8.         <propertyname="alias"> 
  9.             <value>DB</value> 
  10.         </property> 
  11.         <!--<propertyname="delegateProperties"> 
  12.             <value>user=bestvsns,password=bestvwin</value> 
  13.         </property> 
  14.         --><!-- 自动检查连接是否断掉开关 --> 
  15.         <propertyname="testBeforeUse"> 
  16.             <value>true</value> 
  17.         </property> 
  18.         <!-- 自动检查连接是否断的测试sql语句 --> 
  19.         <propertyname="houseKeepingTestSql"> 
  20.             <value>select sysdate() from dual</value> 
  21.         </property> 
  22.         <!-- 一个活动连接的最长时间15分钟,单位毫秒 --> 
  23.         <propertyname="maximumActiveTime"> 
  24.             <value>900000</value> 
  25.         </property> 
  26.         <!-- 一个连接的最长活动时间4小时,单位毫秒  
  27.         <propertyname="maximum-connection-count"> 
  28.             <value>14400000</value> 
  29.         </property> 
  30.         <propertyname="houseKeepingSleepTime"> 
  31.             <value>90000</value> 
  32.         </property> 
  33.         <propertyname="prototypeCount"> 
  34.             <value>5</value> 
  35.         </property>--> 
  36.         <propertyname="maximumConnectionCount"> 
  37.             <value>100</value> 
  38.         </property> 
  39.         <propertyname="minimumConnectionCount"> 
  40.             <value>10</value> 
  41.         </property> 
  42.         <propertyname="trace"> 
  43.             <value>true</value> 
  44.         </property> 
  45.         <propertyname="verbose"> 
  46.             <value>true</value> 
  47.         </property> 
  48.     </bean> 

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


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

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

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

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

0 0