我正在寻找使用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导航导致其他问题,所以我找不到任何东西。
提前致谢!
答案 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);
}