熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

Spring 和struts 整合的三種方式

2013-11-23 20:34:44  來源: Java開源技術 

  使用Spring 的 ActionSupport

   使用Spring 的 DelegatingRequestProcessor 類

  全權委托

  無論用那種方法來整合第一步就是要為struts來裝載spring的應用環境 就是在 struts 中加入一個插件

  strutsconfigxml中

    <plugin className=orgspringframeworkwebstrutsContextLoaderPlugIn>
  <setproperty property=contextConfigLocation value=/WEBINF/applicationContextxml/>
 </plugin>

  spring 的配置文件被作為參數配置進來這樣可以省略對webxml 文件中的配置確保你的applicationContextxml 在WEBINF目錄下面

  使用Spring的ActionSupport

  Spring 的ActionSupport 繼承至 orgapachestrutsactionAction ActionSupport的子類可以或得 WebApplicationContext類型的全局變量通過getWebApplicationContext()可以獲得這個變量

  這是一個 servlet 的代碼

   public class LoginAction extends orgspringframeworkwebstrutsActionSupport {
 
 public ActionForward execute(ActionMapping mapping ActionForm form
   HttpServletRequest request HttpServletResponse response) {
  LoginForm loginForm = (LoginForm) form;// TODO Autogenerated method stub
                //獲得  WebApplicationContext  對象             
  WebApplicationContext ctx = thisgetWebApplicationContext();
  
  LoginDao dao = (LoginDao) ctxgetBean(loginDao);
  User u = new User();
  
  usetName(loginFormgetName());
  usetPwd(loginFormgetPwd());
  
  
  if(daocheckLogin(u)){
   return mappingfindForward(success);
  }else{
   return  mappingfindForward(error);
  }
  
 }
}

  applicationContextxml 中的配置
<beans>
 <bean id=loginDao class=comcaodaoLoginDao/>
</beans>

  這中配置方式同直接在webxml文件配置差別不大注意Action繼承自 orgspringframeworkwebstrutsActionSupport 使得struts和spring耦合在一起

  但實現了表示層和業務邏輯層的解耦(LoginDao dao = (LoginDao) ctxgetBean(loginDao))

  使用Spring 的 DelegatingRequestProcessor 類

  DelegatingRequestProcessor  繼承自 orgapachestrutsactionRequestProcessor 並覆蓋了裡面的方法

  sturtsconfigxml  中  <controller processorClass=orgspringframeworkwebstrutsDelegatingRequestProcessor/> 通過 <controller >來替代orgapachestrutsactionRequestProcessor 的請求處理

  

  public class LoginAction extends Action {
 //利用spring來注入這個對象
 private LoginDao dao ;
 
 public void setDao(LoginDao dao) {
  Systemoutprintln(執行注入);
  thisdao = dao;
 }

  public LoginDao getDao() {
  return dao;
 }

  public ActionForward execute(ActionMapping mapping ActionForm form
   HttpServletRequest request HttpServletResponse response) {
  LoginForm loginForm = (LoginForm) form;// TODO Autogenerated method stub
  //這樣一改這行代碼似乎沒有必要了
  //WebApplicationContext ctx = thisgetWebApplicationContext();
  //LoginDao dao = (LoginDao) ctxgetBean(loginDao);
 
  User u = new User();
  
  usetName(loginFormgetName());
  usetPwd(loginFormgetPwd());
  
  //直接用dao來調用spring會將這個對象實例化
  if(daocheckLogin(u)){
   return mappingfindForward(success);
  }else{
   return  mappingfindForward(error);
  }
  
 }
}
這裡的
LoginAction extends Action 說明 struts 每有和spring 耦合
看一下
applicationContextxml 中的配置
<beans>
 <bean id=loginDao class=comcaodaoLoginDao/>
 
 <bean name=/login class=comcaostrutsactionLoginAction>
  <property name=dao>
   <ref local=loginDao/>
  </property>
 </bean>
</beans>

  這裡 name=/login 與struts 中的path匹配class=comcaostrutsactionLoginAction 與struts 中的type匹配

  還要為 LoginAction 提供必要的setXXX方法 獲得ApplicationCotext和依賴注入的工作都在DelegatingRequestProcessor中完成

  全權委托

  Action 的創建和對象的依賴注入全部由IOC容器來完成 使用Spring的DelegatingAcionProxy來幫助實現代理的工作orgspringframeworkwebstrutsDelegatingActiongProxy繼承於orgapachestrutsactionAction

  全權委托的配置方式同 方式 類似 (applcationContextxml文件的配置和 Action類的實現方式相同)

   <strutsconfig>
  <datasources />
  <formbeans >
    <formbean name=loginForm type=comcaostrutsformLoginForm />

  </formbeans>

  <globalexceptions />
  <globalforwards />
 <actionmappings >
    <! type指向的是spring 的代理類 >
    <action
      attribute=loginForm
      input=loginjsp
      name=loginForm
      path=/login
      scope=request

  type=orgspringframeworkwebstrutsDelegatingActionProxy >
     
      <forward name=success path=/okjsp />
      <forward name=error path=/errorjsp />
    </action>
 
 </actionmappings>
 
  
  <messageresources parameter=comcaostrutsApplicationResources />

  <plugin className=orgspringframeworkwebstrutsContextLoaderPlugIn>
  <setproperty property=contextConfigLocation value=/WEBINF/applicationContextxml/>
 </plugin>

  </strutsconfig>
不同之處
<action>中 type指向的是spring 的代理類

   去掉strutsconfigxml中 <controller >

  三種整和方式中我們優先選用 全權委托的方式

  理由

  第一種使得過多的耦合了Spring和Action

  RequestProcessor類已經被代理 如果要再實現自己的實現方式(如編碼處理)怕有點麻煩

  總結一下

  整合工作中的步驟

  修改strutsconfigxml

   配置applicationContextxml

   為Action添加get/set方法 來獲得依賴注入的功能


From:http://tw.wingwit.com/Article/program/Java/ky/201311/28711.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.