JSTL Count the ForEach loop

12,596

Solution 1

The variable i is of type LoopTagStatus. To get an int, you can use getCount() or getIndex().

If you want to print message for 1st item, then use:

<!-- `${i.index}` starts counting at 0 -->
<c:if test="${i.index % 4 == 0}">  
    <c:out value="Test" />
</c:if>

else use:

<!-- `${i.count}` starts counting at 1 -->
<c:if test="${i.count % 4 == 0}">
    <c:out value="Test" />
</c:if>

Solution 2

varStatus is of the type LoopTagStatus (JavaDoc). So you have to use the property count of i:

<c:if test="${i.count % 4 == 0}">
    <c:out value="Test" />
</c:if>
Share:
12,596
RaceBase
Author by

RaceBase

#SOreadytohelp

Updated on June 09, 2022

Comments

  • RaceBase
    RaceBase almost 2 years

    I am trying to print some message for every 4 items in the List of items

    <c:forEach items="${categoryList}" var="category" varStatus="i">
        <c:if test="${i%4 == 0}">
            <c:out value="Test" />
        </c:if>
        <div class="span3">
            <c:out value="a" />
        </div>
    </c:forEach>
    

    But I am getting below exceptions, seems like i is not treated as number

    java.lang.IllegalArgumentException: Cannot convert javax.servlet.jsp.jstl.core.LoopTagSupport$1Status@3371b822 of type class javax.servlet.jsp.jstl.core.LoopTagSupport$1Status to Number
        at org.apache.el.lang.ELArithmetic.coerce(ELArithmetic.java:407)
        at org.apache.el.lang.ELArithmetic.mod(ELArithmetic.java:291)
        at org.apache.el.parser.AstMod.getValue(AstMod.java:41)
        at org.apache.el.parser.AstEqual.getValue(AstEqual.java:38)
    

    How do I achieve this?

    One way is to declare a variable and increment for every loop with the help of scriplets. But I would like to avoid this!

  • Adrien Be
    Adrien Be almost 10 years
    Best practice is to use <c:if test="${i.first}"> to test if first item in loop. see docs.oracle.com/javaee/6/api/javax/servlet/jsp/jstl/core/…
  • Van Hung
    Van Hung about 7 years
    nice for .count