1

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 です。次に、別のビューを開き、現在のビュー ID を navigatiobean 内で選択されているように設定します。

@PostConstruct 
private void init (){

    navigation.setSelectedTopMenu(getViewId());
}

問題は、手遅れです。ページは既にレンダリングされており、ビュー ID が選択されていません。

このアプローチはまったく良くありませんか?ベストプラクティスはありますか? JSF メニューと JSF ナビゲーションを検索すると、別の問題が発生するため、何も見つかりませんでした。

前もって感謝します!

4

1 に答える 1

2

1 つの方法は、コンポーネント バインディング (たとえば、h:panelGroup へ) を使用し、バインディング メソッドでメニュー全体を生成することです。

JSF ページ:

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

豆:

public HtmlPanelGroup getNavigationMenu() {
     HtmlPanelGroup menu = new HtmlPanelGroup();
     menu.setId("menu");
     HtmlOutputLink link = new HtmlOutputLink();
     // ... other components etc.
     menu.getChildren().add(link);
}
于 2011-02-25T13:21:08.793 に答える