如何将c:forEach标记的循环索引附加到Struts HTML标记属性?

Sal*_*cha 4 jsp struts jstl struts-html

如何将ac:forEach标记的循环索引附加到struts select/text标记的属性?

例如.

<%@ 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>
Run Code Online (Sandbox Code Playgroud)

抛出以下错误

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>
Run Code Online (Sandbox Code Playgroud)

正确输出预期的HTML

我做错了什么,我应该使用EL来创建将填充html:select标签的"property"属性的字符串吗?

UPDATE

以下片段也尝试了,但也没有用 <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>
Run Code Online (Sandbox Code Playgroud)

Sal*_*cha 8

在经历了一些痛苦的挖掘后,我似乎找到了问题并因此找到了解决方案.该C:的forEach标签不所述varStatus导出为脚本变量,因此varStatus变量不能在使用RT Expr的用于属性的属性HTML:选择标记.

但是,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>
Run Code Online (Sandbox Code Playgroud)

我不认为这是一个干净的解决方案(但可能是唯一的解决方案).因此,在我接受它作为最终答案之前,我会先让社区对这个答案进行投票(或者写一个更好的答案).