Spring2.0+Struts1.2+Hibernate3.1集成

运行环境:Tomcat5.0+Spring2.0+Struts1.2+Hibernate3.1

 

注意:使用Spring1.x 与Struts集成,与Spring2.0 与Struts集成存在不同点

我门可以采用三种方式之一来整合Spring和Struts:
1.Struts的Action继承Spring的ActionSupport类,并在Action中获取Spring的ApplicationContext。这

是最简单的一种整合方式,但有三个缺点:第一,Struts与Spring紧密耦合,不能改换到其他IoC容器;

第二,难以使用Spring AOP特性;第三,对于需要使用DispatchAction的Struts应用无能为力。


2.在Struts的配置文件中,以Spring的DelegatingRequestProcessor类代替Struts的RequestProcessor类

,并在Spring的配置文件中定义与Struts配置文件中<action-mappings>对应的bean,从而将Struts的

Action与Spring分开,并把Struts的动作置于Spring的控制之下。这种整合方式的优点是将不再依赖

Spring这个特定的IoC容器,但必须依赖Struts的RequestProcessor类。


3.通过Spring的DelegatingActionProxy类代理Struts的动作,即在Struts配置文件中,定义<action-mappings>的type属性全部改为DelegatingActionProxy,而不是具体的类名,并在Spring配置文件中定义与Struts动作映射对应的bean,从而将Struts的Action与Spring分开,并把Struts的动作置于Spring的控制之下。

无疑,这是最灵活的一种整合方式。


第一步 完善applicationContext.xml内容

1、添加事务处理。内容如下:

 

xml 代码
 
<bean id="transactionManager"      class="org.springframework.orm.hibernate3.HibernateTransactionManager">       <property name="sessionFactory">        <ref local="sessionFactory" />       </property>      </bean>      <bean id="customerDAOProxy"      class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">       <property name="transactionManager">        <ref bean="transactionManager" />       </property>       <property name="target">        <ref local="customerDAO" />       </property>       <property name="transactionAttributes">        <props>         <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>        </props>       </property>      </bean>  

2、CustomerAction Bean注入事务处理。内容如下:

 

xml 代码
 
<bean name="/customer" class="com.ssh.struts.action.CustomerAction" >         <property name="customerDAO"><ref bean="customerDAOProxy"/></property>     </bean>  

 3、最终applicationContext.xml文件,内容如下:

xml 代码
 
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans  
  3.  xmlns="http://www.springframework.org/schema/beans"  
  4.  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  5.  xsi:schemaLocation="http://www.springframework.org/schema/beans  
  6.   
  7. http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">  
  8.    
  9.  <bean id="dataSource"  
  10.   class="org.apache.commons.dbcp.BasicDataSource">  
  11.   <property name="driverClassName"  
  12.    value="com.mysql.jdbc.Driver">  
  13.   </property>  
  14.   <property name="url"  
  15.    value="jdbc:mysql://localhost:3306/pullhand">  
  16.   </property>  
  17.   <property name="username" value="root"></property>  
  18.   <property name="password" value="815241"></property>  
  19.  </bean>  
  20.    
  21.  <bean id="sessionFactory"  
  22.   class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
  23.   <property name="dataSource">  
  24.    <ref bean="dataSource" />  
  25.   </property>  
  26.   <property name="hibernateProperties">  
  27.    <props>  
  28.     <prop key="hibernate.dialect">  
  29.      org.hibernate.dialect.MySQLDialect  
  30.     </prop>  
  31.    </props>  
  32.   </property>  
  33.   <property name="mappingResources">  
  34.    <list>  
  35.     <value>com/ssh/beans/po/Customer.hbm.xml</value></list>  
  36.   </property>  
  37.   </bean>  
  38.    
  39.   <bean id="transactionManager"  
  40.   
  41. class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
  42.     <property name="sessionFactory">  
  43.      <ref local="sessionFactory" />  
  44.     </property>  
  45.    </bean>  
  46.    <bean id="customerDAOProxy"  
  47.   
  48. class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">  
  49.     <property name="transactionManager">  
  50.      <ref bean="transactionManager" />  
  51.     </property>  
  52.     <property name="target">  
  53.      <ref local="customerDAO" />  
  54.     </property>  
  55.     <property name="transactionAttributes">  
  56.      <props>  
  57.       <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>  
  58.      </props>  
  59.     </property>  
  60.    </bean>  
  61.     
  62.   <bean id="customerDAO" class="com.ssh.beans.dao.CustomerDAO">  
  63.    <property name="sessionFactory">  
  64.     <ref bean="sessionFactory" />  
  65.    </property>  
  66.   </bean>  
  67.     
  68.   <bean name="/customer" class="com.ssh.struts.action.CustomerAction" >  
  69.       <property name="customerDAO"><ref bean="customerDAOProxy"/></property>  
  70.   </bean>   
  71.     
  72.  </beans>  

