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:paramui: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 来代替。仅当它是更大的部分时,例如一个完整的形式,例如它的页眉或页脚应该是可定制的,那么&lt;ui:decorate&gt; 就比较合适了。

&lt;ui:decorate&gt; 的另一个主要优点是它允许您将复合组件与模板一起使用。另见Is it possible to use template with composite component in JSF 2?

【讨论】:

我不明白“用户定义的模板组件”和“现有的和预定义的模板”之间的区别。 在给定的/page.xhtml 示例中,&lt;ui:define&gt; 是最终用户可以定义可变模板组件的地方。 我明白那部分,我只是不明白你所描绘的区别。 无法使用&lt;ui:insert&gt;/&lt;ui:define&gt;更改&lt;ui:include&gt;包含的页面片段。 @Toskan:&lt;ui:composition&gt; 忽略标签之外的任何内容。另请参阅***.com/questions/4792862/… 和 ***.com/questions/10504190/…

以上是关于ui:decorate 和 ui:include 之间真正的概念区别是啥?的主要内容,如果未能解决你的问题,请参考以下文章

P:dataTable 排序在 ui:decorate 中不起作用

JSF ui:include 和 getElementById

是否可以使用ui:在ui中重复:include

如何使用 ui:include 和参数?

何时使用 <ui:include>、标记文件、复合组件和/或自定义组件?

ui:include 的路径无效