2009-06-03 10 views
0

Mein Managed Bean:FürJeden und Facelets

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; 
} 

Mein forEach:

<c:forEach var="categorie" items="#{mainControleur.liQuickNav}"> 
    <h:outputLabel value="${categorie}"/> 
</c:forEach> 

Mein Ausgangsstrom:
ich hier bin ...
ich hier bin ...
Ich bin hier ...
Ich bin hier ...

Wie Sie sehen können "getLiQuickNav()" ist 4 mal von meinem ForEach anrufen. Aber ich möchte einfach "getLiQuickNav()" einmal anrufen ... Wie man es nur einmal nennt?

Bonus Frage: Warum "getLiQuickNav()" Anruf 4time ist, während ich nur 3 Item "Tata, Titi, Toto" habe?

Dankten

Antwort

3

Sie können nicht die Anzahl der Zeiten steuern, dass getLiQuickNav() genannt wird - betrachten Sie Ihre Liste das Caching, damit es nicht zwischen den Anrufen wieder aufgebaut wird.

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; 
} 

Neben sollten Sie <ui:repeat/> verwenden, anstatt <c:forEach/>. Sehen Sie diesen blog Eintrag für warum.

+0

Ich denke nicht, dass etwas wie oben ist eine gute Praxis im Allgemeinen. Es gibt keinen Grund für die faule Initialisierung von etwas mit 3 Elementen. Konstruiere die Liste im Konstruktor oder einen statischen Block. – GreenieMeanie

+0

@GreenieMeanie - dies ist offensichtlich ein triviales Beispiel, die Chancen stehen gut, dass die tatsächlichen Listendaten * nicht * für die Objekterstellung oder die statische Blockinitialisierung verfügbar wären (d. H. Wenn sie aus einer externen Quelle wie einer Datenbank gezogen wurde). Die Antwort sollte verdeutlichen, dass das Erstellen der Liste nicht bei jedem Aufruf von getLiQuickNav() erfolgen sollte. – mtpettyp

2

Antwort

Sie jedes Mal den Zustand in einem Getter neu initialisiert. Das soll ein Accessor sein, keine Möglichkeit, den Zustand zu initialisieren. Erstellen Sie die Liste nicht in getLiQuickNav, erstellen Sie sie in einem Konstruktor oder Setter.

Bonus

Das erste Mal, wenn Sie rufen getLiQuickNav() Sie die Liste initialisieren, wird der Verweis auf diese Liste zurückgegeben und in einem Rahmen gespeichert Ihren Ausdruck (.liQuickNav) zu bewerten und dann die getLiQuickNav() vereinbarungs 3 mehr genannt wird Zeiten für jedes Element in der Liste.

Es sollte einmal aufgerufen werden, wenn Sie die gleiche Liste jedes Mal zurückgeben. Du gibst jedes Mal ein neues zurück.

2

Getter in Java (in jedem Kontext, für Faces Managed Beans) sollte nichts generieren - sie sollten nur einen Wert zurückgeben. Erstellen Sie die Liste vorher und geben Sie sie zurück.

Verwandte Themen