Spring + struts1整合的三种主要方式

14年前

1.使用Spring 的 ActionSupport
2.使用Spring 的 DelegatingRequestProcessor 类。
3.全权委托。

无论用那种方法来整合第一步就是要为struts来装载spring的应用环境。 就是在 struts 中加入一个插件。
struts-config.xml中 

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


spring 的配置文件被作为参数配置进来。这样可以省略对web.xml 文件中的配置。确保你的applicationContext.xml 在WEB-INF目录下面

1,使用Spring的ActionSupport .
Spring 的ActionSupport 继承至 org.apache.struts.action.Action
ActionSupport的子类可以或得 WebApplicationContext类型的全局变量。通过getWebApplicationContext()可以获得这个变量。

这是一个 servlet 的代码:

  1. public class LoginAction extends org.springframework.web.struts.ActionSupport {   
  2.     
  3.  public ActionForward execute(ActionMapping mapping, ActionForm form,   
  4.    HttpServletRequest request, HttpServletResponse response) {   
  5.   LoginForm loginForm = (LoginForm) form;// TODO Auto-generated method stub   
  6.                 //获得  WebApplicationContext  对象                 
  7.   WebApplicationContext ctx = this.getWebApplicationContext();   
  8.      
  9.   LoginDao dao = (LoginDao) ctx.getBean("loginDao");   
  10.   User u = new User();   
  11.      
  12.   u.setName(loginForm.getName());   
  13.   u.setPwd(loginForm.getPwd());   
  14.      
  15.      
  16.   if(dao.checkLogin(u)){   
  17.    return mapping.findForward("success");   
  18.   }else{   
  19.    return  mapping.findForward("error");   
  20.   }   
  21.      
  22.  }   
  23. }   

applicationContext.xml 中的配置

  1. <beans>  
  2.  <bean id="loginDao" class="com.cao.dao.LoginDao"/>  
  3. </beans>  

这中配置方式同直接在web.xml文件配置差别不大。注意:Action继承自 org.springframework.web.struts.ActionSupport 使得struts和spring耦合在一起。
但实现了表示层和业务逻辑层的解耦(LoginDao dao = (LoginDao) ctx.getBean("loginDao"))。


2,使用Spring 的 DelegatingRequestProcessor 类
DelegatingRequestProcessor  继承自 org.apache.struts.action.RequestProcessor 并覆盖了里面的方法。
sturts-config.xml  中  <controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor"/> 通过 <controller >来替代
                        org.apache.struts.action.RequestProcessor 的请求处理。

  1. public class LoginAction extends Action {   
  2.  //利用spring来注入这个对象。   
  3.  private LoginDao dao ;   
  4.     
  5.  public void setDao(LoginDao dao) {   
  6.   System.out.println("执行注入");   
  7.   this.dao = dao;   
  8.  }   
  9.   
  10.  public LoginDao getDao() {   
  11.   return dao;   
  12.  }   
  13.   
  14.  public ActionForward execute(ActionMapping mapping, ActionForm form,   
  15.    HttpServletRequest request, HttpServletResponse response) {   
  16.   LoginForm loginForm = (LoginForm) form;// TODO Auto-generated method stub   
  17.   //这样一改这行代码似乎没有必要了。   
  18.   //WebApplicationContext ctx = this.getWebApplicationContext();   
  19.   //LoginDao dao = (LoginDao) ctx.getBean("loginDao");   
  20.     
  21.   User u = new User();   
  22.      
  23.   u.setName(loginForm.getName());   
  24.   u.setPwd(loginForm.getPwd());   
  25.      
  26.   //直接用dao来调用spring会将这个对象实例化。   
  27.   if(dao.checkLogin(u)){   
  28.    return mapping.findForward("success");   
  29.   }else{   
  30.    return  mapping.findForward("error");   
  31.   }   
  32.      
  33.  }   
  34. }   
  35.   

这里的。
LoginAction extends Action 说明 struts 每有和spring 耦合。
看一下
applicationContext.xml 中的配置。

  1. <beans>  
  2.  <bean id="loginDao" class="com.cao.dao.LoginDao"/>  
  3.     
  4.  <bean name="/login" class="com.cao.struts.action.LoginAction">  
  5.   <property name="dao">  
  6.    <ref local="loginDao"/>  
  7.   </property>  
  8.  </bean>  
  9. </beans>  

这里 name="/login" 与struts 中的path匹配
    class="com.cao.struts.action.LoginAction" 与struts 中的type匹配

还要为 LoginAction 提供必要的setXXX方法。 获得ApplicationCotext和依赖注入的工作都在DelegatingRequestProcessor中完成。


3,全权委托:
Action 的创建和对象的依赖注入全部由IOC容器来完成。 使用Spring的DelegatingAcionProxy来帮助实现代理的工作
org.springframework.web.struts.DelegatingActiongProxy继承于org.apache.struts.action.Action .


全权委托的配置方式同 方式 2 类似 (applcationContext.xml文件的配置和 Action类的实现方式相同)。
1, <action>中 type指向的是spring 的代理类

  1. <struts-config>  
  2.   <data-sources />  
  3.   <form-beans >  
  4.     <form-bean name="loginForm" type="com.cao.struts.form.LoginForm" />  
  5.   
  6.   </form-beans>  
  7.   
  8.   <global-exceptions />  
  9.   <global-forwards />  
  10.  <action-mappings >  
  11.     <!-- type指向的是spring 的代理类 -->  
  12.     <action  
  13.       attribute="loginForm"  
  14.       input="login.jsp"  
  15.       name="loginForm"  
  16.       path="/login"  
  17.       scope="request"  
  18.   
  19.       type="org.springframework.web.struts.DelegatingActionProxy" >  
  20.          
  21.       <forward name="success" path="/ok.jsp" />  
  22.       <forward name="error" path="/error.jsp" />  
  23.     </action>  
  24.     
  25.  </action-mappings>  
  26.     
  27.      
  28.   <message-resources parameter="com.cao.struts.ApplicationResources" />  
  29.   
  30.  <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">  
  31.   <set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml"/>  
  32.  </plug-in>  
  33.   
  34. </struts-config>  
  35.   

不同之处

2, 去掉struts-config.xml中 <controller >

三种整和方式中我们优先选用 全权委托的方式。
理由:
1,第一种使得过多的耦合了Spring和Action .
2,RequestProcessor类已经被代理 如果要再实现自己的实现方式(如:编码处理)怕有点麻烦。

总结一下:
整合工作中的步骤:
1.修改struts-config.xml  
2. 配置applicationContext.xml
3.为Action添加get/set方法 来获得依赖注入的功能。