分享

struts 集成Spring 将Action控制权转交给Spring IOC 控制并在Spring中注入对象给Struts Action

 履历馆 2011-11-21

public class SaveAction extends Action {
private TranscationServices transcationServices;
 
 
 
private ActionForward savePO(ActionMapping mapping) {
 
getTranscationServices().saveDetail(detaPar);
}
 
 public TranscationServices getTranscationServices() {
//  return (TranscationServices) ctx.getBean("insertServices");
  return this.transcationServices;
 }
 public void setTranscationServices(TranscationServices transcationServices) {  
//  this.transcationServices = (TranscationServices) ctx.getBean("injectedtranscationServices");
  this.transcationServices =transcationServices;
 }
}
 
 
Struts 配置文件部分:type 换成Spring 代理类。
  <action path="/vendition/savePodses" attribute="podsesListForm"
   input="/vendition/podsesList.jsp" name="podsesListForm"
   scope="request" type="org.springframework.web.struts.DelegatingActionProxy"
   validate="false">
   <forward name="success" path="/vendition/podses.do?save">
   </forward>
   <forward name="modifysave"
    path="/vendition/podses.do?modifysave">
   </forward>
   <forward name="error" path="/vendition/podsesList.jsp">
   </forward>
  </action>
 
Spring 配置部分:
<bean id="injectedtranscationServices" class="com.dses.services.BeanFactory" factory-method="newServicesInstance">
  <property name="podsesListDAO" ref="podsesListDAO"></property>
  <property name="partsDAO" ref="partsDAO"></property>
  <property name="subBeanServices" ref="inectedBeanServices"></property>
 </bean>
 
 <bean name="/vendition/savePodses" class="com.dses.action.SavePodsesAction">
  <property name="transcationServices" ref="injectedtranscationServices"></property>
 </bean>
 
--------------------------------------------------------------------------------------------------------------------------------------------------------
1. 项目需要有Struts包和Spring的core, aop, web 三个包(注意不是Spring自己的Web MVC), 将Spring整合Strus。具体的 .classpath 文件如下所示:
﹤?xml version="1.0" encoding="UTF-8"?﹥   
﹤classpath﹥   
﹤classpathentry kind="src" path="src"/﹥   
﹤classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/﹥   
﹤classpathentry kind="con" path="com.genuitec.core.J2EE14_CONTAINER"/﹥   
﹤classpathentry kind="lib" path="WebRoot/WEB-INF/lib/antlr.jar"/﹥   
﹤classpathentry kind="lib" path="WebRoot/WEB-INF/lib/beanutils.jar"/﹥   
﹤classpathentry kind="lib" path="WebRoot/WEB-INF/lib/digester.jar"/﹥   
﹤classpathentry kind="lib" path="WebRoot/WEB-INF/lib/fileupload.jar"/﹥   
﹤classpathentry kind="lib" path="WebRoot/WEB-INF/lib/logging.jar"/﹥   
﹤classpathentry kind="lib" path="WebRoot/WEB-INF/lib/validator.jar"/﹥   
﹤classpathentry kind="lib" path="WebRoot/WEB-INF/lib/jakarta-oro.jar"/﹥   
﹤classpathentry kind="lib" path="WebRoot/WEB-INF/lib/struts.jar"/﹥   
﹤classpathentry kind="lib" path="WebRoot/WEB-INF/lib/mysql-connector-java--bin.jar"/﹥   
﹤classpathentry kind="con" path="melibrary.com.MYECLIPSE_SPRING20_CORE"/﹥   
﹤classpathentry kind="con" path="melibrary.com.MYECLIPSE_SPRING20_AOP"/﹥   
﹤classpathentry kind="con" path="melibrary.com.MYECLIPSE_SPRING20_WEB"/﹥   
﹤classpathentry kind="output" path="WebRoot/WEB-INF/classes"/﹥   
﹤/classpath﹥  
2. 对Struts 配置文件做修改加入Spring 托管功能.
创建 Spring 配置文件,将文件放到src 目录下,文件名称为 applicationContext.xml, 编译后放到WEB-INF/classes/ 下.
配置struts-config.xml文件,添加 spring的插件, 位置在 struts-config 文件的最末尾.
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">  
<set-property property="contextConfigLocation"  
value="/WEB-INF/classes/applicationContext.xml" />  
plug-in>  
3. 修改 Struts 的 struts-config.xml 中的Action配置。原来的代码:
改变后的代码:
<action  
attribute="loginForm"  
input="/login.jsp"  
name="loginForm"  
path="/login"  
scope="request"  
validate="true"  
type="com.test.struts.action.LoginAction" />  
type 部份为修改内容, 这里将使用spring的代理器来对Action进行控制. 当提交到/login.do是将控制权交给了spring,然后由spring来把它转回到struts的Action.
4. Spring整合Strus,需要配置spring来实例化上一步中被删除的 Action 类.
<xml version="1.0" encoding="UTF-8"?>     
<beans>  
<bean name="/login" class="com.test.struts.action.LoginAction">bean>     
<beans>   
spring 通过 org.springframework.web.struts.DelegatingActionProxy 这个类, 然后根据 Struts 配置文件中的 和 Spring 配置文件中的 来将 Spring 管理下的 Struts Action 类和提交的路径匹配起来, 这些就是关于转交控制权的配置内容.
实践的过程中发现必须把 singleton="false"去掉才行, 否则就会无法初始化 Spring 框架, 不知道具体的原因是什么.
既然这个 Struts的Action 已经通过 Spring 来初始化, 所以就可以加入依赖注入, 整合Hibernate 的功能了. 例如典型的情况:
com.test.struts.action.LoginAction    
private UserManager userManager;    
public UserManager getUserManager()...   
public void setUserManager(UserManager userMgmr) ...    
public ActionForward execute(ActionMapping mapping,  
ActionForm form,   
HttpServletRequest request, HttpServletResponse response) {   
System.out.println("userManager=" + getUserManager());   
getUserManager().someBusinessMethods();   
.....   
}  
然后就可以配置:
<bean name="/login" class="com.test.struts.action.LoginAction">  
<property name="userManager">  
<ref bean="userManagerBean" />  
<property>  
<bean>      
<bean id="userManagerBean" class="manager.UserManager" />   
 
 
---------------------------------------------------------------------------------------------------
 

