我的托管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”?
感谢的
答案 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)都不应生成任何内容 - 它们应该只返回一个值。事先创建列表并将其返回。