带循环的增量计数器


69

这个问题与我以前的问题有关:

JSP迭代槽对象列表

我想在for循环中插入从0开始的计数器,到目前为止,我已经尝试了几种组合:

1。

<c:forEach var="tableEntity" items='${requestScope.tables}'>
   <c:forEach var="rowEntity" items='${tableEntity.rows}' varStatus="count">            
        <c:out value="${count}" />
    </c:forEach>
</c:forEach>

2。

<c:set var="count" value="0" scope="page" />
<c:forEach var="tableEntity" items='${requestScope.tables}'>
   <c:forEach var="rowEntity" items='${tableEntity.rows}'>      
   <%=count++%>  
<c:out value="${count}" />
    </c:forEach>
</c:forEach>

第一种方法的问题是,外循环有3个项目,内循环有7个项目,因此对于每个外项目,计数都从0开始。第二个方法出现编译错误。这基本上是我想要的:

counter = 0;
outer for loop 
    inner for loop 
       counter++;
       //cout/echo/print counter value should start from 0
    end inner loop
end outer loop

我只是不完全了解语法。谢谢


1
您得到什么编译器错误?
彼得Török

不要做。很难写,也很难读。只需创建一个bean并使用它即可。如果您真的需要它:每个循环一个计数器,然后将外部* tableEntity.rows.size +内部组合在一起,该怎么办?
maaartinus 2011年

@maaartinus你能举个例子吗?
伦敦,

我现在找不到它,但是很简单:每当JSP变得太复杂时,就创建一个bean(具有默认构造函数且可设置所有字段的类),在Java中实现所需的功能(而不是这种人字形拼写),为计算并获得结果。在这里,JSP解决方案比我想象的要简单,但是通常不要在JSP中放入复杂的计算。
maaartinus 2011年

Answers:


177

请尝试以下操作:

<c:set var="count" value="0" scope="page" />

//in your loops
<c:set var="count" value="${count + 1}" scope="page"/>

6
这正是我一直在寻找tnx的目的
伦敦

3
有关更清洁的解决方案,请参阅BalusC的答案。即使用varStatus
亚光

2
我不知道..实际上,这个看起来更干净,更容易
Henley Chiu

非常感谢!我的实现要求它必须是一个会话范围,它才能起作用,干杯!
乔纳森·拉利伯特

如何分配count给JavaScript变量?
Ammar Samater '17

41

varStatus对其LoopTagStatus具有getIndex()方法的引用。

所以:

<c:forEach var="tableEntity" items='${requestScope.tables}' varStatus="outer">
   <c:forEach var="rowEntity" items='${tableEntity.rows}' varStatus="inner">            
        <c:out value="${(outer.index * fn:length(tableEntity.rows)) + inner.index}" />
    </c:forEach>
</c:forEach>

也可以看看:


1
@BalusC您的代码似乎很有趣,但是我并没有真正了解它的作用,但是却无法产生正确的结果。感谢您的时间和精力。
伦敦

@BalusC是的,我用过这个。外循环有3个项目,第一个内循环有7个项目,第二个内循环有10个项目,第三个内循环有3个项目。因此,总计数器应从0到19计数。但是您的代码会产生以下结果:0 1 2 3 4 5 6 10 11 12 13 14 15 16 17 18 19 6 7 8。也许我没有正确解释我的问题..但这不是我想要实现的目标。而且我不认为您的错误是愚蠢的,因为所有这些在我看来(暂时)都是一样的,但是那会改变。
伦敦

2
在您最初的问题中,您有2个循环。答案就是针对这一点的。如果您有更多的嵌套循环,则必须在计算中将它们全部考虑在内,然后Dogbane的答案确实就不那么复杂了(但是scope="page"如果count在其他作用域中没有属性,则多余的话)去掉它)。
BalusC

@BalusC是的,我确实不知道,我不需要作用域页面。谢谢,您能为JSP建议一些有用的资源吗?我有编程背景,但这是我进入springmvc / jsp的入口。
伦敦,

从我们的JSP信息页面开始,您也可以通过以下方式访问:悬停[jsp]标签并单击info链接,或者在单击标签about the jsp tag面对具有相同标签的所有问题时单击链接[jsp]
BalusC

4

您可以在c:forEach循环中使用varStatus

在第一个示例中,您可以使计数器正常工作,如下所示...

<c:forEach var="tableEntity" items='${requestScope.tables}'>
   <c:forEach var="rowEntity" items='${tableEntity.rows}' varStatus="count">            
        my count is ${count.count}
    </c:forEach>
</c:forEach>

0

导致我进入此页面的原因是,我在页面内进行设置,然后在包含页面的内部进行了增量

这是问题

因此,要解决此问题,只需scope="request"在声明变量或增量时使用

//when you set the variale add scope="request"
<c:set var="nFilters" value="${0}" scope="request"/>
//the increment, it can be happened inside an included page
<c:set var="nFilters" value="${nFilters + 1}"  scope="request" />

希望这可以节省您的时间

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.