17

Is there a way to do a loop in Thymeleaf without a list?

I'd like to essentially convert this snippet to Thymeleaf:

<jsp:useBean id="now" class="java.util.Date" />
<fmt:formatDate var="year" value="${now}" pattern="yyyy" />
<c:forEach var="i" begin="0" end="99">
    <form:option value="${year-i}" />
</c:forEach>
</form:select>

-- Update --

I've decided this is along the lines of how I want to do it, but I'm not sure about the springEL syntax:

<option th:each="i : ${#numbers.sequence( 1, 100)}" th:value="#{ T(java.util.Date).getYear() - $i }">1</option>
Mouscellaneous
  • 2,584
  • 3
  • 27
  • 37

2 Answers2

25

In case you are still looking for the correct SpEL syntax, here's what worked for me:

<option th:each="i : ${#numbers.sequence( 1, 100)}"
        th:value="${ (new org.joda.time.DateTime()).getYear() - i }"
        th:text="${ (new org.joda.time.DateTime()).getYear() - i }">1</option>

Notice:

  • added th:text to set the option text.
  • used Joda-Time instead as java.util.Date wouldn't give me the desired outcome

Read this discussion on java.util.Date and getYear()

Community
  • 1
  • 1
cognant
  • 431
  • 6
  • 10
23

You can use the special thymleaf iteration variable inside the each block. This special variable name is the name of your element variable concatenate with the keyword 'Stat' (ex: elt -> eltStat) This variable gives you many information related to the iteration.

You can also specify this variable name after your element variable. For example:

<tr th:each="prod,iterStat : ${prods}" th:class="${iterStat.odd}? 'odd'">
    <td th:text="${prod.name}">Onions</td>
    <td th:text="${prod.price}">2.41</td>
    <td th:text="${prod.inStock}? #{true} : #{false}">yes</td>
</tr>

More information in the official documentation below:
http://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf.html#keeping-iteration-status

Mahozad
  • 18,032
  • 13
  • 118
  • 133
fliim
  • 2,059
  • 4
  • 18
  • 31
  • 2
    @PriiduNeemre "_This is much cleaner than the accepted answer_" . But the question clearly says that to keep the iteration counter without a List. In the above code `${prods}` is a list. – Lucky Jun 09 '16 at 15:16