對於一個面向全球的Web應用程序按著不同國家的要求顯示相關信息(稱為國際化)顯得尤為重要國際化的工作非常復雜和繁瑣因為要翻譯很多Web界面信息格式等然而Struts為我們提供了完成國際化工作的更容易的方式在本文將介紹如何使用Struts來簡化國際化的工作
一處理客戶端界面的編碼問題
由於Web浏覽器可以使用不同的編碼格式來解析客戶端代碼這主要取決於用戶的默認設置或偏好由於存在這種情況因此在服務端向客戶端發送數據時就必須使用和客戶端一致的編碼格式
通常的做法是使用Internet上比較常用的UTF編碼這主要是因為UTF編碼格式所描述的字符包括了世界上所有以知國家和地區的語言編碼這樣服務端就不用根據客戶端的編碼格式不斷地調整服務端響應信息的編碼格式了對於JSP頁面來說可以使用page指定來設置響應信息的編碼格式如下面代碼所示
<%@ page contentType=text/html; charset=UTF %>
當然如果我們在Web程序中使用了Struts框架還可以在strutsconfigxml文件中使用如下的代碼來設置編碼格式
<controller contentType=text/html; charset=UTF />
如果使用上面的設置所有通過do或<forward>元素訪問的頁面都會繼承這一編碼設置但是如果單獨訪問JSP頁面就會繞過Struts的這個設置
對於靜態頁面(如HTML)來說需要使用<meta>元素來設置編碼格式如下面代碼所示
<head>
<meta httpequiv=contenttype content=text/html; charset=UTF>
</head>
除了使用通用的UTF編碼格式外也可以從HTTP請求頭字段Accept Charset中獲得客戶端的編碼格式然後根據這個編碼格式來設置響應信息的編碼格式然而雖然根據HTML規范Web浏覽器可以設置 AcceptCharset字段但是有很多浏覽器可以會忽略這一字段因此只使用這個字段來確定Web浏覽器所使用的編碼格式是不可靠的所以最好的國際化編碼格式解決方案仍然是UTF
二本地化屬性文件
本地化最重要的部分就是根據用戶所處的語言環境來顯示響應語言的界面如用戶在英文操作系統下就會顯示英文界面如果在中文操作系統下就會顯示中文界面最理想的情況是這種顯示效果的切換是完全透明的
在Struts中提供了這種技術使我們可以更容易地實現透明地界面切換在Struts Bean標簽庫中有一個<beanmessage>標簽它可以根據客戶端浏覽器所處的語言環境自動選擇相應的屬性文件來讀取界面顯示信息為了演示如何使用<beanmessage>以及不同的屬性文件來實現國際化的程序讓我們先來看一個例子
在本例中選用了三個國家的語言環境(中文英文和法文)來演示國際化的實現由於讀者可能不便於輸入法文因此法文信息仍然用中文代替只是後面多了個(法文)作為標識我們需要如下四步來完成這個例子
【第步】建立一個默認的屬性文件
在<samples工程目錄>\src\struts目錄中建立一個applicationproperties文件內容如下
title = 這是一個國際化的web程序(默認值)
name = 姓名(默認值)
submit = 提交(默認值)
applicationproperties文件是默認的屬性文件如果客戶端浏覽器所處的語言環境在服務端未找到相應的屬性文件<beanmessage>標簽就會從applicationproperties文件中讀取字符串信息
在Eclipse中編輯非ISO 編碼格式的字符時應使用在《屬性(資源)文件亂碼問題的解決之道》介紹的兩個Eclipse插件或使用nativeasciiexe命令進行轉換否則在顯示屬性文件中的信息時會出現亂碼
【第步】在strutsconfigxml文件中配置屬性文件
在Struts中所有的屬性文件都必須在strutsconfigxml文件中配置否則<beanmessage>標簽就會由於無法找到相應的屬性文件而拋出異常
為了配置applicationproperties需要在strutsconfigxml文件中的<strutsconfig>標簽中加入如下的代碼
<messageresources parameter=strutsapplication key = global/>
由於在strutsconfigxml文件中已經有一個ErrorDescriptionproperties作為默認的屬性文件因此applicationproperties文件要使用一個key加以標識在使用<beanmessage>標簽時必須要使用bundle屬性指定這個key才能找到applicationproperties文件
【第步】加入不同語言的屬性文件
在這一步我們來加入中文英文法文的屬性文件這三個屬性文件的文件名如下
中文application_zhproperties
英文application_enproperties
法文application_frproperties
將這三個文件放到<samples工程目錄>\src\struts目錄中它們的內容如下
application_zhproperties
title = 這是一個國際化的web程序
name = 姓名
submit = 提交
application_enproperties
title = This is an internationalization web program
name = name
submit = submit
application_frproperties
title = 這是一個國際化的web程序(法語)
name = 姓名(法語)
submit = 提交(法語)
這三個屬性文件是不需要在strutsconfigxml中配置的Struts會自動根據客戶端浏覽器所處的語言環境來尋找這三個文件
【第步】編寫JSP頁面
在這個JSP頁面中使用了<beanmessage>來根據客戶端浏覽器所處的語言環境來讀取相應的屬性文件中的內容在web根目錄中建立一個globaljsp文件代碼如下
<%@ page pageEncoding=UTF %>
<%@ taglib uri=bean prefix=bean%>
<html>
<head>
<title>國際化</title>
</head>
<body>
<bean:message key=title bundle=global /><p/>
<form action=>
<bean:message key=name bundle=global />
<input type=text name=name /><p/>
<input type=submit value=<bean:message key=submit bundle=global/> />
</form>
</body>
</html>
由於安裝不同語言的操作系統很不方便在這裡我們采用另一種方法來模擬不同的語言環境測試這個程序首先在IE中使用「工具」>「Internet 選項」> 「常規」>「語言」來打開語言首選項對話框使用添加按鈕添加中文 [zh]英文 [en]和法語(法國) [fr]再添加一種其他語言如梵文 [sa]添加後的界面如下圖所示
然後分別將這四種語言上移到列表頂端然後點擊確定按鈕保存設置在啟動Tomcat後在IE中輸入如下的URL
根據語言設置的不同在IE中會顯示不同語言的界面如中文和英文的頁面分別如下面兩個圖所示
如果在刷新時頁面語言未更新可能是因為IE的Cache的原因讀者可以啟一個新的IE窗口再進行測試
讀者在使用屬性文件進行國際化時應注意如下三點
由於語言還可以繼續細分如中文可以分為簡體和繁體英文也可以分為不同國家或地區的英文如愛爾蘭澳大利亞等因此對於更細化的語言可以在屬性文件後面再加一個代表國家或地區的後綴如application_zh_TWproperties代表中國台灣所使用的繁體中文application_en_AUproperties代表澳大利亞英文Struts在尋找屬性文件時會首先查找帶有國家或地區後綴的屬性文件如果這類文件不存在會繼續查找只有語言後綴的屬性文件如果還不存在最後會讀取默認屬性文件也就是applicationproperties的內容假設我們在語言首選項中選擇了中文(台灣) [zhtw]那麼讀取文件的順序(從最左邊開始如果文件不存在依次讀取右邊的文件)如下
application_zh_TWproperties > application_zhproperties > applicationproperties
如果選擇的語言是中文 [zh]那麼就直接從application_zhproperties開始讀取
在建立屬性文件時要注意後綴的連接符為下劃線( _ )而不能用減號( )
代表語言的後綴(如zhfren等)必須小寫而代表國家或地區的後綴(如CNTWAU等)必須大寫如寫成application_ZH_twproperties是不正確的
在Struts HTML標簽庫中的標簽中以key為後綴的屬性值就是屬性文件中的key如下面的代碼所示
<html:submit value=提交 titleKey=title bundle=global/>
上面的代碼將<htmlsubmit>標簽的title屬性值設為屬性文件的title鍵的值但是在<htmlsubmit>標簽中的value屬性無法使用屬性文件中的鍵值解決的方法是使用< htmlsubmit>標簽的另一種寫法代碼如下
<html:submit>
<bean:message key = title bundle = global />
</html:submit>
三實現多種語言界面的Web程序
在上面所講的國際化只是根據客戶端浏覽器所處的語言環境來自動設置界面語言而我們在Internet上會看到很多Web程序在主界面上都提供了對不同語言的選擇在本節我們就來講一下如何通過編程的方式來干預服務端對屬性文件的選擇
實現上Java使用javautilLocate類來描述語言一個Locate類的對象實例就代表一種語言並且從客戶端獲得的語言信息使用orgapachestrutsactionLOCALE保存在了session中因此我們只要在調用<beanmessage>或其他使用屬性文件的語句之前修改session中保存的Locale對象就可以達到我們的目的現在我們來對globaljsp頁面進行修改(新建一個文件newGlobaljsp)globaljsp中所有的代碼都不用動只需要在第一個<beanmessage>標簽的前面加上如下的代碼
<%
if(enequals(requestgetParameter(language)))
sessionsetAttribute(orgapachestrutsactionLOCALE new javautilLocale(en));
else if(zhequals(requestgetParameter(language)))
sessionsetAttribute(orgapachestrutsactionLOCALE new javautilLocale(zh));
else if(frequals(requestgetParameter(language)))
sessionsetAttribute(orgapachestrutsactionLOCALE new javautilLocale(fr));
%>
<bean:message key=title bundle=global />
在Web根目錄中建立一個mainGlobaljsp文件如下面的代碼所示
<%@ page pageEncoding=UTF%>
<html>
<head>
<title>多語言支持</title>
</head>
<body>
<a target=_blank>英文</a><p/>
<a target=_blank>中文</a><p/>
<a target=_blank>法文</a>
</body>
</html>
啟動Tomcat後在IE中輸入如下的URL
點擊mainGlobaljsp頁面上的三個鏈接就會分別顯示三種語言的頁面
在Struts Action類中的也可以使用Action類提供的setLocale方法來設置語言如在execute方法中設置語言的代碼如下
setLocale(request new javautilLocale(zh TW));
使用setLocale方法設置語言時應注意兩點
javautilLocale的構造方法的第一個參數表示語言第二個參數表示國家或地區這兩個參數值和屬性文件的後綴不同它不區分大小寫因此也可以寫成如下的形式
setLocale(request new javautilLocale(ZH tw));
所有經過<forward>元素或do的程序都會繼承setLocale方法設置後的語言但<action>元素的forward和input屬性所指的頁面除外
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28202.html