回答:
これらのアプローチの違いは何ですか?
メインページレイアウトフラグメントを再利用可能なテンプレートに分割する場合は<ui:composition>
、Faceletテンプレートを使用します(<ui:include>
およびのように<ui:decorate>
)。たとえば、ヘッダー、メニュー、コンテンツ、フッターなど。
例:
コードの重複を防止/最小化するために再利用可能なコンポーネントのグループが必要な場合は、Faceletタグファイルを使用します。たとえば、label + input + messageコンポーネントのグループ。複合コンポーネントとの主な違いは、Faceletタグファイルの出力が単一UIComponent
を表さず、状況によっては、複合コンポーネントでは不十分な場合の唯一の解決策になる場合があります。一般に、マネージドBeanプロパティを渡す(ハードコードされた値ではない)<ui:include>
1つ以上のwith <ui:param>
は、インクルードファイルがタグファイルである可能性が高いことを示しています。
例:
UIComponent
純粋なXMLを使用して単一の責任を持つ単一の再利用可能なカスタムを作成する場合は、複合コンポーネントを使用します。このような複合コンポーネントは通常、既存のコンポーネントやHTMLの集まりで構成され、物理的に単一のコンポーネントとしてレンダリングされ、単一のBeanプロパティにバインドされることになっています。例えば、単一表すコンポーネントjava.util.Date
3つの依存性による<h:selectOneMenu>
コンポーネント、または組み合わせたコンポーネント<p:fileUpload>
と<p:imageCropper>
単一に<my:uploadAndCropImage>
単一のカスタム参照com.example.Image
プロパティとしてエンティティ。
例:
コンポーネントの標準/利用可能なセットでのサポートがないため、Faceletタグファイルまたは複合コンポーネントで機能を実現できない場合は、カスタムコンポーネントを使用してください。例は、PrimeFacesやOmniFacesなどのオープンソースコンポーネントライブラリのソースコードのあらゆる場所にあります。
HTML出力のレンダリングではなく、JSFコンポーネントツリーの構築を制御する場合は、コンポーネントの代わりにタグハンドラーを使用する必要があります。
例:
上記の手法をすべて利用するプロジェクトの例をいくつか示します。
パフォーマンスは異なりますか?
技術的には、パフォーマンスの問題は無視できます。選択は、具体的な機能要件と、実装の抽象化、再利用性、保守性の最終的な度合いに基づいて行う必要があります。それぞれのアプローチには、明確に定義された独自の目的と制限があります。
ただし、複合コンポーネントには、ビューの構築/復元時(特に、ビュー状態の保存/復元時)に大きなオーバーヘッドがあります。また、古いバージョンのMojarraでは、複合コンポーネントにデフォルト値の割り当てに関するパフォーマンスの問題がありました。これは2.1.13以降ですでに修正されています。また、Mojarraでa をメソッド式に使用すると、メモリリークが発生しました<cc:attribute method-signature>
。基本的に、コンポーネントツリー全体がHTTPセッションで再参照されます。これは、2.1.29 / 2.2.8以降で修正されています。メモリリークは、次のように古い2.1バージョンで回避できます。
<context-param>
<param-name>com.sun.faces.serializeServerState</param-name>
<param-value>true</param-value>
</context-param>
または、以下の古い2.2バージョンでは:
<context-param>
<param-name>javax.faces.SERIALIZE_SERVER_STATE</param-name>
<param-value>true</param-value>
</context-param>
それでも、比較的「多くの」複合コンポーネントがあり、にjavax.faces.STATE_SAVING_METHOD
設定したclient
場合、パフォーマンスは面倒になります。単純なインクルードファイルまたはタグファイルですでに可能である基本的な機能だけが必要な場合は、複合コンポーネントを乱用しないでください。*.taglib.xml
タグファイルよりも複合コンポーネントを優先する言い訳として、設定の容易さ(読み取り:ファイルは不要)を使用しないでください。
Mojarra 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以降、およびMyFaces は、がに設定されていない-1
場合のデフォルトになっjavax.faces.PROJECT_STAGE
ていDevelopment
ます。
NamingContainer
。そうしないと、同じコンポーネントが複数回再利用されるときに、IDの重複問題が発生します。
Image
プロパティにのみバインドされます豆。