<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    無(wú)為

    無(wú)為則可為,無(wú)為則至深!

      BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
      190 Posts :: 291 Stories :: 258 Comments :: 0 Trackbacks

    國(guó)際化是商業(yè)系統(tǒng)中不可或缺的一部分,所以無(wú)論您學(xué)習(xí)的是什么Web框架,它都是必須掌握的技能。

    其實(shí),Struts 1.x在此部分已經(jīng)做得相當(dāng)不錯(cuò)了。它極大地簡(jiǎn)化了我們程序員在做國(guó)際化時(shí)所需的工作,例如,如果您要輸出一條國(guó)際化的信息,只需在代碼包中加入FILE-NAME_xx_XX.properties(其中FILE-NAME為默認(rèn)資源文件的文件名),然后在struts-config.xml中指明其路徑,再在頁(yè)面用<bean:message>標(biāo)志輸出即可。

    不過(guò),所謂“沒(méi)有最好,只有更好”。Struts 2.0并沒(méi)有在這部分止步,而是在原有的簡(jiǎn)單易用的基礎(chǔ)上,將其做得更靈活、更強(qiáng)大。

    國(guó)際化Hello World

    下面讓我們看一個(gè)例子——HelloWorld。這個(gè)例子演示如何根據(jù)用戶(hù)瀏覽器的設(shè)置輸出相應(yīng)的HelloWorld。

    1. 在Eclipse創(chuàng)建工程配置開(kāi)發(fā)和運(yùn)行環(huán)境(如果對(duì)這個(gè)步驟有問(wèn)題,可以參考我早前的文章《為Struts 2.0做好準(zhǔn)備》)。
    2. 在src文件夾中加入struts.properties文件,內(nèi)容如下:
      struts.custom.i18n.resources=globalMessages
      Struts 2.0有兩個(gè)配置文件,struts.xml和struts.properties都是放在WEB-INF/classes/下。
      • struts.xml用于應(yīng)用程序相關(guān)的配置
      • struts.properties用于Struts 2.0的運(yùn)行時(shí)(Runtime)的配置
    3. 在src文件夾中加入globalMessages_en_US.properties文件,內(nèi)容如下:
      HelloWorld=Hello World!
    4. 在src文件夾中加入globalMessages_zh_CN.properties文件,內(nèi)容如下:
      HelloWorld=你好,世界!
      在此想和大家分享一個(gè)不錯(cuò)的編寫(xiě)properties文件的Eclipse插件(plugin),有了它我們?cè)诰庉嬕恍┖?jiǎn)體中文、繁體中文等Unicode文本時(shí),就不必再使用native2ascii編碼了。您可以通過(guò)Eclipse中的軟件升級(jí)(Software Update)安裝此插件,步驟如下:
      1、展開(kāi)Eclipse的Help菜單,將鼠標(biāo)移到Software Update子項(xiàng),在出現(xiàn)的子菜單中點(diǎn)擊Find and Install;
      2、在Install/Update對(duì)話(huà)框中選擇Search for new features to install,點(diǎn)擊Next;
      3、在Install對(duì)話(huà)框中點(diǎn)擊New Remote Site;
      4、在New Update Site對(duì)話(huà)框的Name填入“PropEdit”或其它任意非空字符串,在URL中填入http://propedit.sourceforge.jp/eclipse/updates/;
      5、在Site to include to search列表中,除上一步加入的site外的其它選項(xiàng)去掉,點(diǎn)擊Finsih;
      6、在彈出的Updates對(duì)話(huà)框中的Select the features to install列表中將所有結(jié)尾為“3.1.x”的選項(xiàng)去掉(適用于Eclipse 3.2版本的朋友);
      7、點(diǎn)擊Finish關(guān)閉對(duì)話(huà)框;
      8、在下載后,同意安裝,再按提示重啟Eclipse,在工具條看到形似vi的按鈕表示安裝成功,插件可用。此時(shí),Eclpise中所有properties文件的文件名前有綠色的P的圖標(biāo)作為標(biāo)識(shí)。
    5. 在WebContent文件夾下加入HelloWorl.jsp文件,內(nèi)容如下:
      <%@ page ?contentType="text/html; charset=UTF-8"%>
      <%@taglib prefix="s" uri="/struts-tags"%>
      <html>
      <head>
      ? ?
      <title>Hello World</title>
      </head>
      <body>
      ? ?
      <h2><s:text name="HelloWorld"/></h2>
      ? ?
      <h2><s:property value="%{getText('HelloWorld')}"/></h2>
      </body>
      </html>
    6. 發(fā)布運(yùn)行應(yīng)用程序,在瀏覽器地址欄中輸入http://localhost:8080/Struts2_i18n/HelloWorld.jsp ,出現(xiàn)圖1所示頁(yè)面。
      圖1 中文輸出
      圖1 中文輸出
    7. 將瀏覽器的默認(rèn)語(yǔ)言改為“英語(yǔ)(美國(guó))”,刷新頁(yè)面,出現(xiàn)圖2所示頁(yè)面。
      圖2 英文輸出
      圖2 英文輸出
    上面的例子的做法,與Struts 1.x的做法相似,似乎并不能體現(xiàn)Struts 2.0的優(yōu)勢(shì)。不過(guò),我在上面的例子用了兩種方法來(lái)顯示國(guó)際化字符串,其輸出是相同的。其實(shí),這就是Struts 2.0的一個(gè)優(yōu)勢(shì),因?yàn)樗J(rèn)支持EL,所示我們可以用getText方法來(lái)簡(jiǎn)潔地取得國(guó)際化字符串。另外更普遍的情況——在使用UI表單標(biāo)志時(shí),getText可以用來(lái)設(shè)置label屬性,例如:
    <s:textfield name="name" label="%{getText('UserName')}"/>

    資源文件查找順序

    之所以說(shuō)Struts 2.0的國(guó)際化更靈活是因?yàn)樗梢阅芨鶕?jù)不同需要配置和獲取資源(properties)文件。在Struts 2.0中有下面幾種方法:

    1. 使用全局的資源文件,方法如上例所示。這適用于遍布于整個(gè)應(yīng)用程序的國(guó)際化字符串,它們?cè)诓煌陌╬ackage)中被引用,如一些比較共用的出錯(cuò)提示;
    2. 使用包范圍內(nèi)的資源文件。做法是在包的根目錄下新建名的package.properties和package_xx_XX.properties文件。這就適用于在包中不同類(lèi)訪(fǎng)問(wèn)的資源;
    3. 使用Action范圍的資源文件。做法為Action的包下新建文件名(除文件擴(kuò)展名外)與Action類(lèi)名同樣的資源文件。它只能在該Action中訪(fǎng)問(wèn)。如此一來(lái),我們就可以在不同的Action里使用相同的properties名表示不同的值。例如,在ActonOne中title為“動(dòng)作一”,而同樣用title在ActionTwo表示“動(dòng)作二”,節(jié)省一些命名工夫;
    4. 使用<s:i18n>標(biāo)志訪(fǎng)問(wèn)特定路徑的properties文件。使用方法請(qǐng)參考我早前的文章《常用的Struts 2.0的標(biāo)志(Tag)介紹》。在您使用這一方法時(shí),請(qǐng)注意<s:i18n>標(biāo)志的范圍。在<s:i18n name="xxxxx">到</s:i18n>之間,所有的國(guó)際化字符串都會(huì)在名為xxxxx資源文件查找,如果找不到,Struts 2.0就會(huì)輸出默認(rèn)值(國(guó)際化字符串的名字)。

    上面我列舉了四種配置和訪(fǎng)問(wèn)資源的方法,它們的范圍分別是從大到小,而Struts 2.0在查找國(guó)際化字符串所遵循的是特定的順序,如圖3所示:

    圖3 資源文件查找順序圖
    圖3 資源文件查找順序圖

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

    1. 查找ChildAction_xx_XX.properties文件或ChildAction.properties;
    2. 查找ChildAction實(shí)現(xiàn)的接口,查找與接口同名的資源文件MyInterface.properties;
    3. 查找ChildAction的父類(lèi)ParentAction的properties文件,文件名為ParentAction.properties;
    4. 判斷當(dāng)前ChildAction是否實(shí)現(xiàn)接口ModelDriven。如果是,調(diào)用getModel()獲得對(duì)象,查找與其同名的資源文件;
    5. 查找當(dāng)前包下的package.properties文件;
    6. 查找當(dāng)前包的父包,直到最頂層包;
    7. 在值棧(Value Stack)中,查找名為user的屬性,轉(zhuǎn)到user類(lèi)型同名的資源文件,查找鍵為title的資源;
    8. 查找在struts.properties配置的默認(rèn)的資源文件,參考例1;
    9. 輸出user.title。

    參數(shù)化國(guó)際化字符串

    許多情況下,我們都需要在動(dòng)行時(shí)(runtime)為國(guó)際化字符插入一些參數(shù),例如在輸入驗(yàn)證提示信息的時(shí)候。在Struts 2.0中,我們通過(guò)以下兩種方法做到這點(diǎn):

    1. 在資源文件的國(guó)際化字符串中使用OGNL,格式為${表達(dá)式},例如:
      validation.require=${getText(fileName)} is required
    2. 使用java.text.MessageFormat中的字符串格式,格式為{ 參數(shù)序號(hào)(從0開(kāi)始), 格式類(lèi)形(number | date | time | choice), 格式樣式},例如:
      validation.between=Date must between {0, date, short} and {1, date, short}
    在顯示這些國(guó)際化字符時(shí),同樣有兩種方法設(shè)置參數(shù)的值:
    1. 使用標(biāo)志的value0、value1...valueN的屬性,如:
      <s:text name="validation.required" value0="User Name"/>
    2. 使用param子元素,這些param將按先后順序,代入到國(guó)際化字符串的參數(shù)中,例如:
      <s:text name="validation.required">
      ? ?
      <s:param value="User Name"/>
      </s:text>

    讓用戶(hù)方便地選擇語(yǔ)言

    開(kāi)發(fā)國(guó)際化的應(yīng)用程序時(shí),有一個(gè)功能是必不可少的——讓用戶(hù)快捷地選擇或切換語(yǔ)言。在Struts 2.0中,通過(guò)ActionContext.getContext().setLocale(Locale arg)可以設(shè)置用戶(hù)的默認(rèn)語(yǔ)言。不過(guò),由于這是一個(gè)比較普遍的應(yīng)用場(chǎng)景(Scenario),所以Struts 2.0為您提供了一個(gè)名i18n的攔截器(Interceptor),并在默認(rèn)情況下將其注冊(cè)到攔截器鏈(Interceptor chain)中。它的原理為在執(zhí)行Action方法前,i18n攔截器查找請(qǐng)求中的一個(gè)名為"request_locale"的參數(shù)。如果其存在,攔截器就將其作為參數(shù)實(shí)例化Locale對(duì)象,并將其設(shè)為用戶(hù)默認(rèn)的區(qū)域(Locale),最后,將此Locale對(duì)象保存在session的名為“WW_TRANS_I18N_LOCALE”的屬性中。

    下面,我將提供一完整示例演示它的使用方法。

    package tutorial;

    import java.util.Hashtable;
    import java.util.Locale;
    import java.util.Map;

    publicclass Locales {
    ? ?
    public Map<String, Locale> getLocales() {
    ? ? ? ?Map
    <String, Locale> locales =new Hashtable<String, Locale>(2);
    ? ? ? ?locales.put(
    "American English", Locale.US);
    ? ? ? ?locales.put(
    "Simplified Chinese", Locale.CHINA);
    ? ? ? ?
    return locales;
    ? ?}

    }
    tutorial/Locales.java

    <%@taglib prefix="s" uri="/struts-tags"%>
    <script type="text/javascript">
    <!--
    ? ?
    function langSelecter_onChanged() {
    ? ? ? ? document.langForm.submit();
    ? ? }
    //-->
    </script>
    <s:set name="SESSION_LOCALE" value="#session['WW_TRANS_I18N_LOCALE']"/>
    <s:bean id="locales" name="tutorial.Locales"/>
    <form action="<s:url includeParams="get" encode="true"/>" name="langForm"?
    ? ? style="background-color: powderblue; padding-top: 4px; padding-bottom: 4px;">
    ? ? Language:
    <s:select label="Language"?
    ? ? ? ? list
    ="#locales.locales" listKey="value" ? ?listValue="key"
    ? ? ? ? value
    ="#SESSION_LOCALE == null ? locale : #SESSION_LOCALE"
    ? ? ? ? name
    ="request_locale" id="langSelecter"?
    ? ? ? ? onchange
    ="langSelecter_onChanged()" theme="simple"/>
    </form>
    LangSelector.jsp

    上述代碼的原理為,LangSelector.jsp先實(shí)例化一個(gè)Locales對(duì)象,并把對(duì)象的Map類(lèi)型的屬性locales賦予下拉列表(select) 。如此一來(lái),下拉列表就獲得可用語(yǔ)言的列表。大家看到LangSelector有<s:form>標(biāo)志和一段Javascript腳本,它們的作用就是在用戶(hù)在下拉列表中選擇了后,提交包含“reqeust_locale”變量的表單到Action。在打開(kāi)頁(yè)面時(shí),為了下拉列表的選中的當(dāng)前區(qū)域,我們需要到session取得當(dāng)前區(qū)域(鍵為“WW_TRANS_I18N_LOCALE”的屬性),而該屬性在沒(méi)有設(shè)置語(yǔ)言前是為空的,所以通過(guò)值棧中l(wèi)ocale屬性來(lái)取得當(dāng)前區(qū)域(用戶(hù)瀏覽器所設(shè)置的語(yǔ)言)。

    你可以把LangSelector.jsp作為一個(gè)控件使用,方法是在JSP頁(yè)面中把它包含進(jìn)來(lái),代碼如下所示:
    <s:include value="/LangSelector.jsp"/>

    在例1中的HellloWorld.jsp中<body>后加入上述代碼,并在struts.xml中新建Action,代碼如下:
    <action name="HelloWorld">
    ? ?
    <result>/HelloWorld.jsp</result>
    </action>

    或者,如果你多個(gè)JSP需要實(shí)現(xiàn)上述功能,你可以使用下面的通用配置,而不是為每一個(gè)JSP頁(yè)面都新建一個(gè)Action。
    <action name="*">
    ? ?
    <result>/{1}.jsp</result>
    </action>

    分布運(yùn)行程序,在瀏覽器的地址欄中輸入http://localhost:8080/Struts2_i18n/HelloWorld.action,出現(xiàn)圖4所示頁(yè)面:
    圖3 HelloWorld.action
    圖3 HelloWorld.action

    在下拉列表中,選擇“American English”,出現(xiàn)圖5所示頁(yè)面:
    圖3 HelloWorld.action
    圖4 HelloWorld.action
    可能大家會(huì)問(wèn)為什么一定要通過(guò)Action來(lái)訪(fǎng)問(wèn)頁(yè)面呢?
    你可以試一下不用Action而直接用JSP的地址來(lái)訪(fǎng)問(wèn)頁(yè)面,結(jié)果會(huì)是無(wú)論你在下拉列表中選擇什么,語(yǔ)言都不會(huì)改變。這表示不能正常運(yùn)行的。其原因?yàn)槿绻苯邮褂肑SP訪(fǎng)問(wèn)頁(yè)面,Struts 2.0在web.xml的配置的過(guò)濾器(Filter)就不會(huì)工作,所以攔截器鏈也不會(huì)工作。
    posted on 2006-11-01 19:06 Max 閱讀(724) 評(píng)論(11) ?編輯?收藏引用收藏至365Key 所屬分類(lèi): Struts 2.0系列


    凡是有該標(biāo)志的文章,都是該blog博主Caoer(草兒)原創(chuàng),凡是索引、收藏
    、轉(zhuǎn)載請(qǐng)注明來(lái)處和原文作者。非常感謝。

    posted on 2006-11-08 22:59 草兒 閱讀(391) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): 設(shè)計(jì)模式java
    主站蜘蛛池模板: 亚洲成色www久久网站夜月| 亚洲国产人成精品| 天天看免费高清影视| 又大又硬又爽免费视频| 亚洲黄黄黄网站在线观看| 亚洲成av人影院| 亚洲国产模特在线播放| 亚洲另类无码专区丝袜| 一级毛片无遮挡免费全部| 国产va在线观看免费| 妞干网免费视频观看| 亚洲国产主播精品极品网红| 亚洲av无码乱码国产精品fc2| 亚洲国产成人精品青青草原| 国产亚洲精品2021自在线| 成人片黄网站色大片免费观看APP| 亚洲视频免费播放| 免费观看国产小粉嫩喷水| 亚洲成av人片天堂网| 亚洲综合偷自成人网第页色| 日韩在线观看视频免费| 无码免费一区二区三区免费播放| 国产一精品一AV一免费孕妇 | 国产99久久久国产精免费| 美女内射无套日韩免费播放| 嫩草视频在线免费观看| 国产亚洲美女精品久久久久狼| 亚洲不卡中文字幕| 72pao国产成视频永久免费| 最近最新MV在线观看免费高清| 亚洲精品无码久久毛片| 亚洲人成网网址在线看| 国产精品hd免费观看| 69式国产真人免费视频| 久久亚洲欧洲国产综合| 久久夜色精品国产噜噜亚洲a| a级毛片100部免费观看| 免费毛片在线播放| 久久精品国产亚洲av四虎| 特级一级毛片免费看| 国产精品入口麻豆免费观看|