Believe it,do it!

Ideal is the beacon. Without ideal, there is no secure direction; without direction ,there is no life.
理想是指路明灯。没有理想,就没有坚定的方向;没有方向,就没有生活。
CTRL+T eclipse
posts - 35, comments - 3, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

struts hibernate spring整合总结

Posted on 2009-02-11 17:51 三羽 阅读(326) 评论(0)  编辑  收藏 所属分类: JAVA资料

1  Struts+Spring

主要就是让Struts知道Spring的存在,我们可以采用两种办法。

(1) 运用Struts的插件方法,添加struts-congif.xml的<plug-in>节点。

示例代码如下:

1<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">   
2        <set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml" />   
3    </plug-in>  

上段代码意图很简单:把Struts的配置文件和Spring的配置文件联系起来,这样Struts就知道了Spring的存在。

另外,在web.xml里面需要配置一个Spring的监听器,示例代码如下:

1<listener>   
2        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>   
3    </listener> 

第一种方法完毕。

(2) 直接在web.xml里面进行加载。

这种方法与上种方法的不同之处在于Spring的配置文件加载的位置不同,上种方法是在struts-cong.xml中声明,而这种方法是在web.xml里面进行声明,示例代码如下:

1<context-param>   
2        <param-name>contextConfigLocation</param-name>   
3        <param-value>   
4            /WEB-INF/applicationContext-module1.xml,    
5            /WEB-INF/applicationContext-module2.xml   
6        </param-value>   
7    </context-param> 

这样我们就实现了第二种方法的SS整合。

问题至于我们还要遇到一个小问题,那就是Struts如何实用Spring的特性?Struts怎么就知道Spring注入的Bean呢?当然,这需要我们进行编程式的声明,众所周知,在Strus的Action里面有一个setServlet方法,我们此时就需要覆盖这个方法,当ActionServlet把请求转发到此Action时,Action就可以实用Spring的特性。

示例代码如下:

 1import org.springframework.context.ApplicationContext;    
 2import org.springframework.web.context.support.WebApplicationContextUtils;    
 3   
 4public void setServlet(ActionServlet actionServlet) {    
 5        try {    
 6            super.setServlet(actionServlet);    
 7            ServletContext servletContext = actionServlet.getServletContext();    
 8            context = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);    
 9        }
 catch(Exception e) {    
10            e.printStackTrace();    
11        }
    
12    }
   
其中context是ApplicationContext的实例,有了上串代码以后我们就可以以下面的方式进行Spring的特性利用了!
1protected IXjdjService getXjdjServiceImp(){    
2        return (IXjdjService) context.getBean("xjdj");    
3    }
   

到此OK,Struts与Spring的整合成功。

2 Spring+Hibernate

可以说Spring与Hibernate的整合是非常完善的,具体要素如下:

在Hibernate中,最重要的无非就是两点,一是配置数据库连接池,二是配置实体类的映射文件。现在我贴出上述两点在Spring里面是怎么配的,配置完毕以后,我们完全可以删除hibernate.cfg.xml文件。示例代码如下:

 1<bean id="dataSource"      
 2        class="org.springframework.jdbc.datasource.DriverManagerDataSource">      
 3        <property name="driverClassName">      
 4            <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>      
 5        </property>      
 6        <property name="url">      
 7            <value>jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=EXAM</value>      
 8        </property>      
 9        <property name="username">      
10            <value>sa</value>      
11        </property>      
12        <property name="password">      
13            <value>135780</value>      
14        </property>      
15    </bean>      
16    <!-- 配置Hibernate会话工厂 -->      
17    <bean id="sessionFactory"      
18        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">      
19        <property name="dataSource">      
20            <ref bean="dataSource" />      
21        </property>      
22        <!-- 在此可以配置Hibernate会话工厂的属性 -->      
23        <property name="hibernateProperties">      
24            <props>      
25                <prop key="hibernate.dialect">      
26                    org.hibernate.dialect.SQLServerDialect       
27                </prop>      
28                <prop key="hibernate.show_sql">true</prop>      
29                      
30             </props>      
31        </property>      
32        <!-- 在此可以匹配*.hbm.xml映射文件 -->      
33        <property name="mappingDirectoryLocations">      
34            <list>      
35                <value>      
36                    classpath:/com/wjh/comm/framework/bean       
37                </value>      
38                    
39            </list>      
40        </property>      
41        <property name="mappingResources">   
42           <list>   
43                <value>com/wjh/example/User.hbm.xml</value>   
44          </list>   
45 </property>   
46</bean>   

OK,到此就完成了Spring+Hibernate的整合

主要功能:完成数据库表的查、增、删、改操作。
问题描述:查询功能一切正常,但是在增、删、改操作中发现,数据库表中数据没有改变,查看控制台日志也没有任何异常发现,纳闷了好久,仔查检查日志,发现在新增操作中表id有在自增,由此确定是问题出在事务没有提交。将事务配置上去后出现如下报错:java.lang.ClassCastException: $Proxy1,百度上搜到一文,在业务类如果实现了接口,得增加如下代码
<property name="proxyTargetClass">
   <value>true</value>
</property>
果然如此,再次运行,成功了!
以下是我applicationContext.xml的内容:
 1<?xml version="1.0" encoding="UTF-8"?>   
 2<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">   
 3<beans>   
 4 <bean id="mySessionFactory"  
 5  class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">   
 6  <property name="configLocation">   
 7   <value>classpath:hibernate.cfg.xml</value>   
 8  </property>   
 9 </bean>   
10 <bean id="myTransactionManager"  
11  class="org.springframework.orm.hibernate3.HibernateTransactionManager">   
12  <property name="sessionFactory">   
13   <ref bean="mySessionFactory" />   
14  </property>   
15 </bean>   
16 <bean id="myBaseTransactionProxy"  
17  class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"  
18  abstract="true">   
19  <property name="transactionManager" ref="myTransactionManager" />   
20  <property name="transactionAttributes">   
21   <props>   
22    <prop key="*">PROPAGATION_REQUIRED</prop>   
23    <!--    
24     <prop key="insert*">PROPAGATION_REQUIRED</prop>   
25     <prop key="save">PROPAGATION_REQUIRED</prop>   
26     <prop key="update*">PROPAGATION_REQUIRED</prop>   
27     <prop key="edit*">PROPAGATION_REQUIRED</prop>   
28     <prop key="del*">PROPAGATION_REQUIRED</prop>   
29     <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>   
30     <prop key="query*">PROPAGATION_REQUIRED,readOnly</prop>   
31     <prop key="disPlay*">PROPAGATION_REQUIRES_NEW</prop>   
32    -->   
33   </props>   
34  </property>   
35 </bean>   
36 <bean id="UsersDAO" class="com.notepad.dao.UsersDAO">   
37  <property name="sessionFactory">   
38   <ref bean="mySessionFactory" />   
39  </property>   
40 </bean>   
41 <bean id="userTarget" class="com.notepad.bussies.UserService">   
42  <property name="usersDao">   
43   <ref local="UsersDAO" />   
44  </property>   
45 </bean>   
46 <bean id="UserService" parent="myBaseTransactionProxy">   
47  <property name="proxyTargetClass">   
48   <value>true</value>   
49  </property>   
50  <property name="target">   
51   <ref local="userTarget" />   
52  </property>   
53 </bean>   
54</beans>  
55

只有注册用户登录后才能发表评论。


网站导航: