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>
利用 <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 取值。struts-tags.tld 或框架源碼此模式同樣適用於其他需在標簽文件中使用 Struts 標簽的場景,是官方推薦的最佳實踐之一。