我的java天地

          Struts2的國(guó)際化

          資源文件的命名:basename_language_country.properties

          JAVA國(guó)際化

          如果系統(tǒng)同時(shí)存在資源文件、類(lèi)文件,系統(tǒng)將以類(lèi)文件為主,而不會(huì)調(diào)用資源文件。

          對(duì)于簡(jiǎn)體中文的Locale,ResourceBundle搜索資源的順序是:

          (1)baseName_zh_CN.class

          (2)baseName_zh_CN.properties

          (3)baseName_zh.class

          (4)baseName_zh.properties

          (5)baseName.class

          (6)baseName.properties

          ?

          Struts2的國(guó)際化入門(mén)

          Struts2國(guó)際化是建立在Java國(guó)際化的基礎(chǔ)上的,一樣是通過(guò)提供不同國(guó)家/語(yǔ)言環(huán)境的消息資源,然后通過(guò)ResourceBundle

          加載指定Locale對(duì)應(yīng)的資源文件,再取得該資源文件中指定key對(duì)應(yīng)的消息--整個(gè)過(guò)程與JAVA程序的國(guó)家化完全相同,只是

          Struts2框架對(duì)JAVA程序國(guó)際化進(jìn)行了進(jìn)一步封裝,從而簡(jiǎn)化了應(yīng)用程序的國(guó)際化。

          Struts2需要國(guó)際化的部分

          類(lèi)型轉(zhuǎn)換:

          數(shù)據(jù)校驗(yàn):

          驗(yàn)證框架xml配置文件的國(guó)際化:RegisterAction-validation.xml文件<message key="username.xml.invalid"/>

          JSP頁(yè)面的國(guó)際化:<s:text name="addUser"/>

          Action的國(guó)際化:利用ActionSupport類(lèi)提供的getText()方法.

          Struts2中加載全局資源文件

          struts.xml

          <constant name="struts.custom.i18n.resources" value="baseName"/>

          struts.properties

          struts.custom.i18n.resources=baseName

          訪問(wèn)國(guó)際化消息

          Struts2訪問(wèn)國(guó)際化消息主要有如下三種方式:

          (1)JSP頁(yè)面:<s:text name="key"/>

          (2)Action類(lèi)中:使用ActionSupport類(lèi)的getText方法。

          (3)表單元素的Label里:為表單元素指定一個(gè)key屬性

          輸出帶占位符的國(guó)際化消息

          Struts2中提供了如下兩種方式來(lái)填充消息字符串中的占位符

          (1)JSP頁(yè)面,在<s:text.../>標(biāo)簽中使用多個(gè)<s:param.../>標(biāo)簽來(lái)填充消息中的占位符。

          (2)Action中,在調(diào)用getText方法時(shí)使用getText(String aTextName,List args)或getText(String key, String[] args)方法來(lái)填充占位符。

          除此之外,Struts2還提供了對(duì)占位符的一種替代方式,這種方式允許在國(guó)際化消息資源文件中使用表達(dá)式,對(duì)于這種方式,則可避免在使用國(guó)際化消息時(shí)還需要為占位符傳入?yún)?shù)值。

          如下在消息資源中使用表達(dá)式

          succTip=${username}, 歡迎, 您已經(jīng)登錄!

          在上面的消息資源中,通過(guò)使用表達(dá)式,可以從ValueStack中取出該username屬性值,自動(dòng)填充到該消息資源中。

          加載資源文件的方式

          (1)加載全局資源文件: <constant name="struts.custom.i18n.resources" value="baseName"/>

          (2)包范圍資源文件 :為Struts2指定包范圍資源文件的方法是,在包的根路徑下建立多個(gè)文件名為package_language_country.properties的文件,一旦建立了

          ??? 這個(gè)系列的國(guó)際化資源文件,應(yīng)用中處于該包下的所有Action都可以訪問(wèn)該資源文件。需要注意的是上面的包范圍資源文件的baseName就是package,

          ?不是Action所在的包名。

          (3)Action范圍資源文件:在Action類(lèi)文件所在的路徑建立多個(gè)文件名為ActionName_language_country.properties的文件。

          (4)臨時(shí)指定資源文件:<s:i18n.../>標(biāo)簽的name屬性指定臨時(shí)的國(guó)際化資源文件

          加載資源文件的順序

          Action中加載資源文件,假設(shè)我們?cè)谀硞€(gè)ChildAction中調(diào)用了getText("user.title"),Struts 2.0的將會(huì)執(zhí)行以下的操作:

          (1)優(yōu)先加載系統(tǒng)中保存在ChildAction的類(lèi)文件相同位置,且baseName為ChildAction的系列資源文件。

          (2)如果在(1)中找不到指定key對(duì)應(yīng)的消息,且ChildAction有父類(lèi)ParentAction,則加載系統(tǒng)中保存在ParentAction的類(lèi)文件相同位置,且

          ?? baseName為ParentAction的系列資源文件。

          (3)如果在(2)中找不到指定key對(duì)應(yīng)的消息,且ChildAction有實(shí)現(xiàn)接口IChildAction,則加載系統(tǒng)中保存在IChildAction的類(lèi)文件相同位置,且

          ?? baseName為IChildAction的系列資源文件。

          (4)如果在(3)中找不到指定key對(duì)應(yīng)的消息,且ChildAction有實(shí)現(xiàn)接口ModelDriven(即使用模型驅(qū)動(dòng)模式),則對(duì)于getModel()方法返回的model對(duì)象,

          ?? 重新執(zhí)行第(1)步操作。

          (5)如果在(4)中找不到指定key對(duì)應(yīng)的消息,則查找當(dāng)前包下baseName為package的系列資源文件。

          (6)如果在(5)中找不到指定key對(duì)應(yīng)的消息,則沿著當(dāng)前包上溯,直到最頂層包來(lái)查找baseName為package的系列資源文件。

          (7)如果在(6)中找不到指定key對(duì)應(yīng)的消息,則查找struts.custom.i18n.resources常量指定baseName的系列資源文件。

          (8)如果經(jīng)過(guò)上面的步驟一直找不到key對(duì)應(yīng)的消息,將直接輸出該key的字符串值。

          對(duì)于在JSP中訪問(wèn)國(guó)際化消息,則簡(jiǎn)單的多,他們又可以分為兩種形式:

          (1)對(duì)于使用<s:i18n.../>標(biāo)簽作為父標(biāo)簽的<s:text.../>標(biāo)簽、表單標(biāo)簽的形式:

          ?? a、將從<s:i18n.../>標(biāo)簽指定的國(guó)際化資源文件中加載指定key對(duì)應(yīng)的消息。

          ?? b、如果在a中找不到指定key對(duì)應(yīng)的消息,則查找struts.custom.i18n.resources常量指定baseName的系列資源文件。

          ?? c、如果經(jīng)過(guò)上面步驟一直找不到該key對(duì)應(yīng)的消息,將直接輸出該key的字符串值。

          (2)如果<s:text.../>標(biāo)簽、表單標(biāo)簽沒(méi)有使用<s:i18n.../>標(biāo)簽作為父標(biāo)簽:

          ??? 直接加載struts.custom.i18n.resources常量指定baseName的系列資源文件。如果找不到該key對(duì)應(yīng)的消息,將直接輸出該key的字符串值。

          ?

          允許用戶(hù)自行選擇程序語(yǔ)言

          Struts2國(guó)際化的運(yùn)行機(jī)制

          ??? 在Struts2中,可以通過(guò)ActionContext.getContext().setLocale(Locale arg)設(shè)置用戶(hù)的默認(rèn)語(yǔ)言。

          為了簡(jiǎn)化設(shè)置用戶(hù)默認(rèn)語(yǔ)言環(huán)境,Struts2提供了一個(gè)名為i18n的攔截器(Interceptor),并且將其注冊(cè)在默認(rèn)的攔截器中(defaultStack)。

          ??? i18n攔截器在執(zhí)行Action方法前,自動(dòng)查找請(qǐng)求中一個(gè)名為request_locale的參數(shù)。如果該參數(shù)存在,攔截器就將其作為參數(shù),轉(zhuǎn)換成Locale對(duì)象,

          并將其設(shè)為用戶(hù)默認(rèn)的Locale(代表國(guó)家/語(yǔ)言環(huán)境)。

          ?除此之外,i18n攔截器還會(huì)將上面生成的Locale對(duì)象保存在用戶(hù)Session的名為WW_TRANS_I18N_LOCALE的屬性中。一旦用戶(hù)Session中存在一個(gè)名為

          WW_TRANS_I18N_LOCALE的屬性,則該屬性指定的Locale將會(huì)作為瀏覽者的默認(rèn)Locale。

          <%@ page language="java" contentType="text/html; charset=GBK"%>

          <%@taglib prefix="s" uri="/struts-tags"%>

          <script. type="text/javascript">

          function langSelecter_onChanged()

          {

          ?document.getElementById("langForm").submit();

          }

          </script>

          <%-- 設(shè)置SESSION_LOCALE為用戶(hù)session中的WW_TRANS_I18N_LOCALE屬性值 --%>

          <s:set name="SESSION_LOCALE" value="#session['WW_TRANS_I18N_LOCALE']"/>

          <%-- 使用lee.Locales創(chuàng)建locales實(shí)例 --%>

          <s:bean id="locales" name="lee.Locales">

          ?<%-- 為locales實(shí)例傳入current參數(shù)值,如果SESSION_LOCALE為空,則返回ValueStack中l(wèi)ocale屬性值(即用戶(hù)瀏覽器設(shè)置的Locale) --%>

          ?<s:param name="current" value="#SESSION_LOCALE == null ? locale : #SESSION_LOCALE"/>

          </s:bean>

          <%-- 讓用戶(hù)選擇語(yǔ)言的表單 --%>

          <form. action="<s:url/>" id="langForm"

          ??? style="background-color:#bbbbbb; padding-top: 4px; padding-bottom: 4px;">

          ??? <s:text name="languag"/>

          ?<s:select label="Language" list="#locales.locales" listKey="value" listValue="key"

          ??????? value="#SESSION_LOCALE == null ? locale : #SESSION_LOCALE"

          ??????? name="request_locale" id="langSelecter"

          ??????? nchange="langSelecter_onChanged()" theme="simple"/>

          </form>

          在其他頁(yè)面中包含該頁(yè)面:

          <s:include value="selectlanguage.jsp"/>

          在struts.xml文件中增加Action通配符的配置:

          <?xml version="1.0" encoding="GBK"?>

          <!DOCTYPE struts PUBLIC

          ??????? "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

          ??????? "

          <struts>

          ?<constant name="struts.custom.i18n.resources" value="messageResource"/>

          ?<constant name="struts.i18n.encoding" value="GBK"/>

          ??? <package name="lee" extends="struts-default">

          ??<!-- 使用通配符定義Action的name -->

          ??<action name="*">

          ???<!-- 將請(qǐng)求轉(zhuǎn)發(fā)給/WEB-INF/jsp/路徑下同名的JSP頁(yè)面 -->

          ???<result>/WEB-INF/jsp/{1}.jsp</result>

          ??</action>

          ??? </package>

          </struts>

          posted on 2009-03-19 23:17 tobyxiong 閱讀(13619) 評(píng)論(3)  編輯  收藏 所屬分類(lèi): java

          評(píng)論

          # re: Struts2的國(guó)際化 2009-04-05 13:04 chenlin

          <B>說(shuō)的好!</B>  回復(fù)  更多評(píng)論   

          # re: Struts2的國(guó)際化 2009-04-05 13:05 chenlin

          <b>ok</b>  回復(fù)  更多評(píng)論   

          # re: Struts2的國(guó)際化 2012-08-10 14:17 lin

          就是少了例子  回復(fù)  更多評(píng)論   

          <2009年3月>
          22232425262728
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(3)

          隨筆分類(lèi)(144)

          隨筆檔案(157)

          相冊(cè)

          最新隨筆

          搜索

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 中卫市| 宁武县| 工布江达县| 乐都县| 奉节县| 海南省| 商南县| 米林县| 余庆县| 凤冈县| 淮阳县| 慈溪市| 信丰县| 中西区| 余庆县| 黑山县| 城固县| 绥化市| 同仁县| 湖州市| 仁寿县| 专栏| 延吉市| 清远市| 莎车县| 庆安县| 阜阳市| 绍兴县| 宁都县| 平度市| 信丰县| 湘潭县| 丰顺县| 新密市| 长海县| 大兴区| 汉中市| 曲阜市| 晋城| 筠连县| 涡阳县|