Home » Java » JSTL Count the ForEach loop

JSTL Count the ForEach loop

Posted by: admin December 28, 2021 Leave a comment

Questions:

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 [email protected] 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!

Answers:

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>

###

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>