ui:decorate和ui:include之间真正的概念差异是什么?

use*_*421 23 jsf facelets

它发生前我ui:decorate在功能一样ui:include,只是你也可以通过ui:paramui:define被包含文件.

我疯了吗?

编辑:虽然事实上你也可以传递ui:param给一个ui:include文件,但事实证明我已经在做了.也许你也可以通过ui:define,我会在这里检查和编辑.

Bal*_*usC 48

<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>
Run Code Online (Sandbox Code Playgroud)

/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>
Run Code Online (Sandbox Code Playgroud)

请注意,它在面板网格的每个单元格中很好地呈现组件.同样,这个特殊的例子非常笨拙,我只是使用了一个标记文件.只有当它是一个更大的部分,例如整个形式,例如其页眉或页脚应该是可定制的,那么<ui:decorate>本来是合适的.

另一个主要优点<ui:decorate>是它允许您将复合组件与模板一起使用.另请参见JSF 2中是否可以使用带有复合组件的模板?

  • 我不明白"用户定义的模板组件"和"现有的和预定义的模板"之间的区别. (3认同)
  • 使用`<ui:insert>`/`<ui:define>`更改`<ui:include>`包含的页面片段是不可能的. (3认同)
  • @Toskan:`<ui:composition>`忽略标签之外的任何内容.另见http://stackoverflow.com/questions/4792862/how-to-include-another-xhtml-in-xhtml-using-jsf-2-0-facelets/4793959#4793959和http://stackoverflow.com/问题/ 10504190/IS-有-A-方式可以运行-A-JSF页面,而无需建设最全的项目/ 10504830#10504830 (2认同)