通過實例學習Struts2 - 從struts-blank開始 (3)

最近發現一些網站在Copy&Paste我的文章, 請尊重我的勞動成果,在轉載的時候註明出處,謝謝。


接上一篇《通過實例學習Struts2 - 從struts-blank開始  (2)

國際化

國際化通俗點講就是支持多語言,在Struts2中我們要解決幾個問題

1. 如何告訴Struts2 當前的Locale 是什麼

2. Struts2是如何尋找不同Locale的resource文件的

3. 如何使用Resource文件

設置Locale

在我們的struts-blank項目中,HelloWorld.jsp中有這樣的代碼:

<h3>Languages</h3>
<ul>
    <li>
        <s:url id="url" action="HelloWorld">
            <s:param name="request_locale">en</s:param>
        </s:url>
        <s:a href="%{url}">English</s:a>
    </li>
    <li>
        <s:url id="url" action="HelloWorld">
            <s:param name="request_locale">es</s:param>
        </s:url>
        <s:a href="%{url}">Espanol</s:a>
    </li>
</ul>
仔細讀一下就會明白, 這段代碼是通過 <s:url > 來定義了兩個url ,帶的參數分別是 request_locale=en , 和request_locale=es

然後使用<s: a href=... > 來創建鏈接,生成的最終html會是這樣:

<h3>Languages</h3>
<ul>
    <li>
        <a href="/struts2-blank/example/HelloWorld.action;jsessionid=2F2C1A03C75BDF7893E7450998FBC3FB?request_locale=en">English</a>
    </li>
    <li>
        <a href="/struts2-blank/example/HelloWorld.action;jsessionid=2F2C1A03C75BDF7893E7450998FBC3FB?request_locale=es">Espanol</a>
    </li>
</ul>
分別對應en(英語) 和es(西班牙語? )

點擊這兩個link,系統的語言就會切換, 實際上我們看到唯一傳遞給struts2的參數就是request_locale , 沒錯,就是這個參數告訴了Struts2用什麼樣的locale !

那麼Struts2在背後究竟幹了什麼事呢? 這需要了解一些Struts2架構, Struts2內置了很多攔截器,這些攔截器會在你的Action運行之前調用,其中有個攔截器叫做i18n, 它會檢查http request 有沒有名稱爲request_locale的參數,如果有, 轉換爲Locale對象, 設置爲用戶默認的Locale , 並且會把這個Locale保存在用戶Session中,名爲WW_TRANS_I18N_LOCALE。

所以只要你調用了一次request_locale=xxxx,  在session失效之前,locale就會保持不變。

當然,如果你想用java代碼的方式來指定 Locale也是可以的:

ActionContext.getContext().setLocale(Locale locale)

查找Resource 文件

解決了如何設置Locale的問題, 我們再研究一下Struts2是如何查找Resource文件的。

如果讓我們自己寫的話,在java中最常用的就是ResourceBoundle , 通過它可以指定一個baseName,以及ClassLoader 來裝載指定目錄下的resource 文件,有興趣的同學科參見我的另一篇文章《深入ResourceBundle》。

在我們的struts-blank項目中,有兩個文件叫package.properties 和package_es.properties,這兩個resource 文件和其他的Action類放在同一個java package 下

可以這麼猜測,同一個java package 下的所有Action類,都會用package_xx_xx..properties 作爲resource 文件。

我們在後邊的例子中還會看到諸如這樣的Resource 文件: <ActionName>_zh_CN.properties, 很明顯這是爲特定的Action所設置的

但實際情況中, 估計大多少項目都會把resource 文件同意放到一起,Struts2 稱之爲全局配置文件,可以這麼指定:

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

這三種方式是有優先級的: Action級> Package級 > 全局配置

實際上Struts2 支持更爲複雜的搜索方式,這裏就不展開了,感興趣的同學可以看看Struts2 的教程

我不太理解爲什麼Struts2會有如此複雜的方式來定位Resource 文件, 在我這些年的工作經驗中,resource文件總是統一放在一個指定的目錄下,方便集中管理,也方便一次性的把所有的英文的Resource 文件發出去翻譯。

不太清楚如果Resource如果是分散在各個package下面會有什麼好處, 有經驗的同學請不吝賜教

如何使用Resource文件

主要用兩種方式:

(1) 在jsp 中: <s:text name="key"/>

(2) 在Java 中: 使用ActionSupport類的getText(.....)方法

注意在這兩種方法中我們都沒有指定Locale, 因爲Struts通過request_loacle參數已經知道了。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章