JSF 2.0: ¿Por qué un grano de JSF se crean cuando se utiliza en un componente que no se rinde?
-
26-09-2019 - |
Pregunta
Vamos a tener un componente compuesto extremadamente simple:
<cc:implementation>
#{testBean.someField}
</cc:implementation>
haba por él:
public class TestBean {
private boolean someField = false;
public boolean getSomeField() { return someField; }
@PostConstruct
public void init() {
System.out.println("PostConstruct");
}
}
A continuación, llamar como de costumbre, pero no lo demuestran:
<codeEditor:test rendered="#{false}" />
Lo que sucede es que el componente no se rinde y el grano no se inicia, como es de suponer.
Sin embargo, si cambiamos el componente como:
<cc:implementation>
<h:outputText value="#{testBean.someField}" />
</cc:implementation>
Lo que sucede es que el componente todavía nunca se rindió (porque el atributo rendered
es false
), sin embargo, el grano se vuelve a crear instancias. Esto ocurre siempre cuando usamos una propiedad de bean dentro de alguno de los componentes JSF nativa (h:panelGroup
, h:inputHidden
, lo que sea).
¿Por qué es así?
Solución
Los componentes (y todos los granos unidos) se crean durante el tiempo de vista de construcción. El atributo dictada sólo se evalúa durante la visualización en tiempo de renderizado. Siempre ha trabajado de esa manera en JSF.
Si el grano está haciendo un trabajo caro durante la construcción, entonces yo sugeriría que dejar ese trabajo caro depende de la condición alguna que luego reutilización en el atributo prestado.