Правильное использование шаблонов Facelet и составных компонентов

Я до сих пор не уверен в правильном использовании шаблонов JSF и составных компонентов. Мне нужно создать корпоративные веб-приложения, в которых будет много страниц. Каждая страница будет иметь один и тот же верхний колонтитул, меню, нижний колонтитул и, конечно, разный контент (= шаблон JSF). Содержимое на каждой странице будет состоять из многократно используемых "блоков" (= составные компоненты JSF). Коробки состоят из нескольких полей, кнопок и т. Д. Правильно ли мое решение? Или я должен использовать другие технологии, такие как, пользовательские компоненты, украшать...?

layout.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

Основано на: Когда использовать , файлы тегов, составные компоненты и / или пользовательские компоненты?

Я думаю, что я должен использовать скорее шаблоны Facelet + файлы тегов Facelet вместо шаблонов Facelet + составные компоненты.

1 ответ

Решение

Верстка

layout.xhtml:

Каждая страница будет иметь одинаковый заголовок, меню, нижний колонтитул...

В этом случае вы можете опустить пользовательский интерфейс: вставить теги для заголовка, меню, нижнего колонтитула.

<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>

У вас также может быть пользовательский интерфейс: 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:

Если у вас есть UI: вставка без имени в layout.xhtml, вам не нужно UI: определить здесь:

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

Также вы должны поместить ваши шаблоны в папку, к которой пользователи не могут получить прямой доступ (WEB-INF).

многоразовые "коробки"

Один из ваших составных компонентов выглядит так:

<cc:component_customer/>

Компонент без каких-либо атрибутов очень подозрительно.

  • Что оно делает?
  • отображает имя пользователя?
  • как он получает имя пользователя, если вы не передаете никаких атрибутов?

Компонент должен быть автономным, для других многократно используемых деталей используйте вместо него ui: insert.

Другие вопросы по тегам