【问题标题】:Break out of a forEach loop in JSP/JSTL打破 JSP/JSTL 中的 forEach 循环
【发布时间】:2014-03-24 02:53:34
【问题描述】:

我有一组具有某些属性的对象。一个属性只能是Type1Type2 两种类型。

我要做的就是检查一个对象是否具有Type1 的属性。

我正在使用以下代码:

<c:set var="properties" value="${obj.getProperties()}"/>
<c:set var="hasPropertyOfType1" value="false"/>
<c:forEach var="i" begin="0" end="${fn:length(properties) - 1}">
    <c:if test="${properties.get(i).isOfType1() eq true}">
        <c:set var="hasPropertyOfType1" value="true"/>
    </c:if>
</c:forEach>

上面的代码实现了我想要的,但是效率非常低,因为一个对象可能拥有的属性数量非常多。

所以我的问题是,一旦我将hasPropertyOfType1 设置为等于true,如何跳出forEach 循环。

我想到的一些方法,但我不知道如何实现(或者它们甚至可能)是:

1:在 forEach 循环中添加一个条件来停止循环。
2:将循环内的索引值增加到大于fn:length(properties)的值。
3:尽可能使用break语句。

我已经搜索了很多,但仍然无法弄清楚这一点。提前致谢。

【问题讨论】:

  • 你为什么不做正确的事并在你的对象中添加一个方法boolean isPropertyOfType1Present()
  • @JBNizet 这本来是理想的情况,但不幸的是,该代码不在我的控制之下,据我所知,目前无法更改。
  • 你不能将它包装在你自己的对象中,它会提供这种方法吗?或者只是在控制器中计算它并将其添加为请求属性?这应该在 Java 中完成,而不是在 JSTL 中。
  • @JBNizet 我同意这应该在 Java 中完成,但是与添加一个简单的 break 语句相比,这需要付出很多努力。展望未来,我也许可以添加isPropertyOfType1Present(),但现在我想要一个临时解决方法。
  • @JBNizet 这不是不好的做法,因为我们应该将演示代码与业务逻辑分开?

标签: jsp jstl


【解决方案1】:

JSTL 标记用于迭代集合。 它不是为了搜索集合。

您也可以将&lt;c:choose&gt;&lt;c:when&gt;&lt;c:otherwise&gt; 一起使用 这是一个例子。 你也可以使用很多

<c:forEach 
      var="List"
      items="${requestScope.DetailList}" 
      varStatus="counter"
      begin="0">

      <c:choose>
         <c:when test="${List.someType == 'aaa' || 'AAA'}">
           <!-- continue -->
         </c:when>
         <c:otherwise>
            Do something...     
         </c:otherwise>
      <c:choose>
    </c:forEach>

希望我能有所帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多