為了在Struts中加載Spring context,需要在struts-config.xml文件中加入如下部分:
<struts-config>
<plug-in
className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation"
value="/WEB-INF/applicationContext.xml" />
</plug-in>
</struts-config>
第一種方法:
通過Struts的plug-in在Struts和Spring之間提供了良好的結合點。通過plug-in我們實現了Spring context的加載,不過僅僅加載Spring context并沒有什么實際的意義,還應該經過配置將Struts的Action交給Spring容器進行管理。
<action-mappings>
<action path="/login"
type="org.springframework.web.struts.DelegatingActionProxy"
name="loginForm">
<forward name="success" path="/main.jsp" />
<forward name="failure" path="/login.jsp" />
</action>
在form bean這個節點上與傳統的Struts配置沒有什么區別,而在Action上面則發生了變化。在傳統的action節點上type屬性寫入action類的完整類名,而和Spring結合后在這點上是使用了Spring提供的DelegatingActionProxy作為action的type屬性,DelegatingActionProxy同樣是org.apache.struts.action.Action的一個子類,它將把調用請求轉交給真正的Action實現。通過這樣的方式,Spring獲得了Action實例的管理權,它將對Action進行調度,并為Struts提供所需的Action實例。這樣,就可以將Action看作是Spring的一個bean,它就可以享受Spring的所有服務,如依賴注入、實例管理、事務管理等。
在applicationContext.xml中相應的配置如下的節點:
<beans>
.......
<bean name="/login" class="net.xiaxin.action.LoginAction"
singleton="false">
<property name="userDAO">
<ref bean="userDAOProxy" />
</property>
</bean>
</beans>
最后這個bean的配置是關鍵,這個名為“/login”的bean與Struts中的
<action path="/login" ……>
……
</action>節點相對應,這樣,Spring Bean Name與Struts Action Path相關聯,當Struts加載對應的Action時,DelegatingActionProxy就根據傳入的path屬性,在Spring Context尋找對應bean,并將其實例返回給Struts。與此同時,還可以看到,"/login" bean 中包含了一個userDAO 引用,Spring 在運行期將根據配置為其提供userDAO 實例,以及圍繞userDAO 的事務管理服務。這樣一來,對于Struts 開發而言,我們既可以延續Struts 的開發流程,也可以享受Spring 提供的事務管
理服務。而bean 的另外一個屬性singleton="false",指明了Action 的實例獲取方式為每次重新創建。這也解決了Struts中令人詬病的線程安全問題。
第二種方法:
為了在 struts-config.xml 文件中配置 DelegatingRequestProcessor,你需要重載 <controller> 元素的 “processorClass” 屬性。 下面的幾行應該放在 <action-mapping> 元素的后面。
<controller>
<set-property property="processorClass"
value="http://www.zhmy.com/org.springframework.web.struts.DelegatingRequestProcessor"/>
</controller>
增加這些設置之后,不管你查詢任何類型的 Action,Sping都自動在它的context配置文件中尋找。 實際上,你甚至不需要指定類型。下面兩個代碼片斷都可以工作:
<action path="/user" type="com.whatever.struts.UserAction"/>
<action path="/user"/>
如果你使用 Struts 的 modules 特性,你的 bean 命名必須含有 module 的前綴。 舉個例子,如果一個 Action 的定義為 <action path="/user"/>,而且它的 module 前綴為“admin”, 那么它應該對應名為 <bean name="/admin/user"/> 的 bean
如果第二種方法不行,再用第一種方法。
至此,SS組合已經將Struts MVC以及Spring中的Bean管理、事務管理融為一體。如
果算上userDAO 中的Hibernate 部分,我們就獲得了一個全面、成熟、高效、自頂而下的
Web 開發框架。
來源:http://deathmask1980.spaces.live.com/blog/cns!8633c46371110374!118.entry
posted on 2008-04-10 16:46
阿偉 閱讀(779)
評論(0) 編輯 收藏 所屬分類:
框架整合