ChatGPT解决这个技术问题 Extra ChatGPT

带循环的增量计数器

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

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 并使用它。如果您真的需要它:每个循环一个计数器并结合类似的外部*tableEntity.rows.size + 内部怎么样?
@maaartinus 你能举个例子吗?
我现在找不到它,但它很简单:每当 JSP 变得太复杂时,创建一个 bean(一个具有默认构造函数和所有可设置字段的类),在 Java 中实现所需的功能而不是这个 chevronitis,为计算并得到结果。在这里,JSP 的方案比我想象的要简单,但是一般不要把复杂的计算放在 JSP 中。

d
dogbane

尝试以下操作:

<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 变量?
B
BalusC

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

所以:

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

也可以看看:

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] 标记后面对 all questions with the same tag 时单击 about the jsp tag 链接来访问它。
A
Andy Brudtkuhl

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

B
Basheer AL-MOMANI

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

这就是问题所在

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

希望这可以节省您的时间