24

它发生在我之前,除了你也可以传递和传递给包含的文件之外,它ui:decorate在功能上是相同的。ui:includeui:paramui:define

我疯了吗?

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

4

1 回答 1

54

<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>

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

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

于 2012-05-28T21:52:23.820 回答