Spring MVC框架的高級配置_第1頁
Spring MVC框架的高級配置_第2頁
Spring MVC框架的高級配置_第3頁
Spring MVC框架的高級配置_第4頁
Spring MVC框架的高級配置_第5頁
已閱讀5頁,還剩11頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論