`
justin8335
  • 浏览: 28814 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

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 代码
 
  1. <bean id="transactionManager"  
  2.   
  3. class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
  4.     <property name="sessionFactory">  
  5.      <ref local="sessionFactory" />  
  6.     </property>  
  7.    </bean>  
  8.    <bean id="customerDAOProxy"  
  9.   
  10. class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">  
  11.     <property name="transactionManager">  
  12.      <ref bean="transactionManager" />  
  13.     </property>  
  14.     <property name="target">  
  15.      <ref local="customerDAO" />  
  16.     </property>  
  17.     <property name="transactionAttributes">  
  18.      <props>  
  19.       <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>  
  20.      </props>  
  21.     </property>  
  22.    </bean>  

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

 

xml 代码
 
  1. <bean name="/customer" class="com.ssh.struts.action.CustomerAction" >  
  2.       <property name="customerDAO"><ref bean="customerDAOProxy"/></property>  
  3.   </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 代码
 
  1. <property name="mappingResources">  
  2.   <list>  
  3.    <value>  
  4.     com/ssh/beans/po/Customer.hbm.xml  
  5.    </value>  
  6.   </list>  
  7.  </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后即可正常运行。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics