JSF 2.0: Pourquoi se crée un haricot JSF quand il est utilisé dans un composant qui n'est pas rendu?
-
26-09-2019 - |
Question
Ayons une composante composite extrêmement simple:
<cc:implementation>
#{testBean.someField}
</cc:implementation>
Bean pour elle:
public class TestBean {
private boolean someField = false;
public boolean getSomeField() { return someField; }
@PostConstruct
public void init() {
System.out.println("PostConstruct");
}
}
Ensuite, appelez comme d'habitude, mais ne montrent pas:
<codeEditor:test rendered="#{false}" />
Qu'est-ce qui se passe est que le composant est jamais rendu et le haricot est jamais lancé comme on suppose.
Cependant, si l'on change le composant comme:
<cc:implementation>
<h:outputText value="#{testBean.someField}" />
</cc:implementation>
Qu'est-ce qui se passe est que le composant obtient toujours jamais rendu (parce que l'attribut rendered
est false
), cependant, le haricot ne soit instancié. Cela se produit toujours lorsque nous utilisons une propriété de haricots dans certains composants JSF natif (h:panelGroup
, h:inputHidden
, peu importe).
Pourquoi est-il?
La solution
Les composants (et tous les haricots liés) sont créées pendant la construction de la vue. L'attribut rendu est évaluée uniquement pendant la vue du rendu. Il a toujours travaillé de cette façon dans JSF.
Si le grain est en train de faire un certain travail coûteux pendant la construction, alors je vous suggère de laisser ce travail coûteux dépendent de la certaine condition que vous réutiliser ensuite dans l'attribut rendu.