2011-12-09 54 views
0

假设你有下面的代码: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是一个迭代器(惊奇,惊奇*克)。

问题是,我不会在每个循环结束,并没有看到“/ /一些东西”发生。我认为原因是fn:length(myIterator)已经迭代了迭代器来确定它的大小,以便我们在到达forEach循环时已经达到了最终结果。

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

当然,我可以尝试使用小脚本代码(类似<%myIterator.reset()%>,但我想,以避免

我也曾尝试类似:

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

但是这并没有工作,要么(甚至没有进入,如果从句的身体)。

任何优雅的建议?

感谢。

回答

0

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

an iterator can only be iterated once

[编辑]

恕我直言,最干净的方法是改变Java的控制给你一个集合。然而,根据您的反馈,你不想或不能...

  1. 更改Java代码在JSP
  2. 使用的Java小脚本

你可以用一些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。如果需要,最终的javascript跟踪div将只显示你的循环内容。

+0

这是我的“控制”;我明白了这一点。 – AnNaSF

+0

我justed更新了链接。也许你可以申请一个新的迭代,如果你不能直接访问收藏 – Brad

+0

请求一个新的迭代?你什么意思?我怎样才能使用JSTL? – AnNaSF