【问题标题】:How to append loop index of c:forEach tag to Struts HTML tag attributes?如何将 c:forEach 标签的循环索引附加到 Struts HTML 标签属性?
【发布时间】:2011-08-23 15:21:52
【问题描述】:

如何将 c: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>

抛出以下错误

javax.servlet.jsp.JspException at org.apache.struts.taglib.html.SelectTag.calculateMatchValues(SelectTag.java:246)

现在,当我在&lt;html:select ... 调试代码时,它显示当它设置的属性属性时,它设置为"title_guest&lt;c:out value="${gC.index}"/&gt;",这可能是上述异常的原因。

另外,我应该提一下,如果我使用上述格式将循环索引附加到标准 html 标记属性(如 &lt;select&gt; 标记),则代码可以正常工作。

例如

<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 标记的“属性”属性的字符串吗?

更新

下面的 sn-p 也试过了,也没用 &lt;html:select property="title_guest${gC.index}"&gt;

而且,这也行不通

<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>

【问题讨论】:

    标签: jsp struts jstl struts-html


    【解决方案1】:

    经过一番痛苦的挖掘之后,我似乎找到了问题并因此找到了解决方案。 c:forEach 标记不会将 varStatus 导出为脚本变量,因此 varStatus 变量不能用于 propertyRT Expr > html:select 标签的属性。

    但是,c:forEach 确实将 varStatus 变量导出为 pageContext 属性,可以检索并用于提取索引/计数。唯一的问题是您必须导入 javax.servlet.jsp.jstl.core.LoopTagStatus 类并使用它手动重新创建 varStatus 变量,以便可以在脚本中使用它

    这是有效的代码的 sn-p

    <%@ 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>
    

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

    【讨论】:

    • 等了整整两天......没有收到任何其他关于这个问题的答案,我接受了我自己的答案
    【解决方案2】:

    这将是一个嵌套表达式,这是不允许的,请尝试使用它来代替

    <html:select property='title_guest${gC.index}'>
    

    【讨论】:

      【解决方案3】:

      我的方式

                  <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>
      

      【讨论】:

        猜你喜欢
        • 2012-07-11
        • 2012-01-29
        • 2012-08-22
        • 2010-09-23
        • 1970-01-01
        • 1970-01-01
        • 2013-06-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多