85

FaceletsでJSF 2.0を使い始めましたが、既存の<ui:include>やFacelets 1.xで提供されているその他のテンプレート技術を知っている新しい複合コンポーネントに困惑しました。<ui:include>を使用する場合は、ファイル、コンポジットコンポーネント、カスタムコンポーネントのいずれかにタグを付けますか?

これらのアプローチの違いは何ですか?機能的には、彼らはほぼ同じように提供するようだ:<ui:param><cc:attribute><ui:insert> + <ui:define>対既存のテンプレートの再利用。コンポジットコンポーネントの場合、シンタックスと明確なインタフェース仕様の他に何かがありますか?パフォーマンスは異なるでしょうか?

答えて

152

これらのアプローチの違いは何ですか?

にfaceletテンプレート

使用にfaceletテンプレートあなたは再利用可能なテンプレートにメインページレイアウトフラグメントを分割したい場合(<ui:composition><ui:include><ui:decorate>のように)。例えば。ヘッダ、メニュー、コンテンツ、フッター、等

例:

Faceletタグファイル

コードの重複を防止/最小化するためにコンポーネントの再利用可能なグループを使用する場合は、Faceletタグファイルを使用します。例えば。ラベル+入力+メッセージコンポーネントのグループコンポジットコンポーネントの主な違いは、Faceletタグファイルの出力が単一のUIComponentを表しておらず、場合によっては複合コンポーネントでは不十分な場合の唯一の解決策かもしれないことです。一般に、<ui:include>と1つ以上の<ui:param>とを有することは、インクルードファイルがタグファイルであることがより良いことを示す信号である。

例:

複合コンポーネント

使用するC純粋なXMLを使用して1つの責任で単一の再利用可能なカスタムUIComponentを作成する場合は、コンポーネントを除外します。そのような複合コンポーネントは、通常、既存のコンポーネントやHTMLの束から構成され、物理的に単一のコンポーネントとしてレンダリングされ、単一のBeanプロパティにバインドされているはずです。例えば。または3つの依存性のある成分によって単一の性質を表す成分、または特性として単一の項目に単一の成分として組み合わされた成分である、請求項1に記載の組成物。

例:

カスタムコンポーネント

機能があるため部品の標準/利用できるセットでのサポートの欠如のため、にfaceletタグファイルまたは複合部品では達成できない時はいつでもカスタムコンポーネントを使用してください。例は、PrimeFacesおよびOmniFacesなどのオープンソースコンポーネントライブラリのソースコードのすべての場所で見つけることができます。

タグハンドラ

あなたはHTML出力のJSFコンポーネント・ツリーの建物の代わりにレンダリングを制御したい

は、あなたはコンポーネントの代わりにタグハンドラを使用する必要があります。

例:

例ここ

をsているプロジェクト上記のすべての技術を活用したサンプルプロジェクト。


パフォーマンスは異なる可能性がありますか?

技術的には、パフォーマンスの問題はごくわずかです。選択は、具体的な機能要件と、実装の抽象度、再利用可能性および保守性の最終的な程度に基づいて行われる必要があります。それぞれのアプローチには、明確な目的と限界があります。

しかし、コンポジットコンポーネントは、ビューの作成/復元中に(具体的には、ビューステートの保存/復元中に)かなりのオーバーヘッドがあります。 Mojarraの古いバージョンでは、コンポジットコンポーネントのデフォルト値の割り当てに関するパフォーマンス上の問題がありましたが、これは2.1.13以降ですでに修正されています。また、<cc:attribute method-signature>がメソッド式に使用されている場合、Mojarraはmemory leakでしたが、基本的にHTTPセッションでコンポーネントツリー全体が再参照されます。これは2.1.29/2.2.8以降で修正されています。

<context-param> 
    <param-name>com.sun.faces.serializeServerState</param-name> 
    <param-value>true</param-value> 
</context-param> 

または、下記のように、古い2.2バージョンでは:メモリリークが以下のように古い2.1バージョンでバイパスすることができますが、複合コンポーネント、比較的「の多くを」持っているとき、まだ

<context-param> 
    <param-name>javax.faces.SERIALIZE_SERVER_STATE</param-name> 
    <param-value>true</param-value> 
</context-param> 

、およびjavax.faces.STATE_SAVING_METHODclientに設定されていると、パフォーマンスが低下します。単純なインクルードファイルまたはタグファイルで既に可能な基本機能をほんの欲しければ、複合コンポーネントを乱用しないでください。タグファイルよりも複合コンポーネントを優先させる理由として、構成の容易さ(read:no *.taglib.xmlファイルが必要です)を使用しないでください。

クロサギ科2.2.10以前を使用する場合は、生産モードのための比較的短いFaceletsのリフレッシュ期間を無効にすることを忘れないでください:

<context-param> 
    <param-name>javax.faces.FACELETS_REFRESH_PERIOD</param-name> 
    <param-value>-1</param-value> 
</context-param> 

は、そうでなければ、再起動しましたが、開発のために、この設定を使用しないでくださいFaceletsファイルの変更を反映させるためにサーバー全体が! Mojarra 2.2.11以降、javax.faces.PROJECT_STAGEDevelopmentに設定されていない場合、MyFacesの既定値は-1です。

+0

なぜ3(faceletタグファイル)と言うのではなく、1つのコンポーネント(複合コンポーネント)をレンダリングしたいのですか?私は晴れた日に、3の代わりに1のように感じるかもしれません...しかし、私はそれの後ろに何かがあると思います。あなたの例では、UINamingContainerを拡張しています...それはccのために行く理由の1つであることでしょう(そうすれば、いくつかのjsf実装の特定の関数を上書きできるようになります)? – Toskan

+2

タグファイルは、インクルードの一種と見なすべきです。コンポジットコンポーネントは、実際のコンポーネントと見なす必要があります。複合コンポーネント**には 'NamingContainer'を実装する必要があります。そうしないと、同じコンポーネントが複数回再利用されたときに重複IDの問題が発生します。 – BalusC

+0

@BalusC私はアドレスと(そのすべての属性:ストリート、番号、都市など)を追加または削除できる「ブロック」を作成するHTMLとJSFの束を持っているとしましょう。私は2〜3ページで同じブロックを使用する必要があります。コンポジットコンポーネントの記述には該当しますか? – RinaldoPJr

関連する問題