在 JSP 中使用 <s:iterator value="roles" id="role"> 迭代集合後,迭代體內可直接用 ${role.name} 取得屬性,而無需 <s:property>。這是因為 id 屬性將當前迭代物件放入 OgnlContext(ValueStack 內部上下文),EL 解析器會搜尋 Page/Request/Session/Application 以及 ValueStack,故能直接取值。
<s:iterator> 執行時,將集合各元素依序推入 ValueStack 的 CompoundRoot 內部清單頂端。id="role",同時將該元素以鍵值 "role" 放入 OgnlContext(實作為 ActionContext.getContext() 的 Map)。${role.name} 解析時,PageContext.findAttribute("role") 會委派給 Struts2 的 ValueStack 查找,命中後呼叫 getName()。<!-- Action -->
ActionContext.getContext().put("roles", roleList); // 放入 request scope
<!-- JSP -->
<s:iterator value="roles" id="role">
<!-- 此處 role 已在 ValueStack 頂端,且 OgnlContext 有 "role" 鍵 -->
Name: ${role.name} <br/>
Code: ${role.code}
</s:iterator>
id 屬性為 選用;若省略,仍可用 <s:property value="name"/> 或 ${top.name}(top 為 ValueStack 內建鍵)。id 會遮蔽外層同名變數,建議使用具體名稱如 id="outerRole", id="innerPerm"。Struts2 官方文件:Iterator Tag
部落格解析:s:iterator id 屬性與 OgnlContext