Jsf 2 为什么ui:Include行为随bean作用域的不同而不同?

Jsf 2 为什么ui:Include行为随bean作用域的不同而不同?,jsf-2,cdi,Jsf 2,Cdi,我最近一直在修补ui:include,发现它的许多行为都相当古怪。经过一些测试之后,在我看来,这些怪癖与返回到ui:include如何适应jsf生命周期的问题有关。我正试图更好地理解这个框架,不知道是否有人能帮助我理解正在发生的事情 以以下为例: index.xhtml <h:panelGrid id="testInclude"> <ui:include src="#{bean.pageTarget}.xhtml" /> </h:panelGrid>

我最近一直在修补ui:include,发现它的许多行为都相当古怪。经过一些测试之后,在我看来,这些怪癖与返回到ui:include如何适应jsf生命周期的问题有关。我正试图更好地理解这个框架,不知道是否有人能帮助我理解正在发生的事情

以以下为例:

index.xhtml

<h:panelGrid id="testInclude">
    <ui:include src="#{bean.pageTarget}.xhtml" />
</h:panelGrid>
pageA.xhtml

<ui:composition>
    <h:outputText value="You are on page: #{bean.pageTarget}" />
</ui:composition>

第一次呈现页面时,将创建两个bean实例。这与pageA中存在对bean的引用直接相关。根据BalusC之前的一个答案,这可能与处理ui:include的时间有关:


奇怪的是,将bean更改为使用CDI的对话范围实际上解决了这个问题。有人知道这是为什么吗?

试试下面的方法(我还没有测试过,但如果它有效,我会给出答案):
$
开头的表达式由Facelets引擎计算,就像
一样,而以
开头的表达式则在JSF生命周期中处理。关于
@ConversationScoped
bean的不同之处,我无法提供任何线索。很有趣!它确实解决了一个我没有提到的问题(表单元素在通过ajax重新呈现ui:include时将用于标识自己的隐藏字段数据丢弃到会话中)。尝试以下操作(我还没有测试过,但如果它有效,我会给出答案):
$
开头的表达式由Facelets引擎计算,原样是
,而以
#
开头的表达式是在JSF生命周期中处理的。关于
@ConversationScoped
bean的不同之处,我无法提供任何线索。很有趣!它确实解决了一个我没有提到的问题(表单元素在通过ajax重新呈现ui:include时,将用于标识自己的隐藏字段数据放到会话中)。
<ui:composition>
    <h:outputText value="You are on page: #{bean.pageTarget}" />
</ui:composition>