What is the real conceptual difference between ui:decorate and ui:include?

后端 未结 1 512
猫巷女王i
猫巷女王i 2020-11-30 22:33

It occurs ago me that ui:decorate is functionally the same as ui:include except that you can also pass ui:param and ui:define

相关标签:
1条回答
  • 2020-11-30 23:04

    The main difference between <ui:include> and <ui:decorate> is that the <ui:decorate> is intended to allow insertion of user-defined template components, while the <ui:include> is intended to include an existing and already-predefined template.

    This indeed means that the <ui:decorate> supports <ui:define> for user-defined template components in its body and can insert it at the <ui:insert> place inside the template.

    Here's a -somewhat clumsy- example to show where it can be used:

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

    Note that it renders the components nicely in each cell of the panel grid. Again, this particular example is pretty clumsy, I'd just have used a tag file instead. Only if it was a larger section, e.g. a whole form whose e.g. its header or footer should be customizable, then an <ui:decorate> would have been appropriate.

    Another major advantage of <ui:decorate> is that it allows you to use a composite component with a template. See also Is it possible to use template with composite component in JSF 2?

    0 讨论(0)
提交回复
热议问题