ui:decorate 和 ui:include 之间真正的概念区别是啥?
Posted
技术标签:
【中文标题】ui:decorate 和 ui:include 之间真正的概念区别是啥?【英文标题】:What is the real conceptual difference between ui:decorate and ui:include?ui:decorate 和 ui:include 之间真正的概念区别是什么? 【发布时间】:2012-06-02 10:22:35 【问题描述】:我之前发现ui:decorate
在功能上与ui:include
相同,只是您还可以将ui:param
和ui:define
传递给包含的文件。
我疯了吗?
编辑:虽然实际上您也可以将ui:param
传递给ui:include
文件,但事实证明我已经在这样做了。也许你也可以传递一个ui:define
,我会在这里检查和编辑。
【问题讨论】:
我不确定我是否理解您的具体问题。所以我会说,是的,你疯了:) @BalusC 我可能确实疯了,但我并不是在陈述一个具体的问题,只是一个一般原则。我一直在试图弄清楚这两种结构之间存在什么实际差异,但我找不到任何东西。可能 ui:include 不支持 ui:define,我在测试时遇到了其他问题。 啊,你只是在问概念上的差异吗? @BalusC 如果有的话 ;-) 我知道 ui:decorate 在概念上是“用于”模板而不是包含文件,但在实现方面,在我看来完全一样。ui:include
没有模板开销,因此如果您只需要“只是”一个包含,理论上效率会更高。
【参考方案1】:
<ui:include>
和<ui:decorate>
之间的主要区别在于<ui:decorate>
旨在允许插入用户定义的模板组件,而<ui:include>
旨在包含现有的和已经预定义的模板。
这确实意味着<ui:decorate>
在其主体中支持<ui:define>
用户自定义模板组件,并且可以将其插入到模板内的<ui:insert>
位置。
这是一个有点笨拙的例子来说明它可以在哪里使用:
/WEB-INF/templates/field.xhtml
<ui:composition
xmlns="http://www.w3.org/1999/xhtml"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
>
<h:outputLabel for="#id" value="#label" />
<ui:insert name="input" />
<h:message id="#id_message" for="#id" />
</ui:composition>
/page.xhtml
<h:panelGrid columns="3">
<ui:decorate template="/WEB-INF/templates/field.xhtml">
<ui:param name="label" value="Foo" />
<ui:param name="id" value="foo" />
<ui:define name="input">
<h:inputText id="foo" value="#bean.foo" required="true" />
</ui:define>
</ui:decorate>
<ui:decorate template="/WEB-INF/templates/field.xhtml">
<ui:param name="label" value="Bar" />
<ui:param name="id" value="bar" />
<ui:define name="input">
<h:selectBooleanCheckbox id="bar" value="#bean.bar" required="true" />
</ui:define>
</ui:decorate>
...
</h:panelGrid>
请注意,它可以很好地呈现面板网格的每个单元格中的组件。同样,这个特定的例子非常笨拙,我只需要使用tag file 来代替。仅当它是更大的部分时,例如一个完整的形式,例如它的页眉或页脚应该是可定制的,那么<ui:decorate>
就比较合适了。
<ui:decorate>
的另一个主要优点是它允许您将复合组件与模板一起使用。另见Is it possible to use template with composite component in JSF 2?
【讨论】:
我不明白“用户定义的模板组件”和“现有的和预定义的模板”之间的区别。 在给定的/page.xhtml
示例中,<ui:define>
是最终用户可以定义可变模板组件的地方。
我明白那部分,我只是不明白你所描绘的区别。
无法使用<ui:insert>
/<ui:define>
更改<ui:include>
包含的页面片段。
@Toskan:<ui:composition>
忽略标签之外的任何内容。另请参阅***.com/questions/4792862/… 和 ***.com/questions/10504190/…以上是关于ui:decorate 和 ui:include 之间真正的概念区别是啥?的主要内容,如果未能解决你的问题,请参考以下文章
P:dataTable 排序在 ui:decorate 中不起作用
JSF ui:include 和 getElementById