我一直在修补ui:最近包含并且发现它在许多行为中都相当古怪。经过一些测试后,在我看来,这些问题与这些问题有关,可以追溯到ui:include适合jsf生命周期。我正在努力更好地掌握这个框架,并想知道是否有人可以帮助我了解正在发生的事情。
采用以下示例:
的index.xhtml
<h:panelGrid id="testInclude">
<ui:include src="#{bean.pageTarget}.xhtml" />
</h:panelGrid>
bean(ManagedBean,SessionScoped)
public String getPageTarget() { return "pageA"; }
@PostConstruct
public void init() { System.out.println("new bean created"); }
pageA.xhtml
<ui:composition>
<h:outputText value="You are on page: #{bean.pageTarget}" />
</ui:composition>
首次呈现页面时,会创建两个bean实例。这与pageA中对bean的引用直接相关。基于BalusC之前的答案之一,这可能与ui:include处理时有关:dynamic ui:include with el-expression?
好奇的是,更改bean以使用CDI的会话范围实际上摆脱了这个问题。有谁知道为什么这有效?