7

JSF テンプレートと複合コンポーネントの適切な使用法についてはまだよくわかりません。多くのページを持つエンタープライズ Web アプリケーションを作成する必要があります。すべてのページには、同じヘッダー、メニュー、フッター、そしてもちろん異なるコンテンツ (= JSF テンプレート) があります。すべてのページのコンテンツは、再利用可能な「ボックス」(= JSF 複合コンポーネント) で構成されます。ボックスは、いくつかのフィールド、ボタンなどで構成されています。私のソリューションは適切ですか? または、カスタム コンポーネント、装飾などの他のテクノロジを使用する必要がありますか?

レイアウト.xhtml

<h:body>
    <ui:insert name="main_menu">
        <ui:include src="/xhtml/template/main_menu.xhtml"/>
    </ui:insert>
    <ui:insert name="header">
        <ui:include src="/xhtml/template/header.xhtml"/>
    </ui:insert>
    <ui:insert name="content"/>
    <ui:insert name="footer">
        <ui:include src="/xhtml/template/footer.xhtml"/>
    </ui:insert>
</h:body>

customer_overview.xhtml:

<html xmlns:cc="http://java.sun.com/jsf/composite/composite_component">
<h:body>
    <!-- Facelet template -->
    <ui:composition template="/xhtml/template/layout.xhtml">
        <ui:define name="content">
            <!-- Composite Components -->
            <cc:component_case_history
                caseList="#{customerOverviewController.cases}"
            />
            <cc:component_customer
                ....
            />
            ...
        </ui:define>
    </ui:composition>
</h:body>

component_case_history.xhtml

<html xmlns:composite="http://java.sun.com/jsf/composite">
<composite:interface>
    <composite:attribute name="cases" type="java.util.List"/>
</composite:interface>

<composite:implementation>
    <!-- using of "cases" -->
    ...
</composite:implementation>

CustomerOverviewController.java

@ManagedBean
@ViewScoped
public class CustomerOverviewController {
    public List<Case> getCases() {
        ...
    }
}

編集 2012-04-27

根拠: <ui:include>、タグ ファイル、複合コンポーネント、および/またはカスタム コンポーネントをいつ使用するか?

Facelet テンプレート + Composite コンポーネントではなく、むしろ Facelet テンプレート + Facelet タグ ファイルを使用する必要があると思います。

4

1 に答える 1

6

レイアウト、テンプレート

レイアウト.xhtml:

すべてのページに同じヘッダー、メニュー、フッターが含まれます...

この場合、ヘッダー、メニュー、フッターの ui:insert タグを省略できます。

<h:body>
    <ui:include src="/xhtml/template/main_menu.xhtml"/>
    <ui:include src="/xhtml/template/header.xhtml"/>
    <ui:insert name="content"/>
    <ui:include src="/xhtml/template/footer.xhtml"/>
</h:body>

名前のない ui:insert を使用することもできるため、さらに単純化するには:

<h:body>
    <ui:include src="/xhtml/template/main_menu.xhtml"/>
    <ui:include src="/xhtml/template/header.xhtml"/>
    <ui:insert/>
    <ui:include src="/xhtml/template/footer.xhtml"/>
</h:body>

customer_overview.xhtml:

layout.xhtml に名前のない ui:insert がある場合、ここでは ui:define は必要ありません。

<ui:composition template="/xhtml/template/layout.xhtml">
        <!-- Composite Components -->
        <cc:component_customer/>
        <cc:component_case_history
            caseList="#{customerOverviewController.cases}"
        />
        ...
</ui:composition>

また、ユーザーが直接アクセスできないフォルダー (WEB-INF) にテンプレートを配置する必要があります。

再利用可能な「ボックス」

複合コンポーネントの 1 つが次のようになります。

<cc:component_customer/>

属性のないコンポーネントは非常に疑わしいです。

  • それは何をするためのものか?
  • ユーザー名を表示しますか?
  • 属性を渡さない場合、どのようにユーザー名を取得しますか?

他の再利用可能なパーツは代わりに ui:insert を使用するため、コンポーネントは自己完結型である必要があります。

于 2012-04-08T10:42:52.893 に答える