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

Struts 2 標簽文件中傳遞參數給 Struts 標簽的最佳實踐

     編輯:Java 相關知識

JSP 標簽文件(.tag)是輕量級自定義標簽實現方式。但在 Struts 2.0.11+ 版本中,默認關閉標簽屬性的運行時表達式求值(rtexprvalue=false),導致無法在 <s:iterator value="${param}"> 中直接使用 EL 表達式。本文提供不修改框架源碼、不依賴請求參數的通用解決方案。

問題重現

<!-- /WEB-INF/tags/table.tag -->
<%@ taglib prefix="s" uri="/struts-tags"%>
<%@ attribute name="index" type="java.lang.String" required="true" %>

<table>
  <s:iterator var="row" value="${index}"> <!-- 低版本可行,新版報錯 -->
    <tr>
      <s:iterator var="cell" value="row">
        <td><s:property value="cell"/></td>
      </s:iterator>
    </tr>
  </s:iterator>
</table>

解決方案:ValueStack + OGNL

利用 <s:set> 將參數放入 ValueStack,標簽文件中用 OGNL 表達式直接引用變量名。

修改後的標簽文件

<%@ taglib prefix="s" uri="/struts-tags"%>
<table border="1" style="font-size:25px">
  <!-- 直接用 OGNL 引用 index 變量 -->
  <s:iterator var="row" value="index">
    <tr>
      <s:iterator var="cell" value="row">
        <td><s:property value="cell"/></td>
      </s:iterator>
    </tr>
  </s:iterator>
</table>

調用頁面傳參

<%@ taglib prefix="t" tagdir="/WEB-INF/tags"%>
<%@ taglib prefix="s" uri="/struts-tags"%>

<!-- 第一次調用:index=grid1 -->
<s:set var="index" value="grid1"/>
<t:table/>

<!-- 第二次調用:index=grid2 -->
<s:set var="index" value="grid2"/>
<t:table/>

原理解析

  • <s:set var="index" value="grid1"/> 將字符串 "grid1" 存入 ValueStack 頂層,鍵為 index。
  • 標簽文件中 value="index" 經 Struts 標簽解析為 OGNL 表達式,自動從 ValueStack 取值。
  • 避免了 EL 表達式在標簽屬性中求值受限的問題,同時不修改框架默認配置。

適用場景與優勢

  • ✅ 兼容 Struts 2.0.11+ 所有版本
  • ✅ 無需修改 struts-tags.tld 或框架源碼
  • ✅ 不污染請求參數空間
  • ✅ 支持任意對象類型(List、Map、Bean 等)傳遞

此模式同樣適用於其他需在標簽文件中使用 Struts 標簽的場景,是官方推薦的最佳實踐之一。

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