Struts2的国际化(一)-国际化资源文件的配置及国际化信息的访问
一、概述:
1)國際化是一種技術:在程序設計領域,把在無需改寫源代碼即可讓開發出來的應用程序能夠支持多種語言和數據格式的技術稱為國際化。
2)本地化是一個動作:與國際化對應的是本地化,指讓一個具備國際化支持的應用程序支持某個特定的地區。
3)Struts2 國際化是建立在 Java 國際化基礎上的:
>為不同國家/語言提供對應的消息資源文件
>Struts2 框架會根據請求中包含的Locale 加載對應的資源文件
>通過程序代碼取得該資源文件中指定 key 對應的消息
二、如何配置國際化資源文件?
國際化資源文件有以下4種配置方式:
I. Action 范圍資源文件: 在Action類文件所在的路徑下建立名為 ActionName_language_country.properties 的文件。
II. 包范圍資源文件: 在包的根路徑下建立文件名為 package_language_country.properties 的屬性文件,
? ? 一旦建立,處于該包下的所有 Action 都可以訪問該資源文件。注意:包范圍資源文件的 baseName就是package,不是Action所在的包名。
III. 全局資源文件
> 命名方式: basename_language_country.properties(文件建立在src目錄中)
> struts.xml中配置: <constant name="struts.custom.i18n.resources" value="baseName"/>
注意:全局資源文件中的baseName是自己指定的,但是文件名中的baseName要與struts.xml中的配置對應上。
Ⅳ.?臨時指定資源文件:使用<s:i18n.../> 標簽的 name 屬性指定臨時的國際化資源文件。(該方式不經常使用)
三、國際化資源文件加載的順序如何呢 ?
結論:離當前 Action 較近的將被優先加載。
以下為詳細的加載順序描述,了解一下:
假設我們在某個 ChildAction 中調用了getText("username"):
(1) 加載和 ChildAction 的類文件在同一個包下的系列資源文件 ChildAction.properties
(2) 加載 ChildAction 實現的接口 IChild,且和 IChild 在同一個包下 IChild.properties 系列資源文件。
(3) 加載 ChildAction 父類 Parent,且和 Parent 在同一個包下的 baseName 為 Parent.properties 系列資源文件。
(4) 若 ChildAction 實現 ModelDriven 接口,則對于getModel()方法返回的model 對象,重新執行第(1)步操作。
(5) 查找當前包下 package.properties 系列資源文件。
(6) 沿著當前包上溯,直到最頂層包來查找 package.properties 的系列資源文件。
(7) 查找 struts.custom.i18n.resources 常量指定 baseName 的系列資源文件。
(8) 直接輸出該key的字符串值。
四、?如何在頁面上和 Action 類中訪問國際化資源文件的 value 值?
I. 在 Action 類中,若 Action 實現了 TextProvider 接口, 則可以調用其 getText() 方法獲取 value 值。
> 通過繼承 ActionSupport 的方式間接的實現TextProvider接口。
II. 頁面上可以使用 s:text 標簽;對于表單標簽可以使用表單標簽的 key 屬性值
> 若有占位符,則可以使用 s:text 標簽的 s:param 子標簽來填充占位符
> 可以利用標簽和 OGNL 表達式直接訪問值棧中的屬性值(對象棧 和 Map 棧)
五、示例
示例一:在非simple主題下,在頁面上key的方式直接從資源文件中獲取對應的value值。
1)JSP頁面主要代碼如下(JSP頁面名稱為“i18n.jsp”):
1 <s:form action=""> 2 <!-- 這里label屬性的方式是把label值寫死在標簽中的 --> 3 <s:textfield name="username" label="Username"></s:textfield> 4 <!-- key 的方式是直接上資源文件中獲取 value 值 --> 5 <s:textfield name="username" key="username"></s:textfield> 6 <s:password name="password" key="password"></s:password> 7 <s:submit key="submit"></s:submit> 8 </s:form>2)對應的全局資源文件如下:
其中,i18n.properties和i18n_en_US.properties文件的內容均為:
username=UserName
password=Password
submit=Submit
i18n_zh_CN.properties文件的內容為:
username=\u7528\u6237\u540D (用戶名)
password=\u5BC6\u7801?(密碼)
submit=\u63D0\u4EA4 (提交)
3)struts.xml中的配置內容為:
<!-- 配置國際化資源文件,注意:這里value值可以是任意的,與資源文件對應即可 --> <constant name="struts.custom.i18n.resources" value="i18n"></constant>在Tomcat中部署后運行結果如下圖所示,可以看出,在非simple主題下,在頁面上使用key屬性可以方便的訪問到相應的國際化資源文件的值。
將瀏覽器語言環境設置為中文時的結果如下圖: ? ? ? ? ? ? ? ??將瀏覽器語言環境設置為英語時的結果如下圖:
? ?, ? ? ? ? ? ? ? ? ? ? ?
4)在非simple主題下,在表單標簽中,我們還可以在label屬性中使用OGNL表達式,使label標簽也能夠獲取國際化信息,
修改JSP頁面代碼如下,即將label屬性中的值改為OGNL表達式:%{getText('username')}:
<s:textfield name="username" label="%{getText('username')}"></s:textfield>★★之所以 label 標簽使用 %{getText('username')} 的方式就也可以從國際化資源文件中獲取 value 值,是因為此時在對象棧中有DefaultTextProvider 的一個實例,該對象中提供了訪問國際化資源文件的 getText() 方法,同時還需要通知 Struts2 框架 label 中放入的不再是一個普通的字符串,而是一個 OGNL 表達式,所以使用 %{} 把 getText()包裝起來, 以強制進行 OGNL 解析。
示例二:在simple主題下,在頁面上<s:text>標簽從資源文件中獲取對應的value值。
由于在simple主題下,label屬性與key屬性不再起作用,因此,這時需要使用<s:text>標簽來訪問國際化資源文件中的信息。
修改JSP頁面代碼如下:
1 <s:form action="" theme="simple"> 2 <s:text name="username"/>:<s:textfield name="username"></s:textfield><br> 3 <s:text name="username"/>:<s:textfield name="username"></s:textfield><br> 4 <s:text name="password"/>:<s:password name="password"></s:password><br> 5 <%-- submit中要在value中使用OGNL表達式--%> 6 <s:submit key="submit" value="%{getText('submit')}"></s:submit> 7 </s:form>示例三:訪問有占位符的國際化資源信息
1)JSP頁面中通過<s:text>標簽的字標簽<s:param>來填充占位符,代碼如下:
1 <s:text name="time"> 2 <s:param value="date"></s:param> 3 </s:text>并添加index.jsp頁面,以便訪問Action,代碼如下:
<a href="testI18n">Test I18N</a>2)Java代碼如下,其中包含了在Action中訪問國際化資源文件信息的方法,并對date屬性進行了賦值。
★★★若 Action 類繼承了 ActionSupport ,則可調用 TextProvider 接口的 getText 方法。
?
1 package com.atguigu.struts2.i18n.app; 2 import java.util.Arrays; 3 import java.util.Date; 4 import com.opensymphony.xwork2.ActionSupport; 5 public class TestI18nAction extends ActionSupport { 6 private Date date = null; 7 public Date getDate() { 8 return date; 9 } 10 public void setDate(Date date) { 11 this.date = date; 12 } 13 public String execute() throws Exception { 14 date = new Date(); 15 //1. 在 Action 中訪問國際化資源文件的 value 值 16 String username = getText("username"); 17 System.out.println(username); 18 //2. 帶占位符的 19 String time = getText("time", Arrays.asList(date)); 20 System.out.println(time); 21 return SUCCESS; 22 } 23 }3)在struts.xml中配置Action:
<action name="testI18n" class="com.atguigu.struts2.i18n.app.TestI18nAction"><result>/i18n.jsp</result> </action>4)在全局國際化資源文件中加入如下信息:
time=Time:{0} ?<===>?time=\u65F6\u95F4:{0} (時間:{0})
部署后運行的結果如下圖:
??<===>?
5)對于有占位符的國際化信息,我們還可以直接在國際化資源文件中使用OGNL表達式的方式來獲取對應的參數★★★
JSP頁面中添加如下代碼:
<s:text name="time2"></s:text>在全局國際化資源文件中添加如下信息:
time2=Time:${date} <===>?time2=\u65F6\u95F4:${date} (時間${date})
★★★注:${}這是OGNL表達式在properties文件中的格式,同樣,在struts.xml等中使用時也是使用${},而在JSP頁面中則是%{}的格式。(參湯陽光-OA中的說明)
注:以上內容對于其它的配置方式同樣起作用,不再一一列舉。
轉載于:https://www.cnblogs.com/KnightKitt/p/3927861.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的Struts2的国际化(一)-国际化资源文件的配置及国际化信息的访问的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C. Present(二分 + 扫描线)
- 下一篇: java小程序:求完全数