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

一种方法是使用组件绑定(例如到 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 回答