ForEach和Facelets

时间:2009-06-03 17:58:16

标签: java foreach jstl facelets

我的托管bean:

public List<String> getLiQuickNav(){

    System.out.println("I'm here...");

    List<String> l = new ArrayList<String>();
    l.add("toto");
    l.add("tata");
    l.add("titi");
    return l;
}

我的forEach:

<c:forEach var="categorie" items="#{mainControleur.liQuickNav}">
    <h:outputLabel value="${categorie}"/>
</c:forEach>

我的输出流:
我在这里......
我在这里......
我在这里......
我在这里......

正如你所看到的,“getLiQuickNav()”被我的ForEach调用了4次。但我不想一次打电话给“getLiQuickNav()”...... 如何只召唤一次?

奖金问题: 为什么“getLiQuickNav()”是4次调用,而我只有3item“tata,titi,toto”?

感谢的

3 个答案:

答案 0 :(得分:3)

您无法控制getLiQuickNav()被调用的次数 - 请考虑缓存您的列表,以便不会在调用之间重建。

private List<String> l;

public List<String> getLiQuickNav()
{
     if ( l == null )
     {
          System.out.println("I'm here...");

          l = new ArrayList<String>();
          l.add("toto");
          l.add("tata");
          l.add("titi");
     }
     return l;
}

您也应该使用<ui:repeat/>而不是<c:forEach/>。有关原因,请参阅此blog条目。

答案 1 :(得分:2)

答案

你每次都会在吸气器中重新初始化状态。这意味着是一个访问者,而不是初始化状态的方法。不要在getLiQuickNav中创建列表,在构造函数或setter中创建。

加成

第一次调用getLiQuickNav()初始化列表时,会返回对此列表的引用并将其存储在范围内以评估表达式(.liQuickNav),然后按约定调用getLiQuickNav()列表中的每个项目再多3次。

如果每次都返回相同的列表,它应该被调用一次。你每次都会回来一个新的。

答案 2 :(得分:2)

Java中的Getter(在任何上下文中,包括Faces Managed Beans)都不应生成任何内容 - 它们应该只返回一个值。事先创建列表并将其返回。