JSF 2动态菜单处理的最佳实践?

时间:2011-02-25 13:05:16

标签: java jsf menu java-ee-6 cdi

我正在寻找使用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导航导致其他问题,所以我找不到任何东西。

提前致谢!

1 个答案:

答案 0 :(得分:2)

一种方法是使用组件绑定(例如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);
}