Java 如何使用JSP c:forEach和c:if过滤最后的条目?

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}

我试图用JSP页面开发一个SpringMVC应用程序,但遇到了一个问题。这与其说是代码问题,不如说是创造力问题,但下面是:

因此,应用程序基本上接收一个配方(字段名称、问题描述、问题解决方案等),并在创建时在其上添加一个ID

我想要的是在头版显示上次创建的3个食谱。我想出了一个代码,显然显示了创建的第一个3个配方:

<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 &raquo</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 &raquo;</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>