版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
本文將為您供應(yīng)關(guān)于SpringMVC框架的配置技巧,以幫助管理基
于Spring的web應(yīng)用程序的多個(gè)實(shí)例。本配置管理主題常被學(xué)術(shù)
界所忽視,但是,這對于現(xiàn)實(shí)的web開發(fā)尤為重要。本主題并不干
脆關(guān)聯(lián)任何具體的技術(shù),因此,我們將從最基本的概念起先對這個(gè)問
題進(jìn)行說明。下面,我們將依據(jù)SpringMVC框架,為基于本技術(shù)
開發(fā)的項(xiàng)目供應(yīng)一系列的解決方案。
Spring配置
人們常常會在一臺以上的主機(jī)上配置一種Web應(yīng)用程序。例如,
在生產(chǎn)中,一個(gè)網(wǎng)站可能只有一個(gè)實(shí)例。除了此實(shí)例外,開發(fā)人員可
以在用于開發(fā)的機(jī)器上配置其他的(開發(fā))實(shí)例。也可以在公司(機(jī)
構(gòu))內(nèi)部的本地開發(fā)服務(wù)器上維護(hù)其他應(yīng)用程序裝置,這將讓您受益
匪淺。該實(shí)例的目的是使Web設(shè)計(jì)者可以獲得有質(zhì)量保證的材料,
并為須要為應(yīng)用程序供應(yīng)文件資料的人供應(yīng)準(zhǔn)入。
大家都知道,即使是最簡潔的場景,也須要安裝、配置和維護(hù)三
個(gè)實(shí)例。而對于位于不同地理位置的團(tuán)隊(duì)來說,要從事這樣的項(xiàng)目便
更加困難。對于任何不是特殊簡潔的Web應(yīng)用程序項(xiàng)目,都須要多
名開發(fā)人員來安裝項(xiàng)目裝置和本地設(shè)置以及運(yùn)行單元測試的裝置等。
很多組織都將自己開發(fā)的產(chǎn)品作為Web應(yīng)用程序。我們可以在
很多產(chǎn)品中發(fā)覺這種狀況,例如電子商務(wù)系統(tǒng)、內(nèi)容管理系統(tǒng)
(CMS),以及博客發(fā)布平臺等。這類產(chǎn)品可在多個(gè)服務(wù)器中進(jìn)行
部署。對于勝利的多用途W(wǎng)eb應(yīng)用程序來說,他們的開發(fā)人員必須
要保證他們的應(yīng)用程序便于安裝,并且能夠與其他Web應(yīng)用程序完
備集成。經(jīng)過上述探討之后,我們應(yīng)當(dāng)明白,作為本文主題的應(yīng)用程
序配置是通用Web應(yīng)用程序項(xiàng)目開發(fā)人員所須要解決的重要問題之
O
諸如CVS或Subversion之類的版本限制系統(tǒng)是開發(fā)組織運(yùn)用
的一種標(biāo)準(zhǔn)工具。這種工具代表了一些組織的中心源代碼版本庫,它
們被用于保持源代碼的有序。用戶可以跟蹤應(yīng)用程序源代碼的變更,
顯示不同版本的區(qū)分,并可以確定項(xiàng)目分支。而且,它們使得在應(yīng)用
程序部署中進(jìn)行部分更新成為可能。
很明顯,版本限制系統(tǒng)軟件是跟蹤源代碼所必需的,它對于解決
應(yīng)用程序配置問題有特別大的幫助。在本文中,我們將不會把重點(diǎn)放
在版本限制系統(tǒng)上,因?yàn)檫@方面已經(jīng)有很多相關(guān)的材料了。在此,我
們將關(guān)注版本限制問題中的一個(gè)小話題:如何使Web應(yīng)用程序的配
置更加便捷(尤其是運(yùn)用SpringMVC框架編寫的Web應(yīng)用程序)。
問題是:我們在此探討的是一種什么樣的配置?任何Web應(yīng)用
程序都須要一些資源,這些資源通常都是其所運(yùn)行的服務(wù)器所特有
的,例如數(shù)據(jù)庫URL,發(fā)送電子郵件的SMTP服務(wù)器,以及包含專
用軟件文件的文件夾等。這樣的設(shè)置應(yīng)當(dāng)集中,從而使應(yīng)用程序配置
更加簡潔。
但是,這只是這個(gè)問題最簡潔的一種版本。有時(shí)候,在應(yīng)用程序
開發(fā)中須要更加困難的配置。這意味著,必需將各次部署中的不同
Bean連接起來,而這會使問題更加困難。
這些應(yīng)用程序配置問題的解決方案有諸多優(yōu)勢,包括:簡化應(yīng)用
程序的安裝和配置過程,使源代碼版本限制更加簡便,削減源代碼版
本庫中的沖突現(xiàn)象。下面,我們將通過示例具體探討這個(gè)話題。
問題
我們首先來演示一下上文所提到的最簡潔的版本。在這一?場景
中,我們希望在應(yīng)用程序部署中變更的是簡潔的配置參數(shù),例如鏈接、
密碼等。假如您曾經(jīng)運(yùn)用SpringMVC框架開發(fā)過Web應(yīng)用程序,
那么您應(yīng)當(dāng)知道這里將用到的兩個(gè)配置文件:
?/WEB-INF/applicationContext.xml,它讓您可以配置
Bean,或者顯示應(yīng)用程序上下文。通過這個(gè)文件,您可以定義
自己的業(yè)務(wù)邏輯Bean、資源以及其他可以與Web端口相關(guān)聯(lián)
的全部Beano
?/WEB-INF/[servlet-name]-servlet.xml,它被用于配置
Web層、視圖解析器、限制相、校驗(yàn)器以及其他全部MVC框
架中必需的Beano[servlet-name]指的是在web.xml部
署描述符中定義的Springdispatcherservlet的名稱。
那么問題在哪兒呢?問題就出在applicationcontext.xml中
將包括一些特定于主機(jī)的Bean定義。其中,最明顯的一個(gè)示例就是
包含了JDBC連接信息的bean,但是任何一種略微困難些的應(yīng)用程
序都有十幾個(gè)類似的Bean??匆幌孪旅娴氖纠?/p>
er</value>
</property>
<propertyname="urT>
<value>jdbc:postgresql://localhost/test</valu
e>
</property>
<propertyname=,,usernamen>
<value>postgres</value>
</property>
<propertyname="password">
<valuex/value>
</property>
</bean>
這個(gè)解決方案的問題在于對applicationcontext:.xml文件的
維護(hù)。對于初學(xué)者來說,設(shè)想一下,項(xiàng)目放在源代碼版本限制系統(tǒng)中,
例如CVS。下面,假設(shè)您希望在網(wǎng)站中添加新的功能,那么就須要
在應(yīng)用程序上下文定義中添加額外的Bean定義。問題是如何在生產(chǎn)
服務(wù)器上體現(xiàn)這些變更。
通常狀況下,應(yīng)用程序的本地實(shí)例不會與活動站點(diǎn)運(yùn)用同樣的數(shù)
據(jù)庫,因止匕applicationcontext.xml文件將包括讓您能夠訪問本地
數(shù)據(jù)庫的設(shè)置。當(dāng)您想提交在源代碼版本庫中的變更時(shí),就須要留意
這些特定于主機(jī)屬性的同步性。版本庫中的文件最終可能運(yùn)用本地設(shè)
置中的配置。假如想在生產(chǎn)服務(wù)器上更新配置,就必需手動同步這些
屬性的值。這是特別枯燥的任務(wù),而且還特別簡潔出錯。
對于應(yīng)用程序的每個(gè)實(shí)例來說,這個(gè)問題更加重要。假如有三位
開發(fā)人員正在運(yùn)用代碼段基址,而且他們運(yùn)用的是本地的數(shù)據(jù)庫。當(dāng)
您提交更改的時(shí)候,他們每個(gè)人在本地服務(wù)器上更新源代碼的時(shí)候都
必需特別謹(jǐn)慎。他們會手動同步這些更改,然后提交他們的工作C這
樣一來,版本限制系統(tǒng)對于這些配置文件來說已經(jīng)毫無用處。假如曾
經(jīng)運(yùn)用過SpringMVC,那么您應(yīng)當(dāng)知道applicationcontext.xml
是應(yīng)用程序中的關(guān)鍵組件,因?yàn)槭撬鼘⑷缘臇|西粘合在一起。所以,
我們須要一種機(jī)制來幫助使應(yīng)用程序中各項(xiàng)保持有序,這點(diǎn)特別重
要。
正如前面所提到的,這是您可能遇到的較簡潔的配置問題。更難
的問題出現(xiàn)在當(dāng)須要在不同服務(wù)器中進(jìn)行不同的Bean連接的時(shí)候。
這類問題常會出現(xiàn)在日常軟件開發(fā)任務(wù)中。例如,假如您的產(chǎn)品有一
個(gè)客戶身份驗(yàn)證模塊,可以對來自關(guān)系數(shù)據(jù)庫或LDAP服務(wù)器中的用
戶進(jìn)行身份驗(yàn)證。自然,這一身份驗(yàn)證模塊可以運(yùn)用抽象了特定版本
庫的Bean進(jìn)行配置。假如您想變更不同應(yīng)用程序部署中驗(yàn)證用戶的
方式,就須要在applicationcontext.xml文件中進(jìn)彳亍不同的Bean
連接。這種配置問題常見于在部署中有可配置特性的全部應(yīng)用程序。
在下文中,我們將探討這兩種配置問題。首先我們會關(guān)注同步的
Bean屬性問題及其解決方案,接下來,我們會探討更加困難的同步
Bean連接問題。
解決方案
同步Bean屬性
這個(gè)問題的一種可行的解決方案是將全部特定于主機(jī)的參數(shù)都
放到一般的Java屬性文件中,運(yùn)用Spring的
PropertyPlaceHolderConfigurer》咨這些參數(shù)寫入Bean屬T生
中。
運(yùn)用這一解決方案,我們可以生成如下的屬性文件
(/WEB-INF/perties):
jdbc.driver=org.postgresql.Driver
jdbc.url=jdbc:postgresql://localhost/test
jdbc.user=postgres
jdbc.password=
我們的Bean配置如下:
ig.PropertyPlaceholderConfigurer">
<propertyname=,,location',>
<value>/WEB-INF/perties</value>
</property>
</bean>
<beanid=ndataSource"
class=,,org.springframework.jdbc.datasource.DriverManag
erDataSource">
<propertyname="driverClassName">
<value>${jdbc.driver)</value>
</property>
<propertyname=',url',>
<value>${jdbc.url}</value>
</property>
<propertyname="username">
<value>${jdbc.user></value>
</property>
<propertyname=npassword">
<value>${jdbc.password}</value>
</property>
</bean>
如上所述,我們定義了一個(gè)PropertyPlaceholderConfigurer
類的實(shí)例,并將其位置屬性設(shè)置為我們的屬性文件。該類被實(shí)現(xiàn)為
Bean工廠的后處理器,并將運(yùn)用定義在文件中的屬性來代替全部的
占位符(${...}value)o
利用這種技術(shù),我們可以從applicationcontext.xml中移除全
部特定于主機(jī)的配置屬性。通過這種方式,我們可以自由地為該文件
添力U新的Bean,而不必?fù)?dān)憂特定于主機(jī)屬性的同步性。這樣可以簡
化生產(chǎn)部署和維護(hù)。
同步性連接
上面的技術(shù)解決了第一個(gè)問題,可是假如您安排修改不同應(yīng)用程
序部署之間的Bean連接,這一技術(shù)便不很適合。針對這一問題的一
個(gè)解決方案便是額外創(chuàng)建一個(gè)名為
applicationcontext-[hostname].xml的XML定義文件。其中
[hostname]是部署應(yīng)用程序的主機(jī)的名稱。例如,在本地的機(jī)器
上,這個(gè)文件通常名為applicationContext-localhost.xml,而
在部署時(shí),它可能更名為
applicationContext-somehost.xmL
可以揣測,這一文件必需包括特定于某一主機(jī)的全部配置Bean。
在本文中,我們將假設(shè)datasourcebean定義將位于這類文件中,
而不是通用的applicationcontext.xml定義。當(dāng)然,這種機(jī)制與前
者并非沖突,但是為了更加簡潔明白,我們將只關(guān)注這種方法。
既然我們已經(jīng)有了特定的配置,下面我們就來探討一下如何將其
整合到整個(gè)SpringMVC配置概念中。要達(dá)到這一目的,可以有很
多方法,我們將具體地一一說明。但首先,我們應(yīng)當(dāng)留意到,由于有
些Bean可能位于獨(dú)立的配置文件中,因此在
applicationContext.xml中,全部對它們的局部弓I用都必需更換成
全局名稱。
例如,如下引用:
<propertyname="someProperty">
<reflocal="someBean'7>
</property>
應(yīng)更改為:
<propertyname="someProperty">
<refbean="someBeann/>
</property>
在這之后,我們有很多可以添加額外的資源以用于配置的方式。
其中最明顯的就是運(yùn)用〈importA標(biāo)簽將這一額外資源包含在
dpplicationContext.xml配置文件中。運(yùn)用時(shí),要將該標(biāo)簽放在
applicationContext.xml文件開頭。例如:
<import
resource="applicationContext-somehost.xml7>
現(xiàn)在,在獨(dú)立的XML定義文件和一般的應(yīng)用程序上下文定義文
件中的全部通用Bean定義都有了特定于主機(jī)的連接。由于大多數(shù)的
Bean都不是特定于主機(jī)的,因此我們可以像處理Web應(yīng)用程序中
的其他資源一樣自由地處理applicationcontext.xml文件,并可以
通過合適的版本限制系統(tǒng)與其進(jìn)行同步。
但是,上述方法也有肯定的弊端。假如您想保留不同XML文件
的不同配置,就仍舊必需擔(dān)憂applicationcontext.xml的同步性,
因?yàn)橘Y源的名稱必需依據(jù)不同服務(wù)器進(jìn)行更改。雖然與原有的解決方
案相比有了很大提高,只需更改文件名,但是這還是須要開發(fā)人員的
手動幫助。
由于與applicationcontext.xml相比,主機(jī)配置不需如此頻繁
地進(jìn)行更改,因此下一步便是將主機(jī)配置移動到web.xml文件中(假
如可能的話)。幸運(yùn)的是,我們有一個(gè)可用的解決方案??匆幌孪旅?/p>
關(guān)于web.xml配置的片斷:
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListe
ner
</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name
>
<param-value>
/WEB-INF/applicationContext.xml
/WEB-INF/applicationContext-somehost.xml
</param-value>
</context-param>
正如您所看到的,除了web.xml文件中常有的
ContextLoaderListener之外,我們還添加了
contextConfigLocation上下文參數(shù)配置。這一參數(shù)用于指示框架
查找這些配置文件的位置。假如這一參數(shù)被省略,則Spring就只能
到applicationcontext.xml中查找。這里我們也定義了特定于主機(jī)
的配置文件來運(yùn)用。
利用這種方法,我們將全部特定于主磯的配置從
applicationContext.xml文件中移除,這樣便減輕了其在不同應(yīng)用
程序部署中的同步性。
假如這種方法成為您的新習(xí)慣,您還可以使其更加敏捷。通過遵
守下列指令,也可以將特定于主機(jī)的配置從web.xml文件中移除。
為此,須要創(chuàng)建特定于我們的應(yīng)用程序上下文的類:
packagenet.nighttale.spring.util;
import.InetAddress;
import
org.springframework,web.context.support.XmlWebApplica
tionContext;
publicclassPerHostXmlWebApplicationContext
extendsXmlWebApplicationContext{
protectedString[]getDefaultConfigLocations(){
Stringhostname="localhost";
try{
hostname=
InetAddress.getLocalHost().getHostName();
}catch(Exceptione){
}
StringperHostConfiguration=
DEFAULT_CONFIG_LOCATION_PREFIX
+"applicationContext-"
+hostname
+DEFAULT_CONFIG_LOCATION_SUFFIX
Iogger.debug(
"Addingperhostconfigurationfile:"
+perHostConfiguration
);
if(getNamespace()!=null){
returnnewString[]{
DEFAULT_CONFIG_LOCATION_PREFIX
+getNamespace()
+DEFAULT_CONFIG_LOCATION_SUFFIX
,perHostConfiguration};
?
else{
returnnewString[]{
DEFAULT_CONFIG_LOCATION
,perHostConfiguration};
)
}
}
這個(gè)類拓展了Spring中常被作為默認(rèn)值運(yùn)用的
XmlWebApplicationContextoXmlWebApplicationContext類
將Web應(yīng)用程序的配置從XML定義文件中復(fù)制過來。默認(rèn)狀況下,
它可以配置來自applicationcontext.xml和
[servlet-name]-servlet.xml文件中的應(yīng)用程序。這個(gè)類執(zhí)行的
惟一一項(xiàng)額外任務(wù)便是獲得它所在的主機(jī)名稱,并將
applicationContext-[hostname].xml文彳牛添力口到西己置文件列
表中。
為了運(yùn)用這個(gè)類,我們須要對其進(jìn)行編譯,將其包含在類途徑中,
并指示Spring框架運(yùn)用它。前兩步特別簡潔,我們就不在此贅述。
我們可以指示Sping通過contextclass上下文參數(shù)來運(yùn)用它。除
了web.xml文件中的原有配置,我們還可以添加下列內(nèi)容:
<context-param>
<param-name>contextClass</param-name>
<param-value>
net.nighttale.spring,util.PerHostXmlWebApplicationCont
ext
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年黑龍江省公需課學(xué)習(xí)-《中華人民共和國農(nóng)產(chǎn)品質(zhì)量安全法》解讀
- 闌尾炎腔鏡手術(shù)術(shù)后護(hù)理案例分析與實(shí)踐-1
- 預(yù)制廠安全教育課件
- 妨害公務(wù)罪課件教學(xué)
- 醫(yī)院檢驗(yàn)科年度工作計(jì)劃(4篇)
- 網(wǎng)絡(luò)推廣面試通關(guān)秘籍
- 建筑企業(yè)安全教育培訓(xùn)制度(3篇)
- 2026年天津衛(wèi)生專業(yè)技術(shù)資格考試(外科護(hù)理-基礎(chǔ)知識主管護(hù)師代碼370)模擬題及答案解析
- 監(jiān)獄消防安全保障
- 高中心理健康教育課程活動中的心理健康教育理念與實(shí)踐教學(xué)研究課題報(bào)告
- 配電線路缺陷管理
- 基于用戶行為的廣告精準(zhǔn)推送
- 第六單元《時(shí)間像小馬車》課件 人音版音樂一年級下冊
- 2025年科研項(xiàng)目保密合同
- 大學(xué)生勞動教育(高職版)知到智慧樹章節(jié)測試課后答案2024年秋深圳職業(yè)技術(shù)大學(xué)
- 提高手術(shù)接臺效率
- 2024秋五年級英語上冊 Unit 4 What can you do說課稿1 人教PEP
- 華南理工大學(xué)《大數(shù)據(jù)導(dǎo)論》2021-2022學(xué)年期末試卷
- 土地政策學(xué)形成性考核一-國開(SC)-參考資料
- 屋面瓦更換施工方案
- 新能源汽車公司售后維修培訓(xùn)
評論
0/150
提交評論