2011-12-09 77 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