我的托管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次,而我只有3项"tata,titi,toto”?
感谢‘s
发布于 2009-06-03 18:04:53
你不能控制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条目。
发布于 2009-06-03 18:06:01
回答
您每次都会在getter中重新初始化状态。这意味着它是一个访问器,而不是一种初始化状态的方法。不要在getLiQuickNav中创建列表,而是在构造函数或设置器中创建。
奖金
第一次调用getLiQuickNav()初始化列表时,对该列表的引用将被返回并存储在一个作用域中以计算表达式(.liQuickNav),然后按照惯例,该getLiQuickNav()将为列表中的每一项再调用3次。
如果你每次都返回相同的列表,它应该被调用一次。你每次都会返回一个新的。
发布于 2009-06-03 18:09:14
Java中的Getter(在任何上下文中,包括在Faces托管Beans中)不应该生成任何东西-它们应该只返回一个值。事先创建列表,然后返回。
https://stackoverflow.com/questions/946202
复制相似问题