本文想通過一個簡單的實例闡述如何集成Spring和Struts
Struts和Spring
Struts 代表了MVC第二類架構的實現在Struts中最重要的組件是ActionServlet Action和 ActionForm 子類ActionServlet 代表controller他基於配置文件接受請求和 把這些請求轉發到相應的ActionForm和Action子類 ActionForm把用戶輸入的數據傳送到Action Action調用商務層組件完成必要的操作最後提交到viewActionServlet使用一個配置文件(strutsconfigxml)加載Action子類的定義用以接受用戶請求基於請求URL controller 找到一個action定義去接受這個請求 Struts構件處理用戶請求 檢查配置文件 完成相應的動作
Spring是一種輕量級的容器它使得使用一個外部XML配置文件非常容易綁定對象每個對象能夠通過列出JavaBean屬性得到一個依賴對象的指針通過綁定XML配置文件使剩下的工作更加簡單依賴注入(DI)是非常強大的功能Spring支持可插拔的事務管理器提供事物管理方式更多的選擇 它集成了持久性的架構同時也提供了一個統一的exception 分類Spring也提供面向方面(AOP)編程的簡單機制
Struts和Spring的集成
將Struts應用集成到Spring框架可以采用多種方法首先Spring明顯地被設計用於解決JEE的現實問題如復雜性性能低下可測試性及其他;第二Spring框架包括一個AOP實現讓你可以使用面向方面的程序設計技術;第三 Spring 框架可以能夠非常容易地管理和協調Struts;和Struts類似 Spring也包含MVC 實現兩個架構都有優缺點Struts是MVC最重要的架構很多開發團隊學會了依靠Struts在規定時限內開發出高質量的軟件因此開發團隊寧願集成Spring的功能也不願意轉到Spring MVC;好消息是Spring的結構允許你集成Struts Web 框架基於Spring的業務層和持久層我們的方法是應用Spring中的ActionSupport類去集成Struts
加載應用的context
首先我們需要使用Spring中的ContextLoaderPlugin為Struts ActionServlet去裝載Spring應用的上下文簡單在strutsconfigxml 文件中增加plugin如下()所示
< ?xml version= encoding=ISO ?>
< !DOCTYPE strutsconfig PUBLIC
//Apache Software Foundation//DTD Struts Configuration //EN
config__dtd>
< strutsconfig>
< formbeans>
< formbean name=searchForm
type=orgapachestrutsvalidatorDynaValidatorForm>
< formproperty name=cardno type=javalangString/>
< /formbean>
< /formbeans>
< globalforwards type=orgapachestrutsactionActionForward>
< forward name=welcome path=/welcomedo/>
< forward name=searchEntry path=/searchEntrydo/>
< forward name=searchSubmit path=/searchSubmitdo/>
< /globalforwards>
< actionmappings>
< action path=/welcome forward=/WEBINF/pages//>
< action path=/searchEntry forward=/WEBINF/pages/searchjsp/>
< action path=/searchSubmit
type= tekCreditcardactionsSearchSubmit
input=/searchEntrydo
validate=true
name=searchForm>
< forward name=success path=/WEBINF/pages/detailjsp/>
< forward name=failure path=/WEBINF/pages/searchjsp/>
< /action>
< /actionmappings>
< messageresources parameter=ApplicationResources/>
< plugin className=orgapachestrutsvalidatorValidatorPlugIn>
< setproperty property=pathnames value=/WEBINF/validatorrulesxml/WEBINF/validationxml/>
< /plugin>
< plugin className=orgspringframeworkwebstrutsContextLoaderPlugIn> ()
< setproperty property=contextConfigLocation value=/WEBINF/beansxml/>
< /plugin>
< /strutsconfig>
使用Spring的ActionSupport類
要用Spring去集成Struts創建一個Spring 上下文是必須要做的 orgspringframeworkwebstrutsActionSupport 類提供一個 getWebApplicationContext() 方法非常容易地獲得Spring上下文全部你需要去做的是從Spring的ActionSupport 代替Struts 中的Action類去延伸你的action如下所示
package tekCreditcardactions;
import javaioIOException;
import javaxservletServletException;
import javaxservlethttpHttpServletRequest;
import javaxservlethttpHttpServletResponse;
import orgapachestrutsactionActionError;
import orgapachestrutsactionActionErrors;
import orgapachestrutsactionActionForm;
import orgapachestrutsactionActionForward;
import orgapachestrutsactionActionMapping;
import orgapachestrutsactionDynaActionForm;
import orgntextApplicationContext;
import orgspringframeworkwebstrutsActionSupport;
import com infotekCreditcardbeansCreditcard;
import com infotekCreditcardbusinessCreditcardService;
public class SearchSubmit extends ActionSupport { |()
public ActionForward execute(ActionMapping mappingActionForm form
HttpServletRequest requestHttpServletResponse response)
throws IOException ServletException {
DynaActionForm searchForm = (DynaActionForm) form;
String isbn = (String) searchFormget(cardno);
//the old fashion way
//CreditcardService creditcardService = new CreditcardServiceImpl();
ApplicationContext ctx = getWebApplicationContext(); |()
CreditcardService creditcardService =
(CreditcardService ) ctxgetBean(creditcardService); |()
CreditCard creditard = CreditCardServiceread(cardnotrim());
if (null == creditard) {
ActionErrors errors = new ActionErrors();
errorsadd(ActionErrorsGLOBAL_ERRORnew ActionError (messagenotfound));
saveErrors(request errors);
return mappingfindForward(failure) ;
}
requestsetAttribute(creditcard creditcard);
return mappingfindForward(success);
}
}
在()中我們 通過延伸Spring ActionSupport 類而不是Struts Action 類創建了一個action;在()中我們使用getWebApplicationContext()方法獲得一個ApplicationContext;為了獲得商務服務 在()中我們使用ApplicationContext去查找Spring bean;這個技術非常容易理解不幸的是它把Struts的action和Spring framework綁定了如果你想替換Spring你不得不重寫代碼而且Struts的action不在Spring的控制之下 遺憾的是這種方法無法獲得Spring AOP的好處
結論
本文我們嘗試使用Spring的ActionSupportContextLoaderPlugIn去集成Struts這是一種最高效的和最簡單的方式另外還可用Spring中的代理子類去代理Struts中的RequestProcessor和代理Struts的actions
From:http://tw.wingwit.com/Article/program/Java/ky/201311/27958.html