Вложенная итерация на основе JSTL - PullRequest
0 голосов
/ 10 декабря 2011

Предположим, у вас есть следующий код:

<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.

Я не видел ни одного элегантного способасбросить итератор вручную или около того.

Конечно, я мог бы попытаться использовать код скриптлета (что-то вроде <% myIterator.reset ()%>, но я бы хотел этого избежать.

Iтакже пробовал что-то вроде:

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

Но это тоже не сработало (даже не попало в тело условия if).

Какие-нибудь изящные предложения?

Спасибо.

1 Ответ

0 голосов
/ 10 декабря 2011

Почему вы обращаетесь к итератору.Это должна быть коллекция вроде ArrayList или что-то в этом роде.

итератор может быть повторен только один раз

[EDIT]

ИМХО, самый чистый подход состоит в том, чтобы изменить контроллер Java, чтобы получить коллекцию,Однако, исходя из ваших отзывов, которые вы не хотите или не можете ...

  1. Изменить код Java
  2. Использовать Java-скриптлеты в вашем JSP

Вы можете решить эту проблему с помощью 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, в противном случае она остается ложной.Окончательный javascript, завершающий div, покажет ваш цикл-контент, только если это необходимо.

...