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

openkk 13年前發布 | 1K 次閱讀

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方法 來獲得依賴注入的功能。

 本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!