第二步,修改CustomerAction

最后内容如下:

java 代码
 
  1. package com.ssh.struts.action;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import javax.servlet.http.HttpServletRequest;  
  7. import javax.servlet.http.HttpServletResponse;  
  8. import org.apache.struts.action.Action;  
  9. import org.apache.struts.action.ActionForm;  
  10. import org.apache.struts.action.ActionForward;  
  11. import org.apache.struts.action.ActionMapping;  
  12.   
  13. import com.ssh.beans.dao.ICustomerDAO;  
  14. import com.ssh.beans.po.Customer;  
  15.   
  16.   
  17. public class CustomerAction extends Action {  
  18.  ICustomerDAO customerDAO=null;  
  19.  public void setCustomerDAO(ICustomerDAO customerDAO){  
  20.   this.customerDAO=customerDAO;  
  21.  }  
  22.    
  23.  public ActionForward execute(ActionMapping mapping, ActionForm form,  
  24.    HttpServletRequest request, HttpServletResponse response) {  
  25.   List list=new ArrayList();  
  26.   Customer customer=null;  
  27.   if(customerDAO!=null){  
  28.    list=customerDAO.getALLCustomer();  
  29.    for(int i=0;i<list.size();i++){  
  30.     customer=(Customer)list.get(i);  
  31.     System.out.println("OK:"+customer.getCustName());  
  32.    }  
  33.   }else{  
  34.    System.out.println("ERROR or NULL");  
  35.   }  
  36.   return mapping.findForward("success");  
  37.  }  
  38. }  

第三步 解决找不到Action问题

初学者会经常遇到下面这个问题:

HTTP Status 404 - Servlet action is not available

--------------------------------------------------------------------------------

type Status report

message Servlet action is not available

description The requested resource (Servlet action is not available) is not available.


--------------------------------------------------------------------------------

Apache Tomcat/5.0.28
就是找不到我们的action。

当你努力去解决这个问题时,会发现去掉applicationContext.xml下面这个<property>标签,一切正常:

 

xml 代码
 
<property name="mappingResources">     <list>      <value>       com/ssh/beans/po/Customer.hbm.xml      </value>     </list>    </property>  

那是什么原因呢?我想大家都会首先想到下面两个问题:

1、路径是否正确:即com/ssh/beans/po/Customer.hbm.xml的路径正确么?

2、文件是否正确:即Customer.hbm.xml的文件内容对么?

当你费了一身力气发现一切OK,到底什么原因???

问题在于构件路径(lib)内的包重叠(提示:前提是你要保证这个问题出现之前都正常),所以你要确定

构建路径里的包不能重复!

建议:大家在导入包时,按照默认导入,不要把所有的包都导进工程,在操作中在把需要的jar包导进去(

最好不要把整个liberaries导进去),这样即可以减小工程的大小,又能确保struts\spring\hibernate

之间的包不会重叠或者被替换。

解决办法:把lib下的hibernate-annotations.jar文件删除,重启Tomcat后即可正常运行。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值