Spring與Struts如何整合

爲了在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>
</action-mappings>

在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>

這樣委託以後,修改Struts-config.xml中的action屬性,使action的type值不指向具體的實現類,統一改爲代理類type="org.springframework.web.struts.DelegatingActionProxy",在applicationContext.xml中的bean name值設定與Struts-config.xml中action path值一樣,以使代理類能夠根據傳入的path在springContext環境中找到相應的bean,並將實例返回給Struts。由於動作是在Spring控制之下,所以Spring可以利用Struts所有功能。由於Spring反轉控制特性,使Struts根本感覺不到Spring的存在,並且可以利用Spring動作管理框架的所有優點,比如日誌攔截、數據校驗、線程安全。
最後這個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中令人詬病的線程安全問題。
至此,SS組合已經將Struts MVC以及Spring中的Bean管理、事務管理融爲一體。如果算上userDAO 中的Hibernate 部分,我們就獲得了一個全面、成熟、高效、自頂而下的Web 開發框架。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章