如何将 c:forEach 标签的循环索引附加到 struts 选择/文本标签的属性中?
例如。
<%@ taglib uri="/WEB-INF/tld/struts-html.tld" prefix="html"%>
<c:forEach begin="2" end="${pageView.guestCount}" varStatus="gC">
<div class="section guest-details">
<html:select property='title_guest<c:out value="${gC.index}"/>'>
<html:options collection="titles" property="code" labelProperty="value" />
</html:select>
</div>
</c:forEach>
引发以下错误
javax.servlet.jsp.JspException at org.apache.struts.taglib.html.SelectTag.calculateMatchValues(SelectTag.java:246)
现在,当我在<html:select ...
调试代码时,它显示当属性属性设置时,它设置为"title_guest<c:out value="${gC.index}"/>"
,这可能是上述异常的原因。
另外,我应该提到,如果我使用上述格式将循环索引附加到标准 html 标签属性(如 <select>
标签),代码工作正常。
例如
<c:forEach begin="2" end="${pageView.guestCount}" varStatus="gC">
<div class="section guest-details">
<select name='title_guest<c:out value="${gC.index }"/>'>
<option value="">Select Title</option>
</select>
</div>
</c:forEach>
正确输出预期的 HTML
我做错了什么,我应该使用 EL 来创建将填充 html:select 标签的"属性"属性的字符串吗?
更新
还尝试了以下代码片段,但也没有用 <html:select property="title_guest${gC.index}">
而且,这也不起作用
<c:set var="guestTitle">title_guest${gC.index}</c:set>
<html:select property="${guestTitle}" styleClass="{required: true}">
<html:options collection="titles" property="code" labelProperty="value" />
</html:select>
经过一番痛苦的挖掘,我似乎找到了问题所在,从而找到了解决方案。c:forEach 标签不会将 varStatus 导出为脚本变量,因此 varStatus 变量不能在 RT Expr 中用于 html:select 标签的属性属性。
但是,c:forEach 确实将 varStatus 变量导出为 pageContext 属性,该属性可以检索并用于提取索引/计数。唯一的问题是你必须导入javax.servlet.jsp.jstl.core.LoopTagStatus 类,并使用它来手动重新创建varStatus变量,以便它可以在scriplet中使用
。这是有效的代码片段
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
import="javax.servlet.jsp.jstl.core.LoopTagStatus"
%>
...
<c:forEach begin="2" end="${pageView.guestCount}" varStatus="gC">
<% LoopTagStatus gN = (LoopTagStatus)pageContext.getAttribute("gC"); %>
<html:select property='<%="title_guest"+gN.getIndex()%>'>
<html:options collection="titles" property="code" labelProperty="value" />
</html:select>
</c:forEach>
我不认为这是一个干净的解决方案(但可能是唯一的解决方案)。因此,我会先让社区对这个答案进行投票(或者写一个更好的答案),然后再接受它作为最终答案。
这将是一个嵌套表达式,这是不允许的,请尝试使用它
<html:select property='title_guest${gC.index}'>
我的方式
<c:forEach begin="1" end="${page.totalPages}" varStatus="lp">
<li><a href="<c:url value="/course?page=${pageScope.lp.index}"/>">${pageScope.lp.index}</a></li>
</c:forEach>