嵌套循环场景下JSTL计数器的替代实现方案咨询
问题:JSTL外层循环中实现类名按外层次数递增的替代方案
我在使用JSTL时遇到了计数器的问题:存在一个外层<c:forEach>循环,<c:if>条件会被多次校验。当条件为true时需要添加额外的行,但JSTL自带的计数器无法满足需求。
当前代码结构:
<c:forEach> <tr...> ... </tr> <c:if test="${something true here}"> <c:forEach var="entry" items="${entries}"> <tr class="row {CHANGE_THIS!}"> ... </tr> </c:forEach> </c:if> </c:forEach>
期望效果
每次外层循环进入<c:if>块时,内部循环的所有<tr>使用相同的类名,且类名的数字部分随外层循环次数递增:
- 第一次外层循环进入
<c:if>时:
<tr class="row row1"> <tr class="row row1"> <tr class="row row1">
- 第二次外层循环进入
<c:if>时:
<tr class="row row2"> <tr class="row row2"> <tr class="row row2">
现有问题
使用JSTL计数器会生成不符合预期的结果(每一行数字都递增):
<tr class="row row1"> <tr class="row row2"> <tr class="row row3">
而且JSTL计数器依赖集合大小,无法实现无限制的数值递增。
解决方案
方法1:利用外层<c:forEach>的varStatus属性
外层<c:forEach>的varStatus对象提供了count属性(从1开始递增的序号),正好可以用来生成类名。修改后的代码如下:
<c:forEach varStatus="outerStatus"> <tr...> ... </tr> <c:if test="${condition}"> <c:forEach var="entry" items="${entries}"> <tr class="row row${outerStatus.count}"> ... </tr> </c:forEach> </c:if> </c:forEach>
outerStatus.count会随着外层循环的次数从1开始递增,每次进入<c:if>块时,内部所有<tr>都会使用当前外层循环的序号作为类名后缀,完全符合需求。
方法2:手动维护全局计数器
如果外层循环不是<c:forEach>(比如自定义循环逻辑),可以用<c:set>手动维护一个计数器变量:
<!-- 初始化计数器,从1开始 --> <c:set var="rowCounter" value="1" scope="page"/> <c:forEach> <tr...> ... </tr> <c:if test="${condition}"> <c:forEach var="entry" items="${entries}"> <tr class="row row${rowCounter}"> ... </tr> </c:forEach> <!-- 只有当进入<c:if>块时,才递增计数器 --> <c:set var="rowCounter" value="${rowCounter + 1}" scope="page"/> </c:if> </c:forEach>
这种方式更灵活,计数器只会在满足<c:if>条件时递增,不受外层循环次数的限制,完全实现无限制的数值递增。
内容的提问来源于stack exchange,提问作者papasvenska
相关产品推荐
相关产品推荐

