0

我的托管豆:

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 次,而我只有 3 项“tata,titi,toto”?

谢谢

4

3 回答 3

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/>. 请参阅此博客条目了解原因。

于 2009-06-03T18:04:52.727 回答
2

回答

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

奖金

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

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

于 2009-06-03T18:06:01.027 回答
2

Java 中的 Getter(在任何情况下,包括 Faces Managed Beans)不应该生成任何东西——它们应该只返回一个值。事先创建列表并将其返回。

于 2009-06-03T18:09:14.327 回答