JSF 2.0: Warum wird ein JSF Bean erstellt, wenn sie in einer Komponente verwendet wird, die nicht wiedergegeben wird?

StackOverflow https://stackoverflow.com/questions/4214457

Frage

haben wir eine extrem einfache Verbundkomponente:

<cc:implementation>
    #{testBean.someField}
</cc:implementation>

Bean für sie:

public class TestBean {

    private boolean someField = false;
    public boolean getSomeField() { return someField; }

    @PostConstruct
    public void init() {
        System.out.println("PostConstruct");
    }

}

Dann nennen Sie es wie üblich es aber nicht zeigen:

<codeEditor:test rendered="#{false}" />

Was passiert, ist, dass die Komponente nie wiedergegeben wird und die Bohne wird nie ausgelöst, wie man es annehmen.

Wenn wir jedoch die Komponente als ändern:

<cc:implementation>
    <h:outputText value="#{testBean.someField}" />
</cc:implementation>

Was passiert, ist, dass die Komponente noch nie gerendert wird (weil das rendered Attribut false ist), jedoch nicht die Bohne instanziiert erhalten. Dies geschieht immer dann, wenn wir eine Bean-Eigenschaft innerhalb einiger nativer JSF-Komponente verwenden (h:panelGroup, h:inputHidden, was auch immer).

Warum ist es so?

War es hilfreich?

Lösung

Die Komponenten (und alle der gebundenen Bohnen) erhalten während Ansicht Bauzeit erstellt. Das gerenderte Attribut wird nur während der Ansicht Renderzeit ausgewertet. Es hat immer funktioniert auf diese Weise in JSF.

Wenn die Bohne einig teure Arbeit während der Bauphase zu tun, dann würde ich vorschlagen lassen, dass teure Arbeit hängt von der bestimmten Bedingung, die Sie dann Wiederverwendung im gerenderten Attribute.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top