JSF 2.0: Perché un fagiolo JSF ottenere creato quando è utilizzato in un componente che non è reso?

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

Domanda

Facciamo un estremamente semplice componente composito:

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

Bean per esso:

public class TestBean {

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

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

}

Poi lo chiamano come al solito, ma non vederlo:

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

Quello che succede è che il componente non viene mai resa e il fagiolo non è mai iniziata come ci si supponga.

Tuttavia, se cambiamo il componente come:

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

Quello che succede è che la componente ancora non viene mai resa (perché l'attributo rendered è false), tuttavia, il fagiolo venga istanziato. Questo accade sempre quando si usa una proprietà di fagioli all'interno di alcune componenti JSF nativa (h:panelGroup, h:inputHidden, a prescindere).

Perché è così?

È stato utile?

Soluzione

I componenti (e tutti i fagioli rilegati) ottenere creato durante il tempo di visualizzazione di compilazione. L'attributo resi viene valutato solo durante la visualizzazione tempo di rendering. Ha sempre lavorato in questo modo in JSF.

Se il bean sta facendo qualche lavoro in corso d'opera costosa, quindi suggerirei di lasciare quel lavoro costoso dipendono dal qualche condizione che poi riutilizzare l'attributo resa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top