首页 > 解决方案 > 如果我使用 ui:composite 和 ui:insert, ui:include,是否必须在模板中传递 ui:param?

问题描述

我有一页 main.xhtml,其中包含 ui:composition。此组合使用 template1.xhtml 文件。template1.xhtml 文件包含指向 template2.xhtml 文件的 ui:insert、ui:include 标记。现在,我想使用从模板 2.xhtml 中的 ui:composition 传递的参数。

main.xhtml

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

模板1.xhtml

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

模板2.xhtml

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

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

标签: jsffacelets

解决方案


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

在最初的 Facelets 1.x<ui:param>中,父组合中的任何内容都被继承到所有<ui:include>子代中。

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

在 JSF 2.x 中集成的 Facelets 2.x 中,任何应该在(or )<ui:param>中重用的父组合都必须显式传递。<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 实现中都以相同的方式工作,则不应依赖此参数。


推荐阅读