JSF 2.0: Perché un fagiolo JSF ottenere creato quando è utilizzato in un componente che non è reso?
-
26-09-2019 - |
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ì?
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.