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 托管功能. 創(chuàng)建 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 部份為修改內(nèi)容, 這里將使用spring的代理器來對Action進行控制. 當提交到/login.do是將控制權(quán)交給了spring,然后由spring來把它轉(zhuǎn)回到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 這個類, 然后根據(jù) Struts 配置文件中的 和 Spring 配置文件中的 來將 Spring 管理下的 Struts Action 類和提交的路徑匹配起來, 這些就是關(guān)于轉(zhuǎn)交控制權(quán)的配置內(nèi)容. 實踐的過程中發(fā)現(xiàn)必須把 singleton="false"去掉才行, 否則就會無法初始化 Spring 框架, 不知道具體的原因是什么. 既然這個 Struts的Action 已經(jīng)通過 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的類構(gòu)造器 2,,xml配置+factory類,,使用靜態(tài)工廠方法實例化 3,xml配置+factory類,,使用實例工廠方法實例化 以下分別說明 1,,xml配置使用bean的類構(gòu)造器 2,xml配置+factory類,,使用靜態(tài)工廠方法實例化 Spring實例化Bean 的xml文件配置 xml文件名:beans.xml 文件內(nèi)容:
工廠Java文件 文件名:HelloBeanFactory.java 文件內(nèi)容:
Bean接口文件 文件名:Hello.java 文件內(nèi)容:
Bean實現(xiàn)文件 文件名:HelloBean.java 文件內(nèi)容:
3,,xml配置+factory類,使用實例工廠方法實例化 xml文件配置 xml文件名:beans.xml 文件內(nèi)容:參照方法2中的紅字部分 工廠Java文件 文件名:HelloBeanInstanceFactory.java 文件內(nèi)容:
Bean接口文件 文件名:Hello.java 文件內(nèi)容:參照方法2中的紅字部分 Bean實現(xiàn)文件 文件名:HelloBean.java 文件內(nèi)容:參照方法2中的紅字部分 Spring實例化Bean完成,,最后測試文件 文件名:FirstSpring.java 文件內(nèi)容:
都寫完了,,來執(zhí)行一下,結(jié)果輸出: 這是一個測試程序 這是一個測試程序,測試靜態(tài)工廠創(chuàng)建bean 這是一個測試程序,測試實例工廠創(chuàng)建bean 總結(jié) 三種Spring實例化Bean方法的用處,, 第一種方法,,通過bean的缺省構(gòu)造函數(shù)創(chuàng)建,當各個bean的業(yè)務(wù)邏輯相互比較獨立的時候或者和外界關(guān)聯(lián)較少的時候可以使用,。 第二種方法,,利用靜態(tài)factory方法創(chuàng)建,可以統(tǒng)一管理各個bean的創(chuàng)建,,如各個bean在創(chuàng)建之前需要相同的初始化處理,,則可用這個factory方法險進行統(tǒng)一的處理等等。 第三種方法,,利用實例化factory方法創(chuàng)建,,即將factory方法也作為了業(yè)務(wù)bean來控制,覺得1可用于集成其他框架的bean創(chuàng)建管理方法,,2能夠使bean和factory的角色互換,。 |
|