JSTL c: forEach, цикл с декрементным числом невозможен?

Я хочу напечатать декрементные числа, например:

<c:forEach var="i" begin="10" end="0" step="-1">
    ... ${i} ...
</c:forEach>

затем я получил исключение jsp:

javax.servlet.jsp.JspTagException: 'step' <= 0
    javax.servlet.jsp.jstl.core.LoopTagSupport.validateStep(LoopTagSupport.java:459)
    org.apache.taglibs.standard.tag.rt.core.ForEachTag.setStep(ForEachTag.java:60)
    ....

но этот ответ говорит, что можно зацикливаться в обоих направлениях:

JSTL для каждого обратного порядка

Что со мной не так?


person shkim    schedule 07.10.2010    source источник
comment
Этот другой вопрос был действительно о том, как перебрать коллекцию в обратном направлении. Я исправил свой ответ, так что другая часть тоже верна. С тобой все в порядке. В моем ответе была ошибка.   -  person Eddie    schedule 08.02.2013


Ответы (2)


Я не уверен, как ответчик на другой вопрос заставил его работать, но я не могу заставить его работать здесь с эталонной реализацией JSTL.

В любом случае, вы можете выполнить требование следующим образом:

<c:forEach var="i" begin="0" end="10" step="1">
    ... ${10 - i} ...
</c:forEach>

Или, если вы хотите избежать дублирования 10:

<c:forEach var="i" begin="0" end="10" step="1" varStatus="loop">
    ... ${loop.end - i + loop.begin} ...
</c:forEach>
person BalusC    schedule 07.10.2010
comment
Правильно, в спецификации указано: если указано, шаг должен быть ›= 1 - person kschneid; 07.10.2010

Возможное решение без использования атрибута var:

<c:forEach begin="0" end="10" varStatus="loop">
  ${loop.end - loop.count + 1}
</c:forEach>

Обратите внимание, что step тоже опущено, потому что его значение по умолчанию равно 1.

person Giulio Piancastelli    schedule 23.04.2015