Struts2教學
Struts2快速入門
Struts2 MVC架構
Struts2 是什麼?
Struts2 環境配置
Struts2 體系結構
Struts2 Hello World 實例
Struts2 配置文件
Struts2 Action/動作
Struts2 攔截器
Struts2 結果和結果類型
Struts2 值棧/OGNL
Struts2 文件上傳
Struts2 MySQL數據庫訪問
Struts2 發送郵件Email
Struts2 驗證框架
Struts2 基於XML校驗
Struts2 本地化/國際化(i18n)
Struts2 類型轉換
Struts2 主題和模板
Struts2 異常處理
Struts2 註釋
Struts2 註釋類型
Struts2 控件標籤
Struts2 iterator標籤
Struts2 if/else標籤
Struts2 merge標籤
Struts2 append標籤
Struts2 generator標籤
Struts2 數據標籤
Struts2 action標籤
Struts2 include標籤
Struts2 bean 標籤
Struts2 date 標籤
Struts2 param 標籤
Struts2 property 標籤
Struts2 set 標籤
Struts2 text 標籤
Struts2 url標籤
Struts2 表單標籤
Struts2 Ajax 標籤
Struts2和Spring集成
Struts2和Tiles集成
Struts2和Hibernate集成
Struts 2 hello world (XML版本)
Struts2註解示例
Struts2 @ResultPath註釋示例
Struts2 include(包含)多個配置文件
Struts2命名空間配置和解釋
Struts2開發者模式
如何刪除Struts2動作的後綴擴展名
使用Struts2動作
Struts2的ActionError&ActionMessage示例
Struts2模型驅動實例
Struts2映射攔截動作
Struts2重寫攔截器參數
Struts2攔截器棧的例子
Struts2 execAndWait攔截器例子
Struts2 <s:textfield>文本示例
Struts2 <s:password>密碼示例
Struts2 <s:hidden>隱藏值例子
Struts2 <s:textarea>文本域實例
Struts2 <s:radio>單選按鈕例子
Struts2單選預選按鈕值
Struts2 <s:checkbox>複選框例子
Struts2設置多個複選框缺省值
Struts2 <s:checkboxlist>多個複選框例子
Struts2 <s:select>下拉框例子
Struts2自動選擇下拉框的值
Struts2 <s:combobox>組合框的例子
Struts2 <s:head>示例
Struts2文件上傳例子
Struts2上傳多個文件例子
Struts2 <s:doubleselect>示例
Struts2 <s:updownselect>示例
Struts2 <s:optiontransferselect>示例
Struts2 <sx:datetimepicker>示例
Struts2 <sx:autocompleter>自動提示例子
Struts2 autocompleter+JSON例子
Struts2 <s:iterator>迭代器標籤示例
Struts2 if,elseif,else標籤示例
struts2 <s:append>標籤示例
Struts2 <s:generator>標籤示例
Struts2 <s:merge>標籤示例
Struts2 <s:sort>標籤示例
Struts2 <s:subset>標籤示例
Struts2 <s:a>標籤示例
Struts2 <s:action>標籤示例
Struts2 <s:bean>標籤示例
Struts2 <s:date>標籤示例
Struts2 <s:debug>標籤示例
Struts2 <s:include>標籤示例
Struts2 <s:i18n>標籤示例
Struts2 <s:param>標籤示例
Struts2 <s:property>標籤實例
Struts2 <s:push>標籤示例
Struts2 <s:set>標籤示例
Struts2 <s:texttag>標籤示例
Struts2 <s:url>標籤示例
Struts2資源包使用示例
Struts2本地化和國際化
Struts2 key鍵屬性示例
Struts2中文本地化問題
如何配置Struts2全局資源包
Struts2+Spring集成實例
Struts2+Quartz2調度集成實例
Struts2+Hibernate使用Full Hibernate Plugin集成
Struts2+Hibernate集成實例
Struts2+Spring+Hibernate集成實例
Struts2+Log4j集成
Struts2的FilterDispatcher和StrutsPrepareAndExecuteFilter有什麼不同?
Struts2獲取HttpServletRequest實例
Struts2獲取HttpServletResponse實例
如何獲取ServletContext對象
Struts2配置Action類的靜態參數
Struts2下載文件實例
Struts2和JSON實例

Struts2中文本地化問題

一個 Struts2 的國際化定位的問題,用來顯示中國漢字...

案例1:屬性有特殊字符的文件


屬性文件存儲用戶名,密碼信息,並以中文字符提交。此屬性文件以UTF-8格式創建的,但內容不使用 native2ascii 編碼。

Struts2中文本地化問題

讓我們試着通過一些UI標籤,來顯示中國漢字。查看頁面聲明爲UTF-8格式的HTML元標記來顯示。

...

...
<div>Testing 1 : <s:property value="getText('global.username')" /></div>
<div>Testing 2 : <s:text name="global.password" /></div></br/>


