c:forEach Iteration

时间:2013-03-07 11:28:38

标签: jsp jstl

以下是我正在尝试的粗略迭代:

<c:forEach  items="${row.myList}" var="mainRow" varStatus="table">
        ${ table.first? '<table>':'<tr><td><strong>${mainRow.heading}</strong></td></tr>'}

            <c:forEach items="${mainRow.values}" var="value" >
             <tr>
                <td><input type="checkbox"  value="${value}"/>${value}</td>
              </tr>
            </c:forEach>
             ${ table.last? '</table>':''}
        </c:forEach>

问题是它打印$ {mainRow.heading}而不是属性值。 还有什么其他选择表。?像第一个,最后一个。有文件吗?

2 个答案:

答案 0 :(得分:1)

${ table.first? '<table>':'<tr><td><strong>${mainRow.heading}</strong></td></tr>'}

上面的表达式不是您想要的,因为您在EL表达式内的String文字中嵌入了EL表达式。你想要的是

${table.first? '<table>' : '<tr><td><strong>' + mainRow.heading + '</strong></td></tr>'}

<c:choose>
    <c:when test="${table.first}">
        <table>
    </c:when>
    <c:otherwise>
        <tr><td><strong>${mainRow.heading}</strong></td></tr>
    </c:otherwise
</c:choose>

更长,但更具可读性,IMO。

答案 1 :(得分:1)

在您的代码片段中,'<tr><td><strong>${mainRow.heading}</strong></td></tr>'就JSP而言只是一个字符串,因此无替换。请改用

${ table.first? '&lt;table&gt;':'<tr><td><strong>'.concat(mainRow.heading).concat('</strong></td></tr>') }

(我必须使用html实体来避免不匹配的标签。)

其他varStatus选项在此处进行了说明:http://docs.oracle.com/cd/E17802_01/products/products/jsp/jstl/1.1/docs/api/javax/servlet/jsp/jstl/core/LoopTagStatus.html