http://www.blogjava.net/max/archive/2006/11/01/78536.html
Struts 2.0的國際化更靈活是因為它可以能根據不同需要配置和擷取資源(properties)檔案。在Struts 2.0中有下面幾種方法:
- 使用全域的資源檔,方法如上例所示。這適用於遍佈於整個應用程式的國際化字串,它們在不同的包(package)中被引用,如一些比較共用的出錯提示;
- 使用包範圍內的資源檔。做法是在包的根目錄下建立名的package.properties和package_xx_XX.properties檔案。這就適用於在包中不同類訪問的資源;
- 使用Action範圍的資源檔。做法為Action的包下建立檔案名稱(除副檔名外)與Action類名同樣的資源檔。它只能在該Action中訪問。如此一來,我們就可以在不同的Action裡使用相同的properties名表示不同的值。例如,在ActonOne中title為“動作一”,而同樣用title在ActionTwo表示“動作二”,節省一些命名工夫;
- 使用<s:i18n>標誌訪問特定路徑的properties檔案。使用方法請參考我早前的文章《常用的Struts 2.0的標誌(Tag)介紹》。在您使用這一方法時,請注意<s:i18n>標誌的範圍。在<s:i18n name="xxxxx">到</s:i18n>之間,所有的國際化字串都會在名為xxxxx資源檔尋找,如果找不到,Struts 2.0就會輸出預設值(國際化字串的名字)。
上面列舉了四種配置和訪問資源的方法,它們的範圍分別是從大到小,而Struts 2.0在尋找國際化字串所遵循的是特定的順序,3所示:
圖3 資源檔尋找順序圖
假設我們在某個ChildAction中調用了getText("user.title"),Struts 2.0的將會執行以下的操作:
- 尋找ChildAction_xx_XX.properties檔案或ChildAction.properties;
- 尋找ChildAction實現的介面,尋找與介面同名的資源檔MyInterface.properties;
- 尋找ChildAction的父類ParentAction的properties檔案,檔案名稱為ParentAction.properties;
- 判斷當前ChildAction是否實現介面ModelDriven。如果是,調用getModel()獲得對象,尋找與其同名的資源檔;
- 尋找當前包下的package.properties檔案;
- 尋找當前包的父包,直到最頂層包;
- 在值棧(Value Stack)中,尋找名為user的屬性,轉到user類型同名的資源檔,尋找鍵為title的資源;
- 尋找在struts.properties配置的預設的資源檔,參考例1;
- 輸出user.title。