_ui:decorate
_が機能的に_ui:include
_と機能的に同じであるということを私が以前に感じましたが、インクルードファイルに_ui:param
_と_ui:define
_を渡すこともできます。
私は狂っていますか?
EDIT:実際に_ui:param
_を_ui:include
_ファイルに渡すこともできますが、私はすでにそれを実行していることがわかります。 _ui:define
_も渡すことができます。ここで確認して編集します。
<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の複合コンポーネントでテンプレートを使用することは可能ですか?