首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Struts Bean:Message 標籤與國際化資源加載機制深度解析

     編輯:Java 相關知識

Struts 國際化資源文件加載全流程剖析

<bean:message key="welcome.title"/> 是 Struts 開發中極高頻的標籤,其背後涉及資源文件定位、加載、緩存及 Locale 解析等核心機制。本文通過源碼追蹤,完整還原從配置到消息獲取的全鏈路。

資源文件定位與命名規則

在 struts-config.xml 中典型配置:

<message-resources parameter="resources.application"/>

表面看似查找 application.properties,但 PropertyMessageResources 源碼揭示真實邏輯:

String name = config.replace('.', '/');  // resources/application
if (localeKey.length() > 0) {
    name += "_" + localeKey;              // resources/application_zh
}
name += ".properties";                    // 擴展名寫死為 .properties

關鍵發現:

  • .properties 擴展名硬編碼在代碼中,不可變更。
  • 文件名構建遵循:基礎名_Locale.properties 模式。
  • 通過 ClassLoader.getResourceAsStream() 獲取輸入流,再由 Properties.load() 解析到 HashMap 緩存。

編碼陷阱:ISO-8859-1 強制要求

Properties.load() 要求資源文件必須以 ISO-8859-1 編碼保存。若直接編寫中文會導致亂碼(顯示為 ???),解決方案:

  1. 使用 native2ascii 工具轉換為 Unicode 轉義序列(如 \u4e2d\u6587)。
  2. 或確保文件以 ISO-8859-1 編碼保存(需配合轉義)。

Locale 回退查找策略

getMessage() 實現了完整的回退機制:

while (true) {
    loadLocale(localeKey);  // 載入當前 Locale 資源
    message = messages.get(messageKey(localeKey, key));
    if (message != null) return message;
    
    // 回退:去掉最後一個下劃線及後綴(如 _TW -> _zh -> "")
    underscore = localeKey.lastIndexOf("_");
    if (underscore < 0) break;
    localeKey = localeKey.substring(0, underscore);
}
// 最後嘗試默認 Locale
if (!defaultLocale.equals(locale)) { ... }

查找順序:zh_TW → zh → default Locale → 基礎文件名.properties。

用戶 Locale 解析來源

RequestUtils.getUserLocale() 揭示 Locale 獲取優先級:

  1. Session 中綁定的 Globals.LOCALE_KEY(鍵為 "org.apache.struts.action.LOCALE")。
  2. 請求頭 Accept-Language 推導(request.getLocale())。
  3. 服務器默認 Locale。

註:Locale 何時存入 Session 源碼中未直接體現,通常在登錄或 Locale 切換 Action 中手動設置。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved