Наилучшая практика для работы с динамическим меню JSF 2? - PullRequest
1 голос
/ 25 февраля 2011

Я ищу лучшую практику работы с простым меню с помощью JSF и CDI.

Я бы хотел иметь главное меню с динамическими записями. Что-то вроде (из основного шаблона):

            <ul>
                <c:forEach var="menuItem" items="#{navigationBean.topMenuItems}">
                    <c:choose>
                        <c:when test="#{navigationBean.isSelectedTop(menuItem.name)}">
                            <li class="current_page_item"><h:outputLink value="#{menuItem.url}"><h:outputText value="#{menuItem.name}" /></h:outputLink></li>
                        </c:when>
                        <c:otherwise>
                            <li><h:outputLink value="#{menuItem.url}"><h:outputText value="#{menuItem.name}" /></h:outputLink></li>
                        </c:otherwise>
                    </c:choose>
                </c:forEach>
            </ul>

NavigationBean (Sessionscoped и содержит список NavigationItems) и NavigationItem являются только bean-компонентами. Затем, открывая другой вид, я устанавливаю идентификатор текущего вида, выбранный в navatiobean:

@PostConstruct 
private void init (){

    navigation.setSelectedTopMenu(getViewId());
}

Проблема в том, что уже слишком поздно. Страница уже обработана, и идентификатор представления не выбран.

Разве этот подход не хорош вообще? Есть ли лучшие практики? Поиск меню JSF и навигация JSF приводят к другим проблемам, поэтому я ничего не смог найти.

Заранее спасибо!

1 Ответ

2 голосов
/ 25 февраля 2011

Одним из способов является использование привязки компонента (например, к h: panelGroup) и генерация всего меню в методе привязки.

Страница JSF:

<h:panelGroup binding="navigationBean.navigationMenu" />

Bean:

public HtmlPanelGroup getNavigationMenu() {
     HtmlPanelGroup menu = new HtmlPanelGroup();
     menu.setId("menu");
     HtmlOutputLink link = new HtmlOutputLink();
     // ... other components etc.
     menu.getChildren().add(link);
}
...