Spring实例化Bean的三种方式分别是

1,xml配置使用bean的类构造器

2,xml配置+factory类,使用静态工厂方法实例化

3,xml配置+factory类,使用实例工厂方法实例化

以下分别说明

1,xml配置使用bean的类构造器

2,xml配置+factory类,使用静态工厂方法实例化

Spring实例化Bean 的xml文件配置

xml文件名:beans.xml

文件内容:

  1. ﹤?xml version="1.0" encoding="UTF-8"?﹥  
  2.  
  3. ﹤beans xmlns="http://www./schema/beans" 
  4.        xmlns:xsi="http://www./2001/XMLSchema-instance" 
  5.        xsi:schemaLocation="http://www./schema/beans  
  6.        http://www./schema/beans/spring-beans-2.5.xsd"﹥  
  7.  
  8.   ﹤!-- the application context definition for the springapp DispatcherServlet --﹥  
  9.  
  10.   ﹤bean id="sayhello" class="test.service.impl.HelloBean"/﹥  
  11.   ﹤bean id="sayhello2" class="test.service.impl.HelloBeanFactory" factory-method="createHelloBean"/﹥  
  12.   ﹤bean id="factory" class="test.service.impl.HelloBeanInstanceFactory"/﹥   
  13.   ﹤bean id="sayhello3" factory-bean="factory" factory-method="createHelloBean"/﹥   
  14.       
  15. ﹤/beans﹥ 

工厂Java文件

文件名:HelloBeanFactory.java

文件内容:

  1. package test.service.impl;   
  2. import test.service.Hello;   
  3. public class HelloBeanFactory {   
  4. public static Hello createHelloBean() {   
  5. return new HelloBean();   
  6. }   

Bean接口文件

文件名:Hello.java

文件内容:

  1. package test.service;   
  2. public interface Hello {   
  3. public void sayHello();   
  4. public void sayHello2();   
  5. public void sayHello3();   

Bean实现文件

文件名:HelloBean.java

文件内容:

  1. package test.service.impl;   
  2. import test.service.Hello;   
  3. public class HelloBean implements Hello {   
  4. public void sayHello() {   
  5. System.out.println("这是一个测试程序");   
  6. }   
  7. @Override   
  8. public void sayHello2() {   
  9. System.out.println("这是一个测试程序,测试静态工厂创建bean");   
  10. }   
  11. @Override   
  12. public void sayHello3() {   
  13. System.out.println("这是一个测试程序,测试实例工厂创建bean");   
  14. }   

3,xml配置+factory类,使用实例工厂方法实例化

xml文件配置

xml文件名:beans.xml

文件内容:参照方法2中的红字部分

工厂Java文件

文件名:HelloBeanInstanceFactory.java

文件内容:

  1. package test.service.impl;   
  2. import test.service.Hello;   
  3. public class HelloBeanInstanceFactory {   
  4. public Hello createHelloBean() {   
  5. return new HelloBean();   
  6. }   

Bean接口文件

文件名:Hello.java

文件内容:参照方法2中的红字部分

Bean实现文件

文件名:HelloBean.java

文件内容:参照方法2中的红字部分

Spring实例化Bean完成,最后测试文件

文件名:FirstSpring.java

文件内容:

  1. package test.spring;   
  2. import org.springframework.context.ApplicationContext;   
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;   
  4. import test.service.Hello;   
  5. public class FirstSpring {   
  6. public static void main(String[] args) {   
  7. testHello();   
  8. testHelloForStaticFactory();   
  9. testHelloForInstanceFactory();   
  10. }   
  11. public static void testHello() {   
  12. ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");   
  13. Hello hello =(Hello) applicationContext.getBean("sayhello");   
  14. hello.sayHello();   
  15. }   
  16. public static void testHelloForStaticFactory() {   
  17. ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");   
  18. Hello hello =(Hello) applicationContext.getBean("sayhello2");   
  19. hello.sayHello2();   
  20. }   
  21. public static void testHelloForInstanceFactory() {   
  22. ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");   
  23. Hello hello =(Hello) applicationContext.getBean("sayhello3");   
  24. hello.sayHello3();   
  25. }   

都写完了,来执行一下,结果输出:

这是一个测试程序

这是一个测试程序,测试静态工厂创建bean

这是一个测试程序,测试实例工厂创建bean

总结

三种Spring实例化Bean方法的用处,

第一种方法,通过bean的缺省构造函数创建,当各个bean的业务逻辑相互比较独立的时候或者和外界关联较少的时候可以使用。

第二种方法,利用静态factory方法创建,可以统一管理各个bean的创建,如各个bean在创建之前需要相同的初始化处理,则可用这个factory方法险进行统一的处理等等。

第三种方法,利用实例化factory方法创建,即将factory方法也作为了业务bean来控制,觉得1可用于集成其他框架的bean创建管理方法,2能够使bean和factory的角色互换。

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多