萬維網World Wide Web的迅猛發展推動了跨國業務的發展,為了使企業的Web應用能支持全球客戶,軟件開發應用發出了支持多國語言,國際化的Web應用.國際化簡稱I18N指的是在軟件設計階段,就應該使軟件具有支持多種語言和地區的功能.這樣當需要在應用中添加對一種新的語言和國家的支持的時候,不需要對自己的軟件返工,無需修改應用的程序代碼.簡單的說,本地化意味著針對不同的語言的客戶,發出不同的軟件版本.國際化意味著同一個軟件可以面向使用不同語言的客戶.如果一個應用支持國際化,應該具備以下特征:
1)???? 當應用需要支持一種新的語言時,無需修改應用源代碼.
2)???? 文本,消息和圖片從源程序代碼中抽取出來,存儲在外部.
3)???? 應該根據用戶語言和地理位置,對于特定文化和相關的數據,如日期,時間,貨幣進行格式轉換.
4)???? 支持非標準字符集.
5)???? 可以方便快捷的對應用做出調整,使它適應新的語言和地區.
Web應用使用本地化或者國際化都會涉及字符編碼轉換的問題,默認的情況下IE瀏覽
器發送請求的時候采用ISO-8859-1字符編碼,如果Web應用程序要正確的讀取用戶發送的中文數據,則需要進行編碼轉換.一種方式是在處理請求前,先設置HttpServletRequest對象的字符編碼,如下:
request.setCharacterEncoding(“gb2312”);
還有一種方法是對用戶輸入的請求數據進行編碼轉換如下:
String data=request.getParameter(“data”);
? If(data!=null)
Data=new String(data.getBytes(“ISO-8859-1”),”GB2312”);
如果數據庫系統的字符編碼是GB2312,那么可以直接讀取數據庫的中文數據,如果數據庫的字符集是ISO-8859-1那么必須先對來自數據庫的數據進行編碼轉換,然后才能使用.如果在XML文件中包含中文,可以將XML文件的字符編碼設置為GB2312,例如:
還可以設置相應對象的字符編碼.例如:
?Servlet:response.setContentType(“text/html;charset=GB2312”);
?JSP:<%@page contentType=”text/html;charset=GB2312”%>
?HTML:
JAVA在其核心庫中提供了支持I18N的類和接口,java.util.Locale類是重要的JAVA的支持I18N的類,在JAVA語言中幾乎所有對國際化和本地化的支持都依賴與這個類.關于這個類的詳細介紹應參閱JAVA語言的API.ResourceBundle類也是在java.util包中,這個類提供和存放了管理與Locale相關的資源的功能,這些資源包括文本或者按鈕的,狀態信息圖片名,錯誤信息,網頁標題等.Struts框架并沒有直接使用JAVA語言提供的ResourceBundle類,在Struts框架中提供了兩個類,他們都在org.apache.struts.util包中.這兩個類具有ResourceBundle相似的功能,分別是MessageResources和PropertyMessageResources類.
說了半天自己感覺我闡述的很亂,因為都是一些需要了解的知識所以我大略說了一下,下面我詳細的介紹一下Struts框架對國際化的支持.主要是體現在能夠輸出和用戶Locale相符合的文本和圖片上.當Struts配置文件的
1)???? 一個Struts應用可以有多個子應用模塊,必須有一個默認的子應用模塊.只能一個.
2)???? 一個子應用模塊可以有多個ResourceBundle,必須有一個默認的Bundle,只能一個.
3)???? 一個ResourceBundle可以有多個資源文件,必須有一個默認的文件,只能有一個.
在Action類中定義了getResources(request)方法,可以返回默認的MessageResources
對象,代表當前應用模塊使用默認的ResourceBundle.如果要獲得特定的MessageResources對象可以調用Action基類的getResources(request.key)方法,其中參數key和Struts配置文件中的
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)???? 根據參數指定的Locale檢查對應的資源文件,然后返回參數的key對應的消息文本getMessage(java.util.Locale locale,String key)
2)???? 根據參數指定的Locale檢查對應的資源文件,然后返回參數和key對應的文本args參數用于替換符合消息文本的參數:
getMessage(java.util.Locale locale,String key,Object[] args)
使用ResourceBundle綁定的Struts組件例如:
1)???? ActionMessage類和
2)???? StringBean標簽庫和
3)???? 在Validator驗證框架中訪問ResourceBundle.
4)???? 在聲明類型異常處理中訪問ResourceBundle.
國際化應用的問題感覺理解上不是很容易,可以查閱相關的資料百度和Google可是中