Java 如何使用JSP c:forEach和c:if过滤最后的条目?
我试图用JSP页面开发一个SpringMVC应用程序,但遇到了一个问题。这与其说是代码问题,不如说是创造力问题,但下面是: 因此,应用程序基本上接收一个配方(字段名称、问题描述、问题解决方案等),并在创建时在其上添加一个ID 我想要的是在头版显示上次创建的3个食谱。我想出了一个代码,显然显示了创建的第一个3个配方:Java 如何使用JSP c:forEach和c:if过滤最后的条目?,java,jsp,spring-mvc,jstl,Java,Jsp,Spring Mvc,Jstl,我试图用JSP页面开发一个SpringMVC应用程序,但遇到了一个问题。这与其说是代码问题,不如说是创造力问题,但下面是: 因此,应用程序基本上接收一个配方(字段名称、问题描述、问题解决方案等),并在创建时在其上添加一个ID 我想要的是在头版显示上次创建的3个食谱。我想出了一个代码,显然显示了创建的第一个3个配方: <c:forEach var="recipe" items='${recipes}'> <c:if test="${recipe.id < 4}
<c:forEach var="recipe" items='${recipes}'>
<c:if test="${recipe.id < 4}
<div class="span4">
<h3<c:out value="${recipe.inputDescProb}"></c:out></h3>
<p><c:out value="${recipe.inputDescSol}"></c:out></p>
<p><a class="btn" href="/recipes/${recipe.id}">Details »</a></p>
</div>
</c:if>
</c:forEach>
您可以使用${fn:length(recipes)}
:
使用fn:length()
EL函数计算配方总数。在使用任何EL函数之前
我们还需要导入必要的标记库
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
EDIT:使用LoopTagStatus
类的count
属性访问EL中迭代计数器的当前值,即${varStatusVar.count}
无需检查长度,只需使用varStatus
变量的.last
属性即可
<c:forEach var="recipe" items="${recipes}" varStatus="status">
<c:if test="${not status.last}">
Last Item
</c:if>
<c:forEach>
最后一项
旁注,您还可以获取。first
和count
您这样做是因为您使用ajax或类似的方法检索receipes列表(再一次)?不,不是使用ajax。目前,它只是通过本地映射实现的本地,没有持久性。我尝试了一下,得到了/WEB-INF/jsp/home.jsp(31,30)PWC6287:属性前缀fn与任何导入的标记库都不对应第30行:
(没关系)第31行:
我需要导入什么才能让它工作?varStatus
属性使用不正确。它应该在c:forEach>
中使用。请参阅我的答案了解详细信息。好的,我导入了JSTL函数,但仍然得到了PWC6131:Attribute varStatus invalid for tag set,根据TLD
,它引用了
(我认为上面的注释总结了它-如果可以的话,正确的用法是什么?),我只涉及这些JSTL方法的基础,我了解了它们的工作原理。不过我还是有个错误。当我加载没有条目的页面时,它加载得很好。但当我输入一个或多个食谱并返回主页时,我明白了:无法转换javax.servlet.jsp.jstl.core.LoopTagSupport$1Status@ffed1d类javax.servlet.jsp.jstl.core.LoopTagSupport$1Status到类java.lang.Long
我猜问题出在For循环上?使用count
属性并在${recipeCounter.count>(totalRecipes-3)中插入括号避免运算符优先级的副作用。
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<c:set var="totalRecipes" value="${fn:length(recipes)}" />
<c:forEach var="recipe" items='${recipes}' varStatus="recipeCounter">
<c:if test="${recipeCounter.count > (totalRecipes - 3)}">
<div class="span4">
<h3<c:out value="${recipe.inputDescProb}"></c:out></h3>
<p><c:out value="${recipe.inputDescSol}"></c:out></p>
<p><a class="btn" href="/recipes/${recipe.id}">Details »</a></p>
</div>
</c:if>
</c:forEach>
<c:forEach var="recipe" items="${recipes}" varStatus="status">
<c:if test="${not status.last}">
Last Item
</c:if>
<c:forEach>