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

Struts 標籤輸出 List 資料結構的最佳實踐

     編輯:Java 相關知識

問題場景

專案需在前端輸出一個 List<Map>,每個 Map 代表一筆記錄(如:年級、班級、導師),而非傳統 JavaBean。Struts 標籤預設支援 Bean 屬性存取,需技巧處理 Map 結構。

資料結構範例

List<Map> testList = new ArrayList<>();

Map<String, String> m1 = new HashMap<>();
m1.put("grade", "七年級");
m1.put("class", "一班");
m1.put("master", "張三");
testList.add(m1);

Map<String, String> m2 = new HashMap<>();
m2.put("grade", "八年級");
m2.put("class", "二班");
m2.put("master", "張三");
testList.add(m2);

Map<String, String> m3 = new HashMap<>();
m3.put("grade", "九年級");
m3.put("class", "五班");
m3.put("master", "李四");
testList.add(m3);

Struts 標籤實作方案

核心技巧:巢狀迭代 + Key/Value 存取

<logic:iterate id="element" name="testList">
  <!-- 遍歷每個 Map 的 Entry -->
  <logic:iterate id="elementValue" name="element">
    <logic:equal name="elementValue" value="master" property="key">
      <bean:write name="elementValue" property="value"/>
    </logic:equal>
  </logic:iterate>

  <logic:iterate id="elementValue" name="element">
    <logic:equal name="elementValue" value="class" property="key">
      <bean:write name="elementValue" property="value"/>
    </logic:equal>
  </logic:iterate>

  <logic:iterate id="elementValue" name="element">
    <logic:equal name="elementValue" value="grade" property="key">
      <bean:write name="elementValue" property="value"/>
    </logic:equal>
  </logic:iterate>
</logic:iterate>

關鍵點解析

  1. 外層 logic:iterate 遍歷 List,每個 element 是一個 Map
  2. 內層 logic:iterate 遍歷 Map 的 EntrySet,每個 elementValue 是 Map.Entry
  3. property="key" 取得 Entry 的鍵,property="value" 取得值
  4. logic:equal 依鍵名過濾輸出特定欄位

優化建議

方案一:自訂標籤封裝

開發 <map:iterate> 標籤,屬性指定欄位順序,內部封裝巢狀邏輯,JSP 更乾淨:

<map:iterate list="${testList}" fields="master,class,grade"/>

方案二:轉換為 DTO 列表

在 Action 中將 List<Map> 轉為 List<ClassDTO>,前端直接用 bean:write property="master",分離關注點。

方案三:使用 JSTL c:forEach (推薦)

<c:forEach var="row" items="${testList}">
  <c:forEach var="entry" items="${row}">
    <c:choose>
      <c:when test="${entry.key == 'master'}">${entry.value}</c:when>
      <c:when test="${entry.key == 'class'}">${entry.value}</c:when>
      <c:when test="${entry.key == 'grade'}">${entry.value}</c:when>
    </c:choose>
  </c:forEach>
</c:forEach>

JSTL 表達式語言(EL)語法更簡潔,且為標準規範,避免 Struts 標籤庫鎖定。

總結

Struts 可透過巢狀迭代 Key/Value 處理 List<Map>,但代碼冗長。建議採用 JSTL 或轉換為強型別 DTO,提升可維護性與效能。若專案已深度綁定 Struts,自訂標籤封裝是折中方案。

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