带循环的增量计数器

Posted

技术标签:

【中文标题】带循环的增量计数器【英文标题】:Increment counter with loop 【发布时间】:2011-06-19 06:08:13 【问题描述】:

这个问题和我之前的问题有关:

Jsp iterate trough object list

我想在我的 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

我只是不完全熟悉语法。谢谢

【问题讨论】:

你得到什么编译器错误? 不要这样做。很难写,也更难读。只需创建一个 bean 并使用它。如果您真的需要它:每个循环一个计数器并结合类似的 external*tableEntity.rows.size + inner 怎么样? @maaartinus 你能举个例子吗? 我现在找不到,但是很简单:每当 JSP 变得过于复杂时,创建一个 bean(一个具有默认构造函数和所有字段可设置的类),用 Java 实现所需的功能,而不是这个 chevronitis,设置计算字段并获得结果。这里的JSP方案比我想象的要简单,但是一般不要把复杂的计算放在JSP里面。 【参考方案1】:

尝试以下方法:

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

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

【讨论】:

这正是我寻找的 tnx 查看 BalusC 的答案以获得更清洁的解决方案。即,使用 varStatus 我不知道..这个实际上看起来更干净,更舒服 非常感谢!我的实现要求它是一个会话范围才能工作,干杯! 如何将 count 分配给 javascript 变量?【参考方案2】:

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>

另见:

Hidden features of JSP/Servlet

【讨论】:

@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 个循环。答案就是针对这个。如果您有更多的嵌套循环,那么您必须在计算中将它们全部考虑在内,然后 dogbane 的答案确实不那么复杂(但是,如果您在其他中没有 count 属性,则 scope="page" 是多余的范围,然后您可以安全地删除它)。 @BalusC 是的,我确实不知道,我不需要范围页面。谢谢,能不能推荐一些对JSP有用的资源,我有编程背景但是这是我进入springmvc/jsp的入门。 从我们的JSP info page 开始,您也可以通过将鼠标悬停在[jsp] 标签并单击info 链接或在面对[jsp] 后单击[jsp] 标签后单击about the jsp tag 链接来访问它.【参考方案3】:

您可以在 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>

【讨论】:

【参考方案4】:

让我进入这个页面的原因是我在一个页面内设置然后在包含的页面内部我做了增量

问题来了

所以要解决这样的问题,只需在声明变量或自增时使用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" />

希望这可以节省您的时间

【讨论】:

以上是关于带循环的增量计数器的主要内容,如果未能解决你的问题,请参考以下文章

损坏:带有增量计数器的 For 循环中的 Elif

php循环语句

如何根据循环内的特定条件使用 Array.map 迭代停止索引计数增量?

带计数器的多处理嵌套 for 循环

需要帮助使用循环生成三个块

Python中的循环和if语句