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

Struts 2 迭代異構對象集合:s:iterator 進階技巧

     編輯:Java 相關知識

場景

單一 List 中包含不同類型的 POJO(如 Feng、FengFeng),需在 JSP 中區分類型並顯示對應屬性。

實現步驟

1. 定義不同 POJO

public class Feng { private String lou, feng; /* getter/setter */ }
public class FengFeng { private String a, b; /* getter/setter */ }

2. Action 準備異構列表

private List<Object> li; // 使用 Object 或共同父介面
public String execute() {
    li = new ArrayList<>();
    li.add(new Feng("lou", "feng"));
    li.add(new Feng("lou1", "feng1"));
    li.add(new FengFeng("a", "b"));
    li.add(new FengFeng("a1", "b2"));
    return SUCCESS;
}

3. JSP 中類型安全迭代

<s:iterator value="li">
    <s:if test="feng != null">
        <s:property value="feng"/>!!<s:property value="lou"/>
    </s:if>
    <s:if test="a != null">
        <s:property value="a"/>!!<s:property value="b"/>
    </s:if>
</s:iterator>

輸出效果

feng!!lou feng1!!lou1 a!!b a1!!b2

原理解析

  • OGNL 表達式 feng != null 嘗試獲取當前迭代物件的 feng 屬性;若物件無此屬性則返回 false(不拋異常)。
  • 同理 a != null 篩選 FengFeng 實例。
  • 本質上利用鴨子類型特性:有屬性即可訪問,無則忽略。

最佳實踐與注意事項

  1. 推薦定義共同介面(如 Displayable),Action 返回 List<Displayable>,編譯期更安全。
  2. 屬性名盡量語義化,避免不同類型同名屬性含義不同導致誤判。
  3. 大量異構物件時,考慮用 instanceof 邏輯移至 Action 或自定義標籤,保持 JSP 簡潔。
  4. Struts 2.5+ 可結合 <s:append> 合併多個同類型列表再迭代。

適用場景

  • 聚合查詢結果:訂單明細包含商品、服務、優惠券等不同實體。
  • 儀表盤組件:不同類型 Widget 統一渲染。
  • 多態集合展示:共同父類/介面的多種實現類混合列表。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved