基于JSTL的嵌套迭代

时间:2011-12-09 22:53:35

标签: iterator nested jstl

假设您有以下代码:

<c:if test="${fn:length(myIterator) > 0}">      
    <span>blabla</span>
    <c:forEach var="myVar" items="${myIterator}" varStatus="status">
        // some stuff
    </c:forEach>
    <br />
</c:if>

请注意,myIterator是一个迭代器(惊讶,惊讶* g)。

问题是我不会在每个循环中结束并且看不到“//某些东西”发生。我认为原因是fn:length(myIterator)已经遍历迭代器以确定其大小,以便在到达forEach循环时我们已经到达终点。

我还没有看到任何手动重置迭代器的优雅方法。

当然我可以尝试使用scriptlet代码(类似于&lt;%myIterator.reset()%&gt;,但我想避免这种情况。

我也尝试了类似的事情:

<c:if test="${not empty myIterator}">  

但这也不起作用(甚至没有进入if子句的主体)。

任何优雅的建议?

感谢。

1 个答案:

答案 0 :(得分:0)

你为什么指的是迭代器。那应该是像ArrayList之类的集合。

an iterator can only be iterated once

[编辑]

恕我直言,最干净的方法是更改​​Java控制器以为您提供集合。但是,根据您的反馈,您不想或不能......

  1. 更改Java代码
  2. 在JSP中使用Java scriptlet
  3. 你可以用一些Javascript / DHTML来解决这个问题。考虑这个JSP代码

    <script type="text/javascript">
    var loopHasContent = false;
    </script>
    
    <div id="loop-content" style="display:none">
        <span>blabla</span>
        <c:forEach var="myVar" items="${myIterator}" varStatus="status">
            <script type="text/javascript">
            loopHasContent = true;
            </script>
            // some stuff
        </c:forEach>
        <br />
    </div>
    
    <script type="text/javascript">
    if(loopHasContent) {
        document.getElementById("loop-content").style.display = "block";
    }
    </script>
    

    您只能引用Iterable一次,因此您的问题就会消失。默认情况下不显示div。只要您的forEach循环至少执行一次,则javascript变量loopHasContent将设置为true,否则它将保持为false。尾随div的最终javascript只会显示你的循环内容。