运行环境: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、添加事务处理。内容如下:
2、CustomerAction Bean注入事务处理。内容如下:
3、最终applicationContext.xml文件,内容如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <beans
- xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
- <bean id="dataSource"
- class="org.apache.commons.dbcp.BasicDataSource">
- <property name="driverClassName"
- value="com.mysql.jdbc.Driver">
- </property>
- <property name="url"
- value="jdbc:mysql://localhost:3306/pullhand">
- </property>
- <property name="username" value="root"></property>
- <property name="password" value="815241"></property>
- </bean>
- <bean id="sessionFactory"
- class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
- <property name="dataSource">
- <ref bean="dataSource" />
- </property>
- <property name="hibernateProperties">
- <props>
- <prop key="hibernate.dialect">
- org.hibernate.dialect.MySQLDialect
- </prop>
- </props>
- </property>
- <property name="mappingResources">
- <list>
- <value>com/ssh/beans/po/Customer.hbm.xml</value></list>
- </property>
- </bean>
- <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>
- <bean id="customerDAO" class="com.ssh.beans.dao.CustomerDAO">
- <property name="sessionFactory">
- <ref bean="sessionFactory" />
- </property>
- </bean>
- <bean name="/customer" class="com.ssh.struts.action.CustomerAction" >
- <property name="customerDAO"><ref bean="customerDAOProxy"/></property>
- </bean>
- </beans>
第二步,修改CustomerAction
最后内容如下:
- package com.ssh.struts.action;
- import java.util.ArrayList;
- import java.util.List;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.apache.struts.action.Action;
- import org.apache.struts.action.ActionForm;
- import org.apache.struts.action.ActionForward;
- import org.apache.struts.action.ActionMapping;
- import com.ssh.beans.dao.ICustomerDAO;
- import com.ssh.beans.po.Customer;
- public class CustomerAction extends Action {
- ICustomerDAO customerDAO=null;
- public void setCustomerDAO(ICustomerDAO customerDAO){
- this.customerDAO=customerDAO;
- }
- public ActionForward execute(ActionMapping mapping, ActionForm form,
- HttpServletRequest request, HttpServletResponse response) {
- List list=new ArrayList();
- Customer customer=null;
- if(customerDAO!=null){
- list=customerDAO.getALLCustomer();
- for(int i=0;i<list.size();i++){
- customer=(Customer)list.get(i);
- System.out.println("OK:"+customer.getCustName());
- }
- }else{
- System.out.println("ERROR or NULL");
- }
- return mapping.findForward("success");
- }
- }
第三步 解决找不到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>标签,一切正常:
那是什么原因呢?我想大家都会首先想到下面两个问题:
1、路径是否正确:即com/ssh/beans/po/Customer.hbm.xml的路径正确么?
2、文件是否正确:即Customer.hbm.xml的文件内容对么?
当你费了一身力气发现一切OK,到底什么原因???
问题在于构件路径(lib)内的包重叠(提示:前提是你要保证这个问题出现之前都正常),所以你要确定
构建路径里的包不能重复!
建议:大家在导入包时,按照默认导入,不要把所有的包都导进工程,在操作中在把需要的jar包导进去(
最好不要把整个liberaries导进去),这样即可以减小工程的大小,又能确保struts\spring\hibernate
之间的包不会重叠或者被替换。
解决办法:把lib下的hibernate-annotations.jar文件删除,重启Tomcat后即可正常运行。