著名的Open Source論壇Jive有很多東西值得我們分析和學(xué)習(xí),通過分析其Jdom的使用機(jī)制,我們可以自如方便的讀寫XML配置文件,從而實(shí)現(xiàn)下列一些功能:
在配置文件中設(shè)置系統(tǒng)語(yǔ)言版本屬性,不同語(yǔ)言版本,系統(tǒng)界面文字不一樣,可以定義自己國(guó)家的文字,比如英文版中文簡(jiǎn)體版。這樣,可以很方便的將一個(gè)系統(tǒng)延伸到各種語(yǔ)言,不用直接修改程序,只要修改XML配置文件就可以。
在配置文件中設(shè)置郵件內(nèi)容,通常一個(gè)系統(tǒng)都有各種自動(dòng)郵件分發(fā),比如用戶注冊(cè)成功后,會(huì)有一封Email發(fā)送到他的信箱,這套系統(tǒng)安裝在不同客戶場(chǎng)合,Email的內(nèi)容當(dāng)然不一樣,如A客戶使用了這套系統(tǒng),當(dāng)然希望在Email中有A客戶的單位名稱,這些都不必修改程序可以完成。
設(shè)置系統(tǒng)的可選屬性,一個(gè)系統(tǒng)安裝在不同客戶場(chǎng)合中,客戶的要求總有些不一樣,有些功能是可選的,那么當(dāng)然這些都要設(shè)置在XML配置文件中。
使用XML存放樹形結(jié)構(gòu)記錄是最方便的,尤其對(duì)于那些目錄分類系統(tǒng),如Yahoo,在大分類中有小分類,或者直接是元素我們知道關(guān)系數(shù)據(jù)庫(kù)是不擅長(zhǎng)存放樹形數(shù)據(jù),在關(guān)系數(shù)據(jù)庫(kù)中,典型做法是采取兩個(gè)表:一個(gè)表記錄每個(gè)cell;一個(gè)表指明其前后關(guān)系;但是我們一旦要從這兩張表展開樹形結(jié)構(gòu),將要在空間和時(shí)間上反復(fù)平衡。
如果使用XML作為數(shù)據(jù)源,就很方便解決這個(gè)問題,如果配合對(duì)XML數(shù)據(jù)源有很方便的增、修、等功能,那么我們當(dāng)然選擇XML,實(shí)際上,Jdom就方便地提供了這個(gè)工具.Jdom是類似DOM SAX之類的XML解析辦法,只適合Java語(yǔ)言,Jdom的特點(diǎn)就是簡(jiǎn)單方便。
那么,讓我們來(lái)看看Jive是怎么實(shí)現(xiàn)上面功能的吧,它是把這些屬性都寫在一個(gè)叫jive_config.xml的文件中。這個(gè)XML文件的排列方式和使用方式是這樣:
XML文件內(nèi)容格式:
<!-- root element, all properties must be under this element -->
<jive>
<email>
<fromName>Jive_Administrator</fromName>
<fromEmail>webmaster@example.com</fromEmail>
<subject>Your thread was updated!</subject>
<body>Hello {name}! The thread {threadName} was updated!</body>
</email>
<jive>
其中:
<jive></jive>
是根元素,所有的屬性必須在其中。使用方式也比較簡(jiǎn)單,使用標(biāo)點(diǎn)符號(hào)“.”來(lái)間隔。比如我們要得到上面的webmaster@example.com的值,那么使用email.fromEmail就可以。在Jive中,具體語(yǔ)句就是JiveGlobals.getJiveProperty("email.fromEmail");這樣獲取值很簡(jiǎn)單,而且明了,無(wú)論XML樹形結(jié)構(gòu)有多深,我們都可以方便的獲取。
這里關(guān)鍵的是一個(gè)使用Jdom來(lái)解析XML文件的類:XMLProperties ,其中實(shí)現(xiàn)了幾個(gè)主要操作方法:
獲得(查詢):getProperty(name) ;
新增修改:properties.setProperty(name, value);
刪除:properties.deleteProperty(name) ;
這幾個(gè)方法是不是很類似Hasntable的方法?Hashtable中數(shù)據(jù)是存放在內(nèi)存中,而XML是存放在文件系統(tǒng),無(wú)疑我們可以象使用hashtable一樣方便的使用XML。
XMLProperties我們可以原封不動(dòng)的拷貝到我們系統(tǒng)中。唯一要做的就是編制類似Jive的JiveGlobals,其實(shí)這也很簡(jiǎn)單,分兩步:先load取出XML文件;然后就提供getProperty(name)等方法。如
public class JiveGlobals {
private static final String JIVE_CONFIG_FILENAME = "jive_config.xml";
....
public static String getJiveProperty(String name) {
loadProperties();
return properties.getProperty(name);
}
....
private synchronized static void loadProperties() {
if (properties == null) {
//Create a manager with the full path to the xml config file.
properties = new XMLProperties(jiveHome + File.separator +
JIVE_CONFIG_FILENAME);
}
}
}
當(dāng)然,所有這些前提,是到http://www.jdom.org下載Jdom包,并加入到Tomcat的common/lib中,或者放入Classpath中。
其他輔助文件有:DataFormatFilter.java DataUnformatFilter.java XMLFilterBase.java。如果你對(duì)Jdom具體每一句是如何使用的,可以仔細(xì)研究XMLProperties,很容易理解的.