專案需在前端輸出一個 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);
<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>
logic:iterate 遍歷 List,每個 element 是一個 Maplogic:iterate 遍歷 Map 的 EntrySet,每個 elementValue 是 Map.Entryproperty="key" 取得 Entry 的鍵,property="value" 取得值logic:equal 依鍵名過濾輸出特定欄位開發 <map:iterate> 標籤,屬性指定欄位順序,內部封裝巢狀邏輯,JSP 更乾淨:
<map:iterate list="${testList}" fields="master,class,grade"/>
在 Action 中將 List<Map> 轉為 List<ClassDTO>,前端直接用 bean:write property="master",分離關注點。
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,自訂標籤封裝是折中方案。