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

Struts 2 學習筆記(七):類型轉換完全指南——StrutsTypeConverter、OGNL 內建轉換、集合泛型、錯誤處理與國際化

     編輯:Java 相關知識

全面解析 Struts 2 類型轉換機制:從自定義轉換器繼承體系、OGNL 表達式隱式轉換、集合泛型支援、內建轉換器清單,到錯誤處理攔截器與國際化訊息定制。

自定義類型轉換器:兩代繼承體系

第一代:DefaultTypeConverter

實作 convertValue(Map context, Object value, Class toType),雙向邏輯寫在同一方法。value 為字串陣列(request.getParameterValues())。

第二代:StrutsTypeConverter(推薦)

抽象子類別,實作兩個方法:

  • convertFromString(Map context, String[] values, Class toClass):請求 → 物件
  • convertToString(Map context, Object o):物件 → 字串

關鍵點:convertFromString 第二參數為字串陣列,可處理請求陣列(如 ?u=1&u=2&u=3),Action 對應屬性為陣列或 List。返回類型依 toClass 判斷(陣列或 List)。

OGNL 隱式轉換:免寫轉換器

Action 有屬性 User user,JSP 輸入框命名 user.name、user.pass:

<s:textfield name="user.name" label="用戶名"/>
<s:textfield name="user.pass" label="密碼"/>

提交後 Struts 2 自動:new User() → setName()/setPass() → setUser(user)。三個必要條件:

  1. User 有預設建構子
  2. User 有對應 setter
  3. Action 有 setUser()(getUser() 亦需)

集合屬性的隱式轉換

Map<String, User> users

<s:textfield name="users['one'].name" label="第一個用戶名"/>
<s:textfield name="users['one'].pass" label="第一個密碼"/>
<s:textfield name="users['two'].name" label="第二個用戶名"/>
<s:textfield name="users['two'].pass" label="第二個密碼"/>

List<User> users

<s:textfield name="users[0].name" label="第一個用戶名"/>
<s:textfield name="users[0].pass" label="第一個密碼"/>
<s:textfield name="users[1].name" label="第二個用戶名"/>
<s:textfield name="users[1].pass" label="第二個密碼"/>

屬性設定時的 get 機制與邊界情況

  • 每次設值前先 getXxx():null 則構造新實例(Map/List/User);已有實例則保留其他屬性值
  • List 索引跳空(如只提交 users[1])會導致 users[0]=null
  • List 不能替換為陣列 User[](陣列不支援動態擴展)

無泛型環境下的類型指定(JDK 1.4)

無泛型時 Action 僅宣告 Map users 或 List users,需在 ActionName-conversion.properties 指定:

# List 元素類型
Element_users=com.unmi.vo.User

# Map Key/Value 類型
Key_users=java.lang.String
Element_users=com.unmi.vo.User

Struts 2 要求 JDK 1.5+ 主因即泛型免配置。JDK 1.4 需大量 conversion 檔案。

Set 集合的特殊處理

Set 無序無索引,需指定索引屬性:

Element_users=com.unmi.vo.User
KeyProperty_users=name  <!-- User 的 name 屬性作為索引 -->

提交頁面用圓括號:users('scott').name。顯示同樣用圓括號。一般建議用 List 替代 Set。

內建轉換器清單

  • 基本型別與包裝類:boolean/Boolean、char/Character、int/Integer、long/Long、float/Float、double/Double
  • Date:請求 Locale 的 SHORT 格式
  • 陣列:預設元素 String,其他型別逐元素轉換
  • 集合:預設元素 String(XWorkList(String.class, Object[]));泛型如 List<Integer> → XWorkList(Integer.class, Object[]),XWorkList 繼承 ArrayList

轉換錯誤處理與國際化

預設攔截器棧含 conversionError 攔截器,自動封裝為 fieldError 放入 ActionContext。開發者只需:

  1. Action 繼承 ActionSupport
  2. struts.xml 宣告 <result name="input">
  3. 盡量用 <s:textfield> 等標籤(錯誤自動顯示在輸入框上方)

自定義錯誤訊息

  • 全域:資源檔加 xwork.default.invalid.fieldvalue={0}欄位類型轉換失敗!
  • 特定欄位:ActionName.properties 加 invalid.fieldvalue.屬性名=提示訊息(如 invalid.fieldvalue.number=數量格式錯誤)

集合屬性轉換錯誤顯示

同名輸入框多個出錯:手工 <s:fielderror/> 僅顯示一條;用標籤 <s:textfield> 則每個出錯框皆顯示。

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