首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ForEach和Facelets

ForEach和Facelets
EN

Stack Overflow用户
提问于 2009-06-03 17:58:16
回答 3查看 1.3K关注 0票数 0

我的托管bean:

代码语言:javascript
复制
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:

代码语言:javascript
复制
<c:forEach var="categorie" items="#{mainControleur.liQuickNav}">
    <h:outputLabel value="${categorie}"/>
</c:forEach>

我的输出流:

我在这里..。

我在这里..。

我在这里..。

我在这里..。

如你所见,"getLiQuickNav( )“被我的ForEach调用了4次。但我只想调用"getLiQuickNav( )“一次...如何才能只调用一次?

额外的问题:为什么"getLiQuickNav( )“被调用4次,而我只有3项"tata,titi,toto”?

感谢‘s

EN

回答 3

Stack Overflow用户

发布于 2009-06-03 18:04:53

你不能控制getLiQuickNav()被调用的次数--考虑缓存你的列表,这样它就不会在两次调用之间重新构建。

代码语言:javascript
复制
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条目。

票数 3
EN

Stack Overflow用户

发布于 2009-06-03 18:06:01

回答

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

奖金

第一次调用getLiQuickNav()初始化列表时,对该列表的引用将被返回并存储在一个作用域中以计算表达式(.liQuickNav),然后按照惯例,该getLiQuickNav()将为列表中的每一项再调用3次。

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

票数 2
EN

Stack Overflow用户

发布于 2009-06-03 18:09:14

Java中的Getter(在任何上下文中,包括在Faces托管Beans中)不应该生成任何东西-它们应该只返回一个值。事先创建列表,然后返回。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/946202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档