让我们有一个非常简单的复合组件:
<cc:implementation>
#{testBean.someField}
</cc:implementation>
Bean for it:
public class TestBean {
private boolean someField = false;
public boolean getSomeField() { return someField; }
@PostConstruct
public void init() {
System.out.println("PostConstruct");
}
}
然后像往常一样调用它但不显示它:
<codeEditor:test rendered="#{false}" />
发生的事情是组件永远不会被渲染,并且bean永远不会像人们想象的那样被启动。
但是,如果我们将组件更改为:
<cc:implementation>
<h:outputText value="#{testBean.someField}" />
</cc:implementation>
发生的事情是组件仍然永远不会被渲染(因为rendered
属性是false
),但是bean确实被实例化了。当我们在一些本机JSF组件(h:panelGroup
,h:inputHidden
,无论如何)中使用bean属性时,总会发生这种情况。
为什么会这样?
答案 0 :(得分:6)
在视图构建期间创建组件(以及所有绑定的bean)。渲染属性仅在视图渲染时评估。它一直在JSF中以这种方式工作。
如果bean在构建期间做了一些昂贵的工作,那么我建议让那个昂贵的工作依赖于你在渲染属性中重用的某些条件。