Struts的國際化
(一) 軟件的本地化與國際化的概念
本地化:對于已經開發好的軟件,使其支持一種新的語言,稱之為軟件的本地化。我們比較熟悉的是游戲的本地化。
國際化:是指在軟件設計階段,就應該使其具有支持多種語言和地區的功能。當需要在應用中添加對一種新的語言和國家的支持時,不需要對已有的軟件返工,無需更改程序代碼。
I18N簡稱的來歷
(二) Web應用的中文本地化
原因:當數據流的源與目的地使用不同的字符編碼時,就需要對字符編碼進行正確的轉換。
ü 處理HTTP請求數據編碼:
默認情況下,IE瀏覽器發送請求時采用”ISO-8859
一種方法是在處理請求前,設置HttpServletRequest對象的字符編碼:
request.setCharacterEncoding();
還有一種是對用戶輸入的請求數據進行編碼轉換:
date = new String(date.getBytes(“ISO-8859
ü 處理數據庫數據編碼:
如果數據庫系統的字符編碼為”GBK”,那么可以直接存取數據庫中的中文數據,而無需進行編碼轉換。如果數據庫字符編碼為“ISO-8859
String field = rs.getString(“FF”);
String field_cn = newString(field. getBytes(“ISO-8859
ü 處理XML配置文件編碼
如果XML文件中包含中文,可以將XML文件的字符編碼設為”GBK”
ü 處理響應結果的編碼
針對不同的文件類型,設置方式不同:
對于Servlet文件:
response.setContentType(“text/html;charset=GBK”);
對于JSP文件:
<% @ page contentType=” text/html;charset=GBK” %>
對于HTML文件
<META HTTP-EQUIV=”Content-Type” CONTENT=” text/html;charset=GBK”>
(三) Java對I18N的支持
Java在其核心庫中提供了支持I18N的類和接口,下面簡要介紹:
A. Locale類(Java.util.Locale類) |
Locale類的實例代表一種特定的語言和地區,如果Java類庫中的某個類在運行時需要根據Locale對象來調整其功能,那么就稱這個類是本地敏感的。例如:java.text.DateFormat. |
ResourceBundle類 |
提供存放和管理與Locale相關的資源的功能 |
MessgeFormat類 |
|
(四) Struts框架對國際化的支持
當Struts配置文件的<controller>元素的locale屬性為true時,Struts框架把用戶的locale實例保存在session范圍內,這樣框架能自動根據實例選擇合適的資源文件。
(五) 對例子程序Helloapp國際化
對JSP文件的文本、圖片和按鈕進行國際化 |
1. 設置字符編碼 2. 對文本國際化 3. 對按鈕國際化 4. 對圖片國際化 |
創建資源文件 |
創建默認的資源文件:application.properties 根據默認的資源文件,創建臨時中文資源:application_temp.properties 在JDK中提供了native2ascii命令,它能夠實現字符編碼轉換。命令如下: |
使用Servlet過濾器設置請求數據的字符編碼 |
<filter> <filter-name>Set Character Encoding</filter-name> <filter-class>SetCharacterEncodingFilter</filter-class> </filter> <filter-mapping> <filter-name>Set Character Encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
FilterChain chain)throws IOException, ServletException { request.setCharacterEncoding("UTF-8"); // 傳遞控制到下一個過濾器 chain.doFilter(request, response); } |
(六) 小結
對Struts進行國際化應該遵循以下的原則 |
ü 盡量不在Servlet中使用含非英文字符的常量字符串。 ü 對于JSP文件,應該對page指令中的charset屬性進行相應的設置。 ü 不應該在JSP文件中直接包含本地化的消息資源,而應該統一放置到資源文件 ü 不必再每個JSP或Servlet中設置HTTP請求的字符編碼,可以在Servlet過濾器中設置編碼 ü 盡量使用“UTF-8”作為HTTP請求和相應的字符編碼,而不是“GBK”等。 ü 充分考慮底層數據庫所使用的編碼,他可能會給應用程序的移植帶來麻煩。 |
以上整理自孫衛勤《精通Struts》
By HAIING