熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

開源技術—struts2中i18n的設置

2013-11-23 20:38:20  來源: Java開源技術 
針對xxxclass建立xxxproperties文件可以對class中的Output設置本地化輸出

更常用的方法是正對package建立packageNameproperties在其中設置ActionClassStringName=XXX
創建action都是……ApplicationAction extends ActionSupport{……}繼承了ActionSupport類ActionSupport中有method getText()可以通過key獲得properties中的設置

jsp文件使用properties文件中的設置首先需要AppActionSupport extends ActionSupport類在strutsxml中設置Action過濾讓jsp頁面通過該Action(class=yourPackageAppActionSupport)攔截這樣在jsp頁面可以使用標簽<s:text name=ssage />
 

  國際化是商業系統中不可或缺的一部分所以無論您學習的是什麼Web框架它都是必須掌握的技能

  其實Struts x在此部分已經做得相當不錯了它極大地簡化了我們程序員在做國際化時所需的工作例如如果您要輸出一條國際化的信息只需在代碼包中加入FILENAME_xx_XXproperties(其中FILENAME為默認資源文件的文件名)然後在strutsconfigxml中指明其路徑再在頁面用<bean:message>標志輸出即可

  不過所謂沒有最好只有更好Struts 並沒有在這部分止步而是在原有的簡單易用的基礎上將其做得更靈活更強大

國際化Hello World

  下面讓我們看一個例子——HelloWorld這個例子演示如何根據用戶浏覽器的設置輸出相應的HelloWorld



    在Eclipse創建工程配置開發和運行環境(如果對這個步驟有問題可以參考我早前的文章《為Struts 做好准備》)

    在src文件夾中加入strutsproperties文件內容如下

    strutscustominresources=globalMessages
    Struts 有兩個配置文件strutsxml和strutsproperties都是放在WEBINF/classes/下
    strutsxml用於應用程序相關的配置
    strutsproperties用於Struts 的運行時(Runtime)的配置

    在src文件夾中加入globalMessages_en_USproperties文件內容如下

    HelloWorld=Hello World!
    在src文件夾中加入globalMessages_zh_CNproperties文件內容如下

    HelloWorld=你好世界! 在此想和大家分享一個不錯的編寫properties文件的Eclipse插件(plugin)有了它我們在編輯一些簡體中文繁體中文等Unicode文本時就不必再使用nativeascii編碼了您可以通過Eclipse中的軟件升級(Software Update)安裝此插件步驟如下

    展開Eclipse的Help菜單將鼠標移到Software Update子項在出現的子菜單中點擊Find and Install
    在Install/Update對話框中選擇Search for new features to install點擊Next
    在Install對話框中點擊New Remote Site
    在New Update Site對話框的Name填入PropEdit或其它任意非空字符串在URL中填入
    在Site to include to search列表中除上一步加入的site外的其它選項去掉點擊Finsih
    在彈出的Updates對話框中的Select the features to install列表中將所有結尾為x的選項去掉(適用於Eclipse 版本的朋友)
    點擊Finish關閉對話框
    在下載後同意安裝再按提示重啟Eclipse在工具條看到形似vi的按鈕表示安裝成功插件可用此時Eclpise中所有properties文件的文件名前有綠色的P的圖標作為標識
    在WebContent文件夾下加入HelloWorljsp文件內容如下

    <%@ page  contentType=text/html; charset=UTF%>
    <%@taglib prefix=s uri=/strutstags%>
    <html>
    <head>
        <title>Hello World</title>
    </head>
    <body>
        <h><s:text name=HelloWorld/></h>
        <h><s:property value=%{getText(HelloWorld)}/></h>
    </body>
    </html>
    發布運行應用程序在浏覽器地址欄中輸入出現圖所示頁面
    圖1 中文輸出
    中文輸出
    將浏覽器的默認語言改為英語(美國)刷新頁面出現圖所示頁面


    圖2 英文輸出
    英文輸出
上面的例子的做法與Struts x的做法相似似乎並不能體現Struts 的優勢不過我在上面的例子用了兩種方法來顯示國際化字符串其輸出是相同的其實這就是Struts 的一個優勢因為它默認支持EL所示我們可以用getText方法來簡潔地取得國際化字符串另外更普遍的情況——在使用UI表單標志時getText可以用來設置label屬性例如

