假设您有以下代码:
<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子句的主体)。
任何优雅的建议?
感谢。
答案 0 :(得分:0)
你为什么指的是迭代器。那应该是像ArrayList之类的集合。
an iterator can only be iterated once
[编辑]
恕我直言,最干净的方法是更改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。尾随div的最终javascript只会显示你的循环内容。