jsf - 如果我使用 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?
解决方案
取决于 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 实现中都以相同的方式工作,则不应依赖此参数。
推荐阅读
- google-kubernetes-engine - 如何从 GKE 执行 kubelet
- jsf - 替换为 p:dataTable
- sql - 通过 source() 调用 R 中的 sqlQuery 失败
- android - 如何在 NestedScrollView 中将 FirestorePagingAdapter 用于 RecyclerView
- javascript - 获取 ajax 内容的表上的数据表
- unit-testing - 开玩笑如何检查异步响应
- jquery - 如何过滤掉javascript中的特殊字符
- javascript - 刷新图像而不重新加载页面
- powerpivot - 不同时期内拥有多名销售人员的独特商店小计
- r - 为线性回归创建循环