在 Struts 1.x + JSP 架構中,<c:forEach>(JSTL)與 <logic:iterate>(Struts 標簽庫)是兩種主流集合遍歷方式。本文通過完整 Action、JSP 示例,對比兩者語法差異、EL 表達式與 Bean 標簽配合細節,並列出 Struts 1.3 標簽庫引入正確 URI。
public ActionForward selectStudent(...) {
List<Student> list = studentService.selectStudent(conn);
request.setAttribute("list", list); // 放入 request 域
return mapping.findForward("show");
}
<%@ taglib uri="https://java.sun.com/jstl/core_rt" prefix="c" %>
<%@ taglib uri="https://jakarta.apache.org/struts/tags-bean" prefix="bean" %>
<%@ taglib uri="https://jakarta.apache.org/struts/tags-logic" prefix="logic" %>
<table>
<tr><th>ID</th><th>姓名</th><th>操作</th></tr>
<!-- JSTL 方式:配合 EL 表達式 -->
<c:forEach items="${list}" var="student">
<tr>
<td>${student.id}</td>
<td>${student.name}</td>
</tr>
</c:forEach>
<!-- Struts logic:iterate 方式:需配合 bean:write -->
<logic:iterate id="li" name="list" type="vo.Student">
<tr>
<td><bean:write name="li" property="id"/></td>
<td><bean:write name="li" property="name"/></td>
<td><a href="student.do?method=deleteStudent&id=<bean:write name='li' property='id'/>">刪除</a></td>
</tr>
</logic:iterate>
</table>
| 特性 | JSTL c:forEach | Struts logic:iterate |
|---|---|---|
| 表達式語言 | EL (${...}) | OGNL / Bean 標簽 |
| 變量作用域 | var="student" 頁面級 | id="li" 頁面級 |
| 類型轉換 | 自動 | 需指定 type="完整類名" |
| 嵌套屬性訪問 | ${student.addr.city} | <bean:write name="li" property="addr.city"/> |
| 性能 | 較輕量 | 標簽處理器開銷稍大 |
| 推薦場景 | 現代項目、純 JSTL 頁面 | 舊 Struts 項目、需緊密集成 Struts 表單/驗證 |
<%@ taglib uri="https://jakarta.apache.org/struts/tags-bean" prefix="bean" %>
<%@ taglib uri="https://jakarta.apache.org/struts/tags-html" prefix="html" %>
<%@ taglib uri="https://jakarta.apache.org/struts/tags-logic" prefix="logic" %>
舊版 /WEB-INF/struts-logic.tld 路徑方式已不推薦,統一使用官方 URI 避免部署路徑依賴。