...
<s:url id="localezhCN" namespace="/" action="locale" >
<s:param name="request_locale" >zh_CN

...
<s:a href="%{localezhCN}" >Chinese
...

結果
Struts2中文本地化問題

令人驚奇的是,以下三個UI標籤都能夠正確地顯示中國消息

<s:textfield key="global.username" name="username"/>
<s:password key="global.password" name="password"/>
Testing 2 : <s:text name="global.password" />

然而,「s:submit」 和 「getText()」 卻無法顯示呢?

據Java的國際化文檔,要使用資源包正確顯示特殊字符,則必須用 native2ascii 工具進行處理。

深入到 TextProvider.getText()的源代碼後,它使用的資源 bundle.getString()來從資源包檢索的消息,所以不正確的消息是合理的。但是,爲什麼「s:text「, 「s:textfield」 和 「s:password」 能夠正確顯示了中文的消息,爲什麼「s:submit」會失敗?在有太多的問題,讓我們看看示例2...

案例2:有特殊字符的屬性文件(編碼)


這一次,屬性文件使用native2ascii工具處理中國漢字的編碼正確。

Struts2中文本地化問題

結果如下所示:

Struts2中文本地化問題

其結果是完全逆轉,現在 「s:submit」 和 「getText()」 是能夠正確地顯示它,但其他UI組件失敗。 這裏是按預期方式工作的,因爲在Struts 2推薦使用getText(),以顯示國際化或本地化的消息。問題是,爲什麼「s:submit」會不同呢?

Struts2..哪裏有問題?

這裏有幾個問題:

  1. 爲什麼 s:submit 有如此不同的效果?

  2. 對國際化應該是非常簡單的,爲什麼在Struts 2有這種問題? 或者我們誤解了Struts2 國際化如何工作了?

  3. 爲什麼有這麼多的方式來顯示來自資源包的消息?爲什麼不直接組織成一個方法? 在Struts1,只需使用「bean:message」,爲什麼Struts 2中它看起來很複雜?

  4. Struts2的支持XML資源包? 我們可能不太喜歡用native2ascii工具對數據進行編碼爲UTF-8格式,它使屬性文件不可讀。 Apache Wicket的在這個問題做了很好的工作,可能是在Struts 2中吸取教訓。

  5. 那麼,如何正確地在 Struts2 中顯示中國漢字?

許多文章和教程使用以下方法來顯示資源包的消息:

<s:text name="global.username"/>
<s:property value="getText('global.username')"/> 

然而,這僅適用於英國或一些「英語狀(歐洲)」 的字符,如法文,德文。但對中文或日文,這兩種方法將返回完全不同的輸出。真的不知道Struts2的本地化該怎麼辦了。

解決辦法

問題是在HTML meta標籤,

在Struts1,上述meta標籤必須正確顯示UTF-8的數據,但這在 Struts2 是有問題的。

在Struts2,meta標籤不起作用,我們應該把 <%@ page contentType=」text/html;charset=UTF-8″ %>標籤放在頁面的第一行。例如下面的代碼片斷:

<%@ page contentType="text/html;charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>

...

結果顯示如下:

Struts2中文本地化問題

所有的中文消息正確顯示。

回答之前的問題


  1. 爲什麼 s:submit 有如此不同的效果?

    A: 暫無評論

  2. 對國際化應該是非常簡單的,爲什麼在Struts 2有這種問題? 或者我們誤解了Struts2 國際化如何工作了?

    **A: **

    確保把

    ** <%@ page contentType=」text/html;charset=UTF-8″ %>**」 放在頁面的第一行。

  3. 爲什麼有這麼多的方式來顯示來自資源包的消息?爲什麼不直接組織成一個方法? 在Struts1,只需使用「bean:message」,爲什麼Struts 2中它看起來很複雜?

    **A: s:text, key, getText(), name… , **

    所有的都能夠正確地顯示中文或UTF-8編碼的數據,****

    只要確保把正確的「字符集」放在視圖頁面中。



  4. Struts2的支持XML資源包? 我們可能不太喜歡用native2ascii工具對數據進行編碼爲UTF-8格式,它使屬性文件不可讀。 Apache Wicket的在這個問題做了很好的工作,可能是在Struts 2中吸取教訓。

    **A:**希望在Struts2的下一版本可以支持在XML資源包。

  5. 那麼,如何正確地在 Struts2 中顯示中國漢字?

    A: 看看上頁的解決辦法

參考

  1. http://www.yiibai.com/java/java-convert-chinese-character-to-unicode-with-native2ascii.html
  2. http://forums.sun.com/thread.jspa?threadID=5185040
  3. http://www.coderanch.com/t/452139/Struts/applicationresources-properties-utf-characters#2013557
  4. http://struts.apache.org/2.1.8/docs/localization.html
  5. http://hxzon00.blog.163.com/blog/static/10489241620088121449163/

下載代碼( globalresource ) –  http://pan.baidu.com/s/1mgzt3dQ