第一部分:Web.Xml中ContextLoaderListener的相關(guān)配置
在工程目錄下的\WebContent\WEB-INF\web.xml中,我們可以發(fā)現(xiàn)以下配置:











以上第一段XML中,contextConfigLocation參數(shù)定義了要載入Spring上下文的配置文件,這里采用了通配符的方式,也可以通過逗號(hào)符來分隔多個(gè)文件。
以上第二段XML定義了一個(gè)監(jiān)聽器,它適用于Servlet2.3及其以上版本,這個(gè)監(jiān)聽器會(huì)隨著WebApp的啟動(dòng)而啟動(dòng),并加載contextConfigLocation參數(shù)中定義好的Spring配置文件。若是在Servlet2.3以下版本中,則需要定義org.springframework.web.context.ContextLoaderServlet來載入配置文件。
第二部分:Action Bean的配置
接下來我們需要將Struts2的Action交給Spring管理,以com.heyang.module.contract.action. CheckSoleContractNameAction類為例,它在Spring配置文件\WebContent\WEB-INF\applicationContext-action.xml中的相應(yīng)配置為:






由上面的XML知道,如果我們?nèi)〉妹麨閏heckSoleContractNameAction的bean,Spring將通過反射調(diào)用一個(gè)com.heyang.module.contract.action.CheckSoleContractNameAction類的實(shí)例,并將一個(gè)名為contractService的bean注入進(jìn)去,當(dāng)然CheckSoleContractNameAction需要擁有此屬性并具備對(duì)應(yīng)的setter/getter。
第三部分:在Struts配置文件中將url映射到Spring上下文中的bean
這種方式是通過指定<action>的class屬性為Spring配置文件中相應(yīng)bean的id值來做到的,再以CheckSoleContractNameAction為例,它在Struts2配置文件WebContent\WEB-INF\struts-cfg\contract\struts.xml中的相應(yīng)設(shè)置為:
<action name="checkSoleContractName" class="checkSoleContractNameAction" method="execute"/>
這樣,當(dāng)頁(yè)面中url有對(duì)應(yīng)用上下文/contract/checkSoleContractName.action?...
時(shí),com.heyang.module.contract.action.CheckSoleContractNameAction類的execute方法將會(huì)來處理用戶的請(qǐng)求。注意,這段url中,應(yīng)用上下文是WebApp Context,contract是action所在包的名稱空間,checkSoleContractName則是action的name。
至此,Struts2和Spring的整合配置講述完畢。
第四部分:Struts2與Spring的整合原理
在\WebContent\WEB-INF\lib\下存在一個(gè)struts2-spring-plugin-2.0.9.jar,這個(gè)插件包的作用是通過覆蓋(override)Struts2的ObjectFactory來增強(qiáng)核心框架對(duì)象的創(chuàng)建。當(dāng)Struts2需要根據(jù)配置文件創(chuàng)建一個(gè)Action的時(shí)候,它會(huì)用Struts2配置文件中的class屬性去和Spring配置文件中的id屬性進(jìn)行關(guān)聯(lián),如果能找到,則由Spring創(chuàng)建;否則由Struts 2框架自身創(chuàng)建。這個(gè)功能是通過插件提供的兩個(gè)攔截器實(shí)現(xiàn)的,默認(rèn)情況下框架使用的自動(dòng)裝配策略是name,也就是說框架會(huì)去Spring中尋找與Action屬性名字相同的bean,可選的裝配策略還有:type、auto、constructor等。
第五部分:Spring與Hibernate的整合
通常來說,每個(gè)負(fù)責(zé)具體請(qǐng)求的Action都會(huì)被注入一個(gè)或多個(gè)Service bean(參見applicationContext-action.xml),而每個(gè)Service Bean都會(huì)被注入一個(gè)DAO bean(參見applicationContext-dao.xml),而每個(gè)dao bean都被被注入一個(gè)hibernateTemplate來與數(shù)據(jù)庫(kù)交互(參見applicationContext-dao.xml),而在applicationContext-db.xml中,說明了hibernateTemplate的由來,它最終會(huì)找到一個(gè)datasource從而找到數(shù)據(jù)庫(kù)。
這樣,從前臺(tái)Struts2的控制器到后臺(tái)數(shù)據(jù)庫(kù),S2SH整個(gè)鏈條就被串起來了。