如果我使用 ui:composite 和 ui:insert、ui:include,是否必须在模板中传递 ui:param?

Do I have to pass ui:param in template if I am using ui:composite and ui:insert, ui:include?

我有一页 main.xhtml,其中包含 ui:composition。此作文使用 template1.xhtml 文件。 template1.xhtml 文件包含指向 template2.xhtml 文件的 ui:insert、ui:include 标签。现在,我想使用从 template2.xhtml.

中的 ui:composition 传递的参数

main.xhtml

<ui:composition template="template1.xhtml">
    <ui:param name="a1" value="val1"/>
</ui:composition>

template1.xhtml

<ui:insert name="header">
    <ui:include src="template2.xhtml">
</ui:insert>

template2.xhtml

<h:panelGroup rendered="#{not empty a1}" layout="block">
    <h4>#{a1}</h4>
</h:panelGroup>

我的问题是我可以直接访问名为 a1 的参数还是必须在 ui:include 中再次传递 ui:param?

取决于 Facelets 版本和 JSF impl/version。

在原始 Facelets 1.x 中,父组合中的任何 <ui:param> 都继承到所有 <ui:include> 个子元素中。

<ui:include src="template2.xhtml" />

在集成到 JSF 2.x 的 Facelets 2.x 中,应该在 <ui:include>(或 <ui:decorate>) 必须显式通过。

<ui:include src="template2.xhtml">
    <ui:param name="a1" value="#{a1}" />
</ui:include>

至少,当您使用 Mojarra 时就是这种情况 2.x。然而,在 MyFaces 2.0 / 2.1 中,没有必要这样做,因为原始的 Facelets 1.x 行为无意中滑入了 MyFaces 2.0 / 2.1。

<ui:include src="template2.xhtml" />

他们已经在 MyFaces 2.2 中修复了它,因此您需要明确地传递它们。

<ui:include src="template2.xhtml">
    <ui:param name="a1" value="#{a1}" />
</ui:include>

如果您使用的是 MyFaces 2.2 或更新版本,并希望保留原始的 Facelets 1.x 行为,那么您可以将以下上下文参数添加到 web.xml

<context-param>
    <param-name>org.apache.myfaces.STRICT_JSF_2_FACELETS_COMPATIBILITY</param-name>
    <param-value>true</param-value>
</context-param>
<ui:include src="template2.xhtml" />

Mojarra 不存在这样的上下文参数,因此如果您希望您的代码在所有 JSF 实现中都以相同的方式工作,则不应依赖此参数。