如何在JSP页面中使用JSTL一次性展示所有迭代内容
我来帮你搞定这个问题!你现在的核心问题是把计数器的初始化放到了<c:forEach>循环内部,导致每次遍历都会重置计数器为0,根本没法实现累加效果。下面是修正后的完整方案:
正确实现步骤
- 在循环外初始化计数器:确保计数器在整个遍历过程中能持续保留累加值,不会被反复重置。
- 循环内根据分类累加:遍历每个
skill时,根据其category匹配对应的计数器进行累加。 - 一次性展示汇总/迭代内容:遍历完成后可以统一展示所有累加结果,也可以在遍历过程中同时展示单个技能和当前累计数。
完整代码示例
<%-- 先引入JSTL核心标签库(如果页面还没引入的话) --%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%-- 如果需要处理字符串大小写统一,可引入函数标签库 --%> <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> <%-- 1. 在循环外初始化所有计数器,作用域默认是page,全局有效 --%> <c:set var="cicount" value="0" /> <c:set var="pscount" value="0" /> <c:set var="prcount" value="0" /> <c:set var="jrcount" value="0" /> <%-- 2. 遍历studentSkills列表,处理每个skill并累加计数器 --%> <c:forEach items="${studentSkills}" var="skill"> <div class="panel panel-default"> <div class="panel-body-center"> <%-- 用toLowerCase避免大小写匹配问题 --%> <c:choose> <c:when test="${fn:toLowerCase(skill.category) eq 'community involvement'}"> <c:set var="cicount" value="${cicount + 1}" /> <p>${skill.name}(社区参与类 · 当前累计:${cicount})</p> </c:when> <c:when test="${fn:toLowerCase(skill.category) eq 'professional skills'}"> <c:set var="pscount" value="${pscount + 1}" /> <p>${skill.name}(专业技能类 · 当前累计:${pscount})</p> </c:when> <c:when test="${fn:toLowerCase(skill.category) eq 'projects'}"> <c:set var="prcount" value="${prcount + 1}" /> <p>${skill.name}(项目类 · 当前累计:${prcount})</p> </c:when> <c:when test="${fn:toLowerCase(skill.category) eq 'job roles'}"> <c:set var="jrcount" value="${jrcount + 1}" /> <p>${skill.name}(岗位角色类 · 当前累计:${jrcount})</p> </c:when> <c:otherwise> <p>${skill.name}(未分类)</p> </c:otherwise> </c:choose> </div> </div> </c:forEach> <%-- 3. 遍历结束后,一次性展示所有分类的累加结果 --%> <div class="panel panel-info"> <div class="panel-heading">技能分类统计汇总</div> <div class="panel-body"> <ul class="list-unstyled"> <li>社区参与类:<strong>${cicount}</strong> 项</li> <li>专业技能类:<strong>${pscount}</strong> 项</li> <li>项目类:<strong>${prcount}</strong> 项</li> <li>岗位角色类:<strong>${jrcount}</strong> 项</li> </ul> </div> </div>
关键注意点
- 计数器初始化必须放在
<c:forEach>外部:JSTL变量默认作用域是page,放在循环外才能保证整个遍历过程中值被持续修改。 - 使用
<c:choose>替代多个<c:if>:逻辑更清晰,避免重复判断,效率也更高。 - 字符串大小写处理:用
fn:toLowerCase()统一转换后再匹配,避免因分类名称大小写不一致导致的匹配失败。
内容的提问来源于stack exchange,提问作者IanCurtis78
相关产品推荐
相关产品推荐

