第2.6式. 使用多個資源束
問題
你可能想要將你的應(yīng)用資源分解到多個文件中,以改善應(yīng)用的組織和維護(hù)性,特別是在團(tuán)隊開發(fā)的環(huán)境中。
動作要領(lǐng)
創(chuàng)建單獨(dú)的屬性文件并且在struts-config.xml中為每一個文件聲明一個message-resources元素。
<message-resources
parameter="com.oreilly.strutsckbk.MessageResources"/>
<message-resources
parameter="com.oreilly.strutsckbk.LabelResources"
key="labels">
</message-resources>
<message-resources
parameter="com.oreilly.strutsckbk.HeaderResources"
key="headers">
</message-resources>

動作變化
Struts 使用消息資源來提供對錯誤消息、字段標(biāo)注、以及其他靜態(tài)文本的存儲機(jī)制。對于默認(rèn)的Struts 實(shí)現(xiàn),你可以將消息存儲為屬性文件(.properties文件)中的名稱(關(guān)鍵字)/值對。消息資源集基本上相當(dāng)于Java ResourceBundle(資源束)。
你可以將你的消息資源束性文件通過message-resources元素來配置。元素的parameter屬性指示了屬性文件的相對于classpath的名稱。你可以通過將文件路徑中的分隔符替換為點(diǎn)號,以及刪除文件名中的.properties擴(kuò)展名來產(chǎn)生這個屬性的值。比如,如果你的屬性文件位于/WEB-INF/classes/com/oreilly/strutsckbk/MessageResources.properties,你可以將消息資源元素設(shè)置為:
<message-resources
parameter="com.oreilly.strutsckbk.MessageResources"/>

在應(yīng)用啟動時, Struts將創(chuàng)建消息資源的運(yùn)行時表達(dá)(一個對象實(shí)例),然后將其保存在servlet context中。
你并不限于只使用一個消息資源。然而,和使用多Struts配置文件不同,如果你使用多個消息資源文件,它們并不時合并成一個文件。相反,你需要定義消息資源的不同的集合。每一個集合使用一個key屬性指定的唯一的值來標(biāo)識。如果這個屬性沒被使用,那么該消息資源就會被設(shè)置為默認(rèn)的消息集。只有一個默認(rèn)消息集存在。同時,只有一個消息資源集對應(yīng)于同一模塊中的每一個唯一關(guān)鍵字。如果你使用同一關(guān)鍵字定義了多個消息資源束,則最后一個指定的將被使用。
key屬性的值是作為servlet context 屬性的名稱,從屬性文件創(chuàng)建的消息資源束就保存在它之下。key值被用在Struts標(biāo)簽之中,比如bean:message,來標(biāo)識消息資源集,并引用到來自于屬性文件的資源束。下面是你可以如何從labels消息資源來訪問一個消息的方法:
<bean:message bundle="labels" key="label.url"/>
bundle屬性的值對應(yīng)于struts-config.xml文件中的message-resources元素的key屬性。bean:message標(biāo)簽也有一個key屬性,但它和message-resources元素的key屬性的含義完全不同。它指定一個特定的屬性來訪問消息資源中的消息。
Struts 并不關(guān)心你如何分解你的消息資源屬性文件。一種辦法是按照消息類型分解。比如,你可以將你的消息資源分解為下面的幾組:
- 錯誤消息
- 提示性消息
- 字段標(biāo)注
- 表頭單元個文本
雖然這樣分解消息資源是合乎邏輯和合理的,但在團(tuán)隊環(huán)境中則傾向于按照功能進(jìn)行分解。比如,考慮一個人力資源應(yīng)用,它有薪酬、福利和管理功能區(qū)。你可以為每一個功能區(qū)創(chuàng)建一個消息資源屬性文件。每一個屬性文件都包含該功能區(qū)域所特定的錯誤消息、提示消息、字段標(biāo)注和其他信息。如果你的開發(fā)團(tuán)隊是按照這些業(yè)務(wù)功能區(qū)進(jìn)行分組的,按照相同的分組原則對消息資源進(jìn)行分組則更加合理。相同的方法和原則也適用于Struts 配置文件的分解。
如果你熟悉Struts module,上述的每一個功能區(qū)都是一個很好的Struts module的候選。如果你使用module,那么你在struts-config文件中為某一個模塊所定義的消息資源就僅適用于該模塊。事實(shí)上,你可以在不同的模塊中定義具有相同key屬性的message-resource元素?;叵胍幌?, Struts 是使用key值將MessageResources保存在servlet context中。更準(zhǔn)確地說,實(shí)際的值將用于模塊名稱(通常引用為模塊的前綴),以及消息資源的key屬性值的串聯(lián)。
相關(guān)招式
第2.4式提供了關(guān)于分解應(yīng)用組件的技術(shù)。Struts 用戶指南提供了定義消息資源的文檔,其地址為:http://jakarta.apache.org/struts/userGuide/configuration.html#resources_config.
Struts MessageResources的JavaDoc API可以在http://jakarta.apache.org/struts/api/org/apache/struts/util/MessageResources.html處找到。
Struts 文檔中關(guān)于bean:message標(biāo)簽的文檔可以在http://jakarta.apache.org/struts/userGuide/struts-bean.html#message處找到。