<s:textfield name=name label=%{getText(UserName)}/>

資源文件查找順序

  之所以說Struts 的國際化更靈活是因為它可以能根據不同需要配置和獲取資源(properties)文件在Struts 中有下面幾種方法


    使用全局的資源文件方法如上例所示這適用於遍布於整個應用程序的國際化字符串它們在不同的包(package)中被引用如一些比較共用的出錯提示
    使用包范圍內的資源文件做法是在包的根目錄下新建名的packageproperties和package_xx_XXproperties文件這就適用於在包中不同類訪問的資源
    使用Action范圍的資源文件做法為Action的包下新建文件名(除文件擴展名外)與Action類名同樣的資源文件它只能在該Action中訪問如此一來我們就可以在不同的Action裡使用相同的properties名表示不同的值例如在ActonOne中title為動作一而同樣用title在ActionTwo表示動作二節省一些命名工夫
    使用<s:in>標志訪問特定路徑的properties文件使用方法請參考我早前的文章《常用的Struts 的標志(Tag)介紹》在您使用這一方法時請注意<s:in>標志的范圍在<s:in name=xxxxx>到</s:in>之間所有的國際化字符串都會在名為xxxxx資源文件查找如果找不到Struts 就會輸出默認值(國際化字符串的名字)

  上面我列舉了四種配置和訪問資源的方法它們的范圍分別是從大到小而Struts 在查找國際化字符串所遵循的是特定的順序如圖所示

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

  假設我們在某個ChildAction中調用了getText(usertitle)Struts 的將會執行以下的操作


    查找ChildAction_xx_XXproperties文件或ChildActionproperties
    查找ChildAction實現的接口查找與接口同名的資源文件MyInterfaceproperties
    查找ChildAction的父類ParentAction的properties文件文件名為ParentActionproperties
    判斷當前ChildAction是否實現接口ModelDriven如果是調用getModel()獲得對象查找與其同名的資源文件
    查找當前包下的packageproperties文件
    查找當前包的父包直到最頂層包
    在值棧(Value Stack)中查找名為user的屬性轉到user類型同名的資源文件查找鍵為title的資源;
    查找在strutsproperties配置的默認的資源文件參考例;
    輸出usertitle

參數化國際化字符串

  許多情況下我們都需要在動行時(runtime)為國際化字符插入一些參數例如在輸入驗證提示信息的時候在Struts 我們通過以下兩種方法做到這點


    在資源文件的國際化字符串中使用OGNL格式為${表達式}例如

    validationrequire=${getText(fileName)} is required
    使用Java_Docs/html/zh_CN/api/java/text/l>javatextMessageFormat中的字符串格式格式為{ 參數序號(從開始) 格式類形(number | date | time | choice) 格式樣式}例如

    validationbetween=Date must between { date short} and { date short}
在顯示這些國際化字符時同樣有兩種方法設置參數的值

    使用標志的valuevaluevalueN的屬性

    <s:text name=validationrequired value=User Name/>
    使用param子元素這些param將按先後順序代入到國際化字符串的參數中例如

    <s:text name=validationrequired>
       <s:param value=User Name/>
    </s:text>
>讓用戶方便地選擇語言>

  開發國際化的應用程序時有一個功能是必不可少的——讓用戶快捷地選擇或切換語言在Struts 通過ActionContextgetContext()setLocale(Locale arg)可以設置用戶的默認語言不過由於這是一個比較普遍的應用場景(Scenario)所以Struts 為您提供了一個名in的攔截器(Interceptor)並在默認情況下將其注冊到攔截器鏈(Interceptor chain)中它的原理為在執行Action方法前in攔截器查找請求中的一個名為request_locale的參數如果其存在攔截器就將其作為參數實例化Locale對象並將其設為用戶默認的區域(Locale)最後將此Locale對象保存在session的名為WW_TRANS_IN_LOCALE的屬性中

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


http://imgeducitycn/img_///gif align=top twffan=done>package tutorial;
http://imgeducitycn/img_///gif align=top twffan=done>
http://imgeducitycn/img_///gif align=top twffan=done>import javautilHashtable;
http://imgeducitycn/img_///gif align=top twffan=done>import javautilLocale;
http://imgeducitycn/img_///gif align=top twffan=done>import javautilMap;
http://imgeducitycn/img_///gif align=top twffan=done>
___Open_Image onclick=thisstyledisplay=none; Codehighlighter___Open_Textstyledisplay=none; Codehighlighter___Closed_Imagestyledisplay=inline; Codehighlighter___Closed_Textstyledisplay=inline; src=http://imgeducitycn/img_///gif align=top twffan=done>___Closed_Image onclick=thisstyledisplay=none; Codehighlighter___Closed_Textstyledisplay=none; Codehighlighter___Open_Imagestyledisplay=inline; Codehighlighter___Open_Textstyledisplay=inline; src=http://imgeducitycn/img_///gif align=top twffan=done>publicclass Locales http://imgeducitycn/img_///gif twffan=done>{
___Open_Image onclick=thisstyledisplay=none; Codehighlighter___Open_Textstyledisplay=none; Codehighlighter___Closed_Imagestyledisplay=inline; Codehighlighter___Closed_Textstyledisplay=inline; src=http://imgeducitycn/img_///gif align=top twffan=done>___Closed_Image onclick=thisstyledisplay=none; Codehighlighter___Closed_Textstyledisplay=none; Codehighlighter___Open_Imagestyledisplay=inline; Codehighlighter___Open_Textstyledisplay=inline; src=http://imgeducitycn/img_///gif align=top twffan=done>    public Map<String Locale> getLocales() http://imgeducitycn/img_///gif twffan=done>{
http://imgeducitycn/img_///gif align=top twffan=done>        Map<String Locale> locales =new Hashtable<String Locale>();
http://imgeducitycn/img_///gif align=top twffan=done>        localesput(American English LocaleUS);
http://imgeducitycn/img_///gif align=top twffan=done>        localesput(Simplified Chinese LocaleCHINA);
http://imgeducitycn/img_///gif align=top twffan=done>        return locales;
http://imgeducitycn/img_///gif align=top twffan=done>    }
http://imgeducitycn/img_///gif align=top twffan=done>}tutorial/Localesjava


<%@taglib prefix=s uri=/strutstags%>
<script type=text/javascript>
<!
    function langSelecter_onChanged() {
        documentlangFormsubmit();
    }
//>
</script>
<s:set name=SESSION_LOCALE value=#session[WW_TRANS_IN_LOCALE]/>
<s:bean id=locales name=tutorialLocales/>
<form action=<s:url includeParams=get encode=true/> name=langForm 
    >
    Language: <s:select label=Language 
        list=#localeslocales listKey=value    listValue=key
        value=#SESSION_LOCALE == null ? locale : #SESSION_LOCALE
        name=request_locale id=langSelecter 
        onchange=langSelecter_onChanged() theme=simple/>
</form>LangSelectorjsp

  上述代碼的原理為LangSelectorjsp先實例化一個Locales對象並把對象的Map類型的屬性locales賦予下拉列表(select) 如此一來下拉列表就獲得可用語言的列表大家看到LangSelector有<s:form>標志和一段Javascript腳本它們的作用就是在用戶在下拉列表中選擇了後提交包含reqeust_locale變量的表單到Action在打開頁面時為了下拉列表的選中的當前區域我們需要到session取得當前區域(鍵為WW_TRANS_IN_LOCALE的屬性)而該屬性在沒有設置語言前是為空的所以通過值棧中locale屬性來取得當前區域(用戶浏覽器所設置的語言)

你可以把LangSelectorjsp作為一個控件使用方法是在JSP頁面中把它包含進來代碼如下所示
<s:include value=/LangSelectorjsp/>
在例中的HellloWorldjsp中<body>後加入上述代碼並在strutsxml中新建Action代碼如下

<action name=HelloWorld>
    <result>/HelloWorldjsp</result>
</action>
或者如果你多個JSP需要實現上述功能你可以使用下面的通用配置而不是為每一個JSP頁面都新建一個Action

<action name=*>
    <result>/{}jsp</result>
</action>
分布運行程序在浏覽器的地址欄中輸入出現圖所示頁面
<fp HelloWorldaction src=http://imgeducitycn/img_///gif twffan=done>
HelloWorldaction

在下拉列表中選擇American English出現圖所示頁面
<fp HelloWorldaction src=http://imgeducitycn/img_///gif twffan=done>
HelloWorldaction


From:http://tw.wingwit.com/Article/program/Java/ky/201311/28805.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.