你可能想要將你的應用資源分解到多個檔案中,以改善應用的組織和維護性,特別是在團隊開發的環境中。
動作要領
建立單獨的屬性檔案並且在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 使用訊息資源來提供對錯誤訊息、欄位標註、以及其他靜態文本的儲存機制。對於預設的Struts
實現,你可以將訊息儲存為屬性檔案(.properties檔案)中的名稱(關鍵字)/值對。訊息資源集基本上相當於Java
ResourceBundle(資源束)。
你可以將你的訊息資源束性檔案通過message-resources元素來配置。元素的parameter屬性指示了屬性檔案的相對於
classpath的名稱。你可以通過將檔案路徑中的分隔字元替換為點號,以及刪除檔案名稱中的.properties副檔名來產生這個屬性的值。比如,如果
你的屬性檔案位於/WEB-
INF/classes/com/oreilly/strutsckbk/MessageResources.properties,你可以將訊息資源元
素設定為:
<message-resources
parameter="com.oreilly.strutsckbk.MessageResources"/>
在應用啟動時, Struts將建立訊息資源的運行時表達(一個對象執行個體),然後將其儲存在servlet context中。
你並不限於只使用一個訊息資源。然而,和使用多Struts設定檔不同,如果你使用多個訊息資源檔,它們並不時合并成一個檔案。相反,你需要定
義訊息資源的不同的集合。每一個集合使用一個key屬性指定的唯一的值來標識。如果這個屬性沒被使用,那麼該訊息資源就會被設定為預設的訊息集。只有一個
預設訊息集存在。同時,只有一個訊息資源集對應於同一模組中的每一個唯一關鍵字。如果你使用同一關鍵字定義了多個訊息資源束,則最後一個指定的將被使用。
key屬性的值是作為servlet context
屬性的名稱,從屬性檔案建立的訊息資源束就儲存在它之下。key值被用在Struts標籤之中,比如bean:message,來標識訊息資源集,並引用
到來自於屬性檔案的資源束。下面是你可以如何從labels訊息資源來訪問一個訊息的方法:
<bean:message bundle="labels" key="label.url"/>
bundle屬性的值對應於struts-config.xml檔案中的message-resources元素的key屬性。bean:
message標籤也有一個key屬性,但它和message-resources元素的key屬性的含義完全不同。它指定一個特定的屬性來訪問訊息資源
中的訊息。
不幸的是,這種在XML元素和JSP標籤中使用同一個屬性名稱的方法在Struts中很普遍。所以必須仔細研究和注意Struts taglib文檔 (http://jakarta.apache.org/struts/userGuide/index.html) 以及Struts 的配置文檔(http://jakarta.apache.org/struts/userGuide/configuration.html#struts-config) ,免得搞混淆了。 |
Struts 並不關心你如何分解你的訊息資源屬性檔案。一種辦法是按照訊息類型分解。比如,你可以將你的訊息資源分解為下面的幾組:
雖然這樣分解訊息資源是合乎邏輯和合理的,但在團隊環境中則傾向於按照功能進行分解。比如,考慮一個人力資源應用,它有薪酬、福利和管理功能區。你
可以為每一個功能區建立一個訊息資源屬性檔案。每一個屬性檔案都包含該功能區域所特定的錯誤訊息、提示訊息、欄位標註和其他資訊。如果你的Team Dev是按照
這些業務功能區進行分組的,按照相同的分組原則對訊息資源進行分組則更加合理。相同的方法和原則也適用於Struts 設定檔的分解。
如果你熟悉Struts module,上述的每一個功能區都是一個很好的Struts
module的候選。如果你使用module,那麼你在struts-config檔案中為某一個模組所定義的訊息資源就僅適用於該模組。事實上,你可以
在不同的模組中定義具有相同key屬性的message-resource元素。回想一下, Struts
是使用key值將MessageResources儲存在servlet
context中。更準確地說,實際的值將用於模組名稱(通常引用為模組的首碼),以及訊息資源的key屬性值的串聯。