萬維網(wǎng)World Wide Web的迅猛發(fā)展推動了跨國業(yè)務(wù)的發(fā)展,為了使企業(yè)的Web應(yīng)用能支持全球客戶,軟件開發(fā)應(yīng)用發(fā)出了支持多國語言,國際化的Web應(yīng)用.國際化簡稱I18N指的是在軟件設(shè)計階段,就應(yīng)該使軟件具有支持多種語言和地區(qū)的功能.這樣當需要在應(yīng)用中添加對一種新的語言和國家的支持的時候,不需要對自己的軟件返工,無需修改應(yīng)用的程序代碼.簡單的說,本地化意味著針對不同的語言的客戶,發(fā)出不同的軟件版本.國際化意味著同一個軟件可以面向使用不同語言的客戶.如果一個應(yīng)用支持國際化,應(yīng)該具備以下特征:
1)???? 當應(yīng)用需要支持一種新的語言時,無需修改應(yīng)用源代碼.
2)???? 文本,消息和圖片從源程序代碼中抽取出來,存儲在外部.
3)???? 應(yīng)該根據(jù)用戶語言和地理位置,對于特定文化和相關(guān)的數(shù)據(jù),如日期,時間,貨幣進行格式轉(zhuǎn)換.
4)???? 支持非標準字符集.
5)???? 可以方便快捷的對應(yīng)用做出調(diào)整,使它適應(yīng)新的語言和地區(qū).
Web應(yīng)用使用本地化或者國際化都會涉及字符編碼轉(zhuǎn)換的問題,默認的情況下IE瀏覽
器發(fā)送請求的時候采用ISO-8859-1字符編碼,如果Web應(yīng)用程序要正確的讀取用戶發(fā)送的中文數(shù)據(jù),則需要進行編碼轉(zhuǎn)換.一種方式是在處理請求前,先設(shè)置HttpServletRequest對象的字符編碼,如下:
request.setCharacterEncoding(“gb2312”);
還有一種方法是對用戶輸入的請求數(shù)據(jù)進行編碼轉(zhuǎn)換如下:
String data=request.getParameter(“data”);
? If(data!=null)
Data=new String(data.getBytes(“ISO-8859-1”),”GB2312”);
如果數(shù)據(jù)庫系統(tǒng)的字符編碼是GB2312,那么可以直接讀取數(shù)據(jù)庫的中文數(shù)據(jù),如果數(shù)據(jù)庫的字符集是ISO-8859-1那么必須先對來自數(shù)據(jù)庫的數(shù)據(jù)進行編碼轉(zhuǎn)換,然后才能使用.如果在XML文件中包含中文,可以將XML文件的字符編碼設(shè)置為GB2312,例如:
還可以設(shè)置相應(yīng)對象的字符編碼.例如:
?Servlet:response.setContentType(“text/html;charset=GB2312”);
?JSP:<%@page contentType=”text/html;charset=GB2312”%>
?HTML:
JAVA在其核心庫中提供了支持I18N的類和接口,java.util.Locale類是重要的JAVA的支持I18N的類,在JAVA語言中幾乎所有對國際化和本地化的支持都依賴與這個類.關(guān)于這個類的詳細介紹應(yīng)參閱JAVA語言的API.ResourceBundle類也是在java.util包中,這個類提供和存放了管理與Locale相關(guān)的資源的功能,這些資源包括文本或者按鈕的,狀態(tài)信息圖片名,錯誤信息,網(wǎng)頁標題等.Struts框架并沒有直接使用JAVA語言提供的ResourceBundle類,在Struts框架中提供了兩個類,他們都在org.apache.struts.util包中.這兩個類具有ResourceBundle相似的功能,分別是MessageResources和PropertyMessageResources類.
說了半天自己感覺我闡述的很亂,因為都是一些需要了解的知識所以我大略說了一下,下面我詳細的介紹一下Struts框架對國際化的支持.主要是體現(xiàn)在能夠輸出和用戶Locale相符合的文本和圖片上.當Struts配置文件的元素的locale屬性為truts的時候,Struts框架把用戶的Locale實例保存在Session范圍內(nèi),這樣Struts礦局愛能夠根據(jù)這個實例來從ResourceBundle中選擇合適的資源文本.最簡單的說就是用戶如果是cn就去cn的本地資源文件中讀取信息,如果是ch就去ch的本地資源文本文件中讀取數(shù)據(jù).首先要創(chuàng)建Struts的ResourceBundle,對于多個應(yīng)用模塊的Struts應(yīng)用,可以為每一個子應(yīng)用配置一個或者多個ResourceBundle應(yīng)用中的每一個模塊都可以訪問這些Bundle,配置文件中每個元素定義了一個ResourceBundle,當應(yīng)用包含多個的時候,用Key屬性來區(qū)別它們.這只好的.properties文件一般放在Web應(yīng)用的classes目錄下,其實配置沒什么就是按照固定的套路,重點要研討的應(yīng)該是如何訪問ResourceBundle.Struts應(yīng)用,子應(yīng)用模塊,ResourceBundle和資源文件之間存在以下的關(guān)系:
1)???? 一個Struts應(yīng)用可以有多個子應(yīng)用模塊,必須有一個默認的子應(yīng)用模塊.只能一個.
2)???? 一個子應(yīng)用模塊可以有多個ResourceBundle,必須有一個默認的Bundle,只能一個.
3)???? 一個ResourceBundle可以有多個資源文件,必須有一個默認的文件,只能有一個.
在Action類中定義了getResources(request)方法,可以返回默認的MessageResources
對象,代表當前應(yīng)用模塊使用默認的ResourceBundle.如果要獲得特定的MessageResources對象可以調(diào)用Action基類的getResources(request.key)方法,其中參數(shù)key和Struts配置文件中的元素的key屬性對應(yīng).得到MessageResources對象后,可以通過方法來訪問消息文本.例如:
public ActionForward execute(ActionMapping mapping,
???????????????????????????? ActionForm form,
???????????????????????????? HttpServletRequest request,
???????????????????????????? HttpServletResponse response)
throws Exception{
Locale locale = getLocale(request);
MessageResources messages = getResources(request);
String msg = messages.getMessage(locale,”hello.error”);
……
}
org.apache.struts.util.MessageResources的getMessage()方法有好幾種重載的形式,下面列出常用的幾種:
1)???? 根據(jù)參數(shù)指定的Locale檢查對應(yīng)的資源文件,然后返回參數(shù)的key對應(yīng)的消息文本getMessage(java.util.Locale locale,String key)
2)???? 根據(jù)參數(shù)指定的Locale檢查對應(yīng)的資源文件,然后返回參數(shù)和key對應(yīng)的文本args參數(shù)用于替換符合消息文本的參數(shù):
getMessage(java.util.Locale locale,String key,Object[] args)
使用ResourceBundle綁定的Struts組件例如:
1)???? ActionMessage類和標簽.
2)???? StringBean標簽庫和標簽.
3)???? 在Validator驗證框架中訪問ResourceBundle.
4)???? 在聲明類型異常處理中訪問ResourceBundle.
國際化應(yīng)用的問題感覺理解上不是很容易,可以查閱相關(guān)的資料百度和Google可是中
國和世界的大寶箱哦. (網(wǎng)友們的支持,是我繼續(xù)寫技術(shù)文章的動力!)
posted on 2005-10-28 16:23
我心依舊 閱讀(2050)
評論(1) 編輯 收藏