首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Struts2 <s:iterator> 標籤為何能直接用 EL 表達式取值?

     編輯:程式設計綜合問答

現象說明

在 JSP 中使用 <s:iterator value="roles" id="role"> 迭代集合後,迭代體內可直接用 ${role.name} 取得屬性,而無需 <s:property>。這是因為 id 屬性將當前迭代物件放入 OgnlContext(ValueStack 內部上下文),EL 解析器會搜尋 Page/Request/Session/Application 以及 ValueStack,故能直接取值。

運作機制

  1. <s:iterator> 執行時,將集合各元素依序推入 ValueStack 的 CompoundRoot 內部清單頂端。
  2. 若指定 id="role",同時將該元素以鍵值 "role" 放入 OgnlContext(實作為 ActionContext.getContext() 的 Map)。
  3. EL 表達式 ${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"。
  • ValueStack 生命週期為單一請求,請勿嘗試跨請求儲存迭代變數。

參考資源

Struts2 官方文件:Iterator Tag
部落格解析:s:iterator id 屬性與 OgnlContext

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