web-dev-qa-db-ja.com

ui:decorateとui:includeの実際の概念的な違いは何ですか?

_ui:decorate_が機能的に_ui:include_と機能的に同じであるということを私が以前に感じましたが、インクルードファイルに_ui:param_と_ui:define_を渡すこともできます。

私は狂っていますか?

EDIT:実際に_ui:param_を_ui:include_ファイルに渡すこともできますが、私はすでにそれを実行していることがわかります。 _ui:define_も渡すことができます。ここで確認して編集します。

21
user207421

<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>のもう1つの大きな利点は、テンプレートで複合コンポーネントを使用できることです。参照 JSF 2の複合コンポーネントでテンプレートを使用することは可能ですか?

49
BalusC