0

私のマネージド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( )」を 1 回だけ呼び出したくありません。1 回だけ呼び出すにはどうすればよいですか?

おまけの質問: 「tata、titi、toto」の 3 つの項目しかないのに、なぜ「getLiQuickNav( )」は 4 回呼び出されるのですか?

ありがとう

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

答え

毎回ゲッターで状態を再初期化しています。これは、状態を初期化する方法ではなく、アクセサーを意味します。getLiQuickNav でリストを作成しないでください。コンストラクタまたはセッターで作成してください。

ボーナス

最初に呼び出しgetLiQuickNav()てリストを初期化すると、このリストへの参照が返されてスコープに格納され、式 (.liQuickNav) が評価されます。次に、getLiQuickNav()慣例により、リスト内の項目ごとに がさらに 3 回呼び出されます。

毎回同じリストを返す場合は、一度呼び出される必要があります。あなたは毎回新しいものを返しています。

于 2009-06-03T18:06:01.027 に答える
2

Java の Getter は (Faces Managed Bean に含めるために、どのようなコンテキストでも) 何も生成しないでください。値を返すだけです。事前にリストを作成して返却してください。

于 2009-06-03T18:09:14.327 に答える