為了示例的簡(jiǎn)潔,刪除在9.4節(jié)中添加的I18NAction_zh_CN.properties文件和package.properties文件,只保留全局級(jí)國(guó)際化信息資源文件。并在message.properteis中增加一個(gè)帶有參數(shù)的國(guó)際化信息。
java代碼:
- labela = labela in zh_CN
- labelb = labelb,{0}
注意:本節(jié)中的訪問,都是在瀏覽器使用中文zh_CN的前提下訪問的。
9.5.1用<s:text>訪問國(guó)際化信息
在前面已經(jīng)使用了<s:text>標(biāo)簽來(lái)訪問國(guó)際化信息,只需要在它的name屬性上填入需要的key即可。下面,來(lái)看看它的其它的屬性。
1:使用帶參數(shù)的國(guó)際化信息
可以用參數(shù)把一些可變值傳給國(guó)際化信息,在<s:text>標(biāo)簽訪問國(guó)際化信息的時(shí)候,只需要配合上<s:param>子標(biāo)簽即可傳入?yún)?shù),示例如下:
java代碼:
- <%@ taglib prefix="s" uri="/struts-tags" %>
- <s:text name="labela"/>
- <hr>
- <s:text name="labelb">
- <s:param>ok</s:param>
- </s:text>
上面的示例中,key為labela的國(guó)際化信息沒有參數(shù),因此<s:text>標(biāo)簽直接結(jié)束,沒有子標(biāo)簽;而key為labelb的國(guó)際化信息有參數(shù),因此<s:text>標(biāo)簽用<s:param>子標(biāo)簽來(lái)傳入?yún)?shù)值ok。在運(yùn)行的時(shí)候,參數(shù){0}被替換為ok,最終顯示為:

圖9.7 使用<s:param>子標(biāo)簽為<s:text>標(biāo)簽傳遞參數(shù)的結(jié)果
2:指定國(guó)際化信息來(lái)源
再來(lái)添加一個(gè)國(guó)際化信息來(lái)源。比如,恢復(fù)包級(jí)國(guó)際化信息資源文件,也就是package_zh_CN.properties文件,內(nèi)容如下:
java代碼:
- labela = labela in zh_CN with package
現(xiàn)在,同時(shí)存在全局級(jí)國(guó)際化信息資源和包級(jí)國(guó)際化信息資源,根據(jù)前面所學(xué)的知識(shí),包級(jí)國(guó)際化信息資源會(huì)覆蓋全局級(jí)國(guó)際化信息資源,因此,<s:text name=”labela”/>將會(huì)返回在package_zh_CN.properties中定義的labela = labela in zh_CN with package。
現(xiàn)在需要仍然顯示全局級(jí)的國(guó)際化信息,該怎么辦呢?
可以通過(guò)<s:i18n>標(biāo)簽,來(lái)為<s:text>標(biāo)簽指定國(guó)際化信息來(lái)源。如果<s:text>標(biāo)簽作為<s:i18n>標(biāo)簽的子標(biāo)簽出現(xiàn),則會(huì)使用<s:i18n>指定的國(guó)際化信息來(lái)源。把jsp修改如下:
java代碼:
- <%@ taglib prefix="s" uri="/struts-tags" %>
-
- <s:text name="labela"/>
- <hr>
- <s:i18n name="message">
- <s:text name="labela"/>
- </s:i18n>
解釋一下如何引用國(guó)際化信息資源,仍然分為三種情況討論:
- 全局級(jí)國(guó)際化信息資源:直接用文件前綴名即可—message。
- 包級(jí)國(guó)際化信息資源:用這個(gè)包的全限定名+package—cn.javass.i18n.package。
- 類級(jí)國(guó)際化信息資源:用這個(gè)類的全限定名—cn.javass. i18n.I18NAction。
上面的示例中,第一個(gè)<s:text>標(biāo)簽沒有作為<s:i18n>的標(biāo)簽子標(biāo)簽出現(xiàn),則它訪問包級(jí)國(guó)際化信息資源;而第二個(gè)<s:text>標(biāo)簽作為<s:i18n>標(biāo)簽的子標(biāo)簽出現(xiàn),則它訪問<s:i18n>標(biāo)簽中指定的message國(guó)際化信息資源,最終顯示為:

圖9.8 使用<s:i18n>標(biāo)簽臨時(shí)指定國(guó)際化信息來(lái)源的結(jié)果
9.5.2用表單標(biāo)簽訪問國(guó)際化信息
在前面學(xué)過(guò)使用Struts的表單標(biāo)簽來(lái)建立一張表單,看看如下代碼:
java代碼:
- <%@ taglib prefix="s" uri="/struts-tags" %>
- <s:form>
- <s:textfield name="name1" label="labela"/>
- </s:form>
它采用<s:form>的默認(rèn)主題(xhtml)建立了一個(gè)一行一列的表單,其中,<s:textfield>標(biāo)簽的label屬性用于在文本框前生成這個(gè)文本框的說(shuō)明,label屬性就是簡(jiǎn)單的把它的值“l(fā)abela”放在了文本框前。
現(xiàn)在只需要做個(gè)小小的改動(dòng),就可以訪問國(guó)際化的信息了,簡(jiǎn)單的把label屬性改為key屬性,就可以訪問國(guó)際化信息來(lái)顯示文本框前的說(shuō)明信息了,示例如下:
java代碼:
- <%@ taglib prefix="s" uri="/struts-tags" %>
- <s:form>
- <s:textfield name="name1" key="labela"/>
- </s:form>
與<s:textfield>類似,s標(biāo)簽中的其他可見表單域標(biāo)簽也都支持使用key屬性來(lái)訪問國(guó)際化信息,包括:<s:label/>、<s:textarea/>、<s:password/>、<s:submit/>等等,這里就不再去列舉了。
使用表單標(biāo)簽還有兩個(gè)問題:
- 表單標(biāo)簽在訪問國(guó)際化信息的時(shí)候,不能使用<s:param>標(biāo)簽指定參數(shù)值。
- 表單標(biāo)簽也可以使用<s:i18n>標(biāo)簽來(lái)指定國(guó)際化信息來(lái)源,代碼示例如下:
java代碼:
- <%@ taglib prefix="s" uri="/struts-tags" %>
- <s:form>
- <s:textfield name="name1" key="labela"/>
- </s:form>
- <hr>
- <s:i18n name="message">
- <s:form>
- <s:textfield name="name1" key="labela"/>
- </s:form>
- </s:i18n>
可以看到,第一個(gè)仍訪問默認(rèn)的國(guó)際化信息來(lái)源,而第二個(gè)則指定了名稱為message的全局級(jí)國(guó)際化信息。最終顯示為:

圖9.9 使用<s:i18n>標(biāo)簽臨時(shí)指定國(guó)際化信息來(lái)源的結(jié)果
9.5.3在Action中訪問國(guó)際化信息
前面都是在頁(yè)面上來(lái)訪問國(guó)際化的信息,如果要在Action中訪問國(guó)際化信息,該怎么辦呢?
如果我們自己寫的Action類繼承自ActionSupport,就可以直接使用ActionSupport的一系列g(shù)etText方法來(lái)訪問國(guó)際化信息。這些方法聲明于ActionSupport類實(shí)現(xiàn)的TextProvider接口。
分為三種情況討論:
直接調(diào)用最簡(jiǎn)單的getText(String aTextName)即可,傳入國(guó)際化信息的key,這個(gè)在前面講ActionSupport的時(shí)候,就示例過(guò)這種情況。
調(diào)用可以設(shè)置參數(shù)的getText(String aTextName,String defaultValue,String… args),其中,第一個(gè)參數(shù)為國(guó)際化信息的key,第二個(gè)參數(shù)為找不到此key時(shí)返回的默認(rèn)值,第三個(gè)String[]參數(shù)傳入需要傳給國(guó)際化信息的參數(shù)。
調(diào)用其getTexts(String aBundleName)可以返回一個(gè)ResourceBundle對(duì)象,可然后就可以自由操作此ResourcBundle對(duì)象。
比如,可以在execute方法中訪問國(guó)際化信息,示例如下:
java代碼:
- public class I18NAction extends ActionSupport{
- public String execute() throws Exception {
- System.out.println(this.getText("labela"));
- System.out.println(this.getText("labelb",null,"ok"));
- ResourceBundle bundle = this.getTexts("message");
- System.out.println(bundle.getString("labela"));
- return SUCCESS;
- }
- }
在上例中,第一句訪問默認(rèn)的國(guó)際化信息,第二句訪問默認(rèn)的國(guó)際化信息并傳入?yún)?shù)值為ok,第三句訪問名為message的全局國(guó)際化信息。訪問這個(gè)Action,運(yùn)行的結(jié)果是
java代碼:
- labela in zh_CN with package
- labelb,ok
- labela in zh_CN
|