JSTL计算ForEach循环

时间:2014-02-06 09:45:39

标签: java jsp foreach jstl

我正在尝试为项目列表中的每4项打印一些消息

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

但我得到的是异常,似乎i不被视为数字

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)

我如何实现这一目标?

一种方法是在scriplets的帮助下为每个循环声明一个变量和增量。但我想避免这个!

2 个答案:

答案 0 :(得分:14)

变量i的类型为LoopTagStatus。要获得int,您可以使用getCount()getIndex()

如果要打印1 st 项目的消息,请使用:

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

否则使用:

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

答案 1 :(得分:2)

varStatus的类型为LoopTagStatusJavaDoc)。因此,您必须使用count的属性i

<c:if test="${i.count % 4 == 0}">
    <c:out value="Test" />
</c:if>