JSP<c:forEach>循环问题:如何避免末尾多余的//分隔符
哈哈,这个问题我太熟悉了——用循环加分隔符的时候,最后那多余的符号真的很闹心!给你几个实用的解决办法,挑适合你环境的用:
方法1:利用<c:forEach>的varStatus属性(最推荐)
这是JSTL原生支持的方案,简单直接,兼容性拉满。通过varStatus对象的last属性判断当前是不是最后一次迭代,只有非最后一项才输出分隔符:
<c:forEach var="port" items="${container.ports}" varStatus="status"> ${port.privatePort} → ${port.publicPort} <%-- 仅当不是最后一项时添加分隔符 --%> <c:if test="${!status.last}"> // </c:if> </c:forEach>
varStatus还提供了first、index等属性,日常循环里经常能用到,非常实用。
方法2:EL 3.0+ 结合fn:join(简洁优雅)
如果你的项目用的是Servlet 3.1+容器(比如Tomcat 8及以上),支持EL 3.0的话,可以用流式API把每个port转成字符串,再用fn:join拼接,一行搞定:
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> ${fn:join(container.ports.stream().map(p -> p.privatePort + ' → ' + p.publicPort).toList(), ' // ')}
这种写法代码更简洁,不用写循环结构,但需要确保容器支持Java 8+和EL 3.0。
方法3:老版本容器兼容方案(繁琐但可靠)
如果你的环境比较老,不支持varStatus.last或者EL 3.0,可以先循环前n-1个元素并加分隔符,最后单独输出最后一个元素:
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> <c:if test="${not empty container.ports}"> <%-- 循环到倒数第二个元素 --%> <c:forEach var="port" items="${container.ports}" varStatus="status" end="${fn:length(container.ports)-2}"> ${port.privatePort} → ${port.publicPort} // </c:forEach> <%-- 单独输出最后一个元素 --%> ${container.ports[fn:length(container.ports)-1].privatePort} → ${container.ports[fn:length(container.ports)-1].publicPort} </c:if>
这个方案兼容性最好,但代码相对繁琐,适合没办法升级容器的场景。
个人最推荐方法1,代码直观易懂,不用额外依赖,几乎所有支持JSTL的项目都能直接用~
内容的提问来源于stack exchange,提问作者qweq
相关产品推荐
相关产品推荐

