本文所写的例子是针对这篇帖子的。
我们需要两个managed Bean,一个在request中,一个在Session中。在Session中的managed Bean用来存储菜单的状态。如果你使用Seam,那么实现这个例子会更加简单。
我们需要记住两个东西:
1、哪个菜单组被展开了
2、哪个菜单被点击了
记住被电击的菜单项,我们使用selectedChild=”#{menuState.selectedMenuItem}”来实现。
记住哪个菜单组被展开了,则通过菜单组的属性来实现,这个属性对应的参数值是自动被记忆的。
这里我在action方法里面写的是页面的viewId,也就是页面的相对路径。当然如果写标准的导航规则也是可以的。
<h:form> <rich:panelMenu style="width:200px" mode="client" selectedChild="#{menuState.selectedMenuItem}" iconExpandedGroup="disc" iconCollapsedGroup="disc" iconExpandedTopGroup="chevronUp" iconGroupTopPosition="right" iconCollapsedTopGroup="chevronDown" iconCollapsedTopPosition="right" > <rich:panelMenuGroup label="Group 1" id="group1" value="#{menuState.menu['group1']}"> <rich:panelMenuItem label="Item 1" id="group1_item1" actionListener="#{menuBean.select}" action="/select.xhtml" mode="server"/> <rich:panelMenuItem label="Item 2" id="group1_item2" actionListener="#{menuBean.select}" action="/select.xhtml" mode="server"/> <rich:panelMenuItem label="Item 3" id="group1_item3" actionListener="#{menuBean.select}" action="/select.xhtml" mode="server"/> </rich:panelMenuGroup> <rich:panelMenuGroup label="Group 2" id="group2" value="#{menuState.menu['group2']}" > <rich:panelMenuItem label="Item 1" id="group2_item1" actionListener="#{menuBean.select}" action="/select.xhtml" mode="server"/> <rich:panelMenuItem label="Item 2" id="group2_item2" actionListener="#{menuBean.select}" action="/select.xhtml" mode="server"/> <rich:panelMenuItem label="Item 3" id="group2_item3" actionListener="#{menuBean.select}" action="/select.xhtml" mode="server"/> </rich:panelMenuGroup> </rich:panelMenu> </h:form>
request范围内的managed Bean:MenuBean
package test;
import javax.faces.event.ActionEvent;
public class MenuBean {
private MenuState menuState;
public MenuState getMenuState() {
return menuState;
}
public void setMenuState(MenuState menuState) {
this.menuState = menuState;
}
public MenuBean() {}
public void select (ActionEvent event) {
menuState.setSelectedMenuItem(event.getComponent().getId());
}
}
在select监听器中,我们记住了哪个菜单项被点击了。当我们返回到这个页面的时候,被点击的菜单项就会依照selectedChild=”#{menuState.selectedMenuItem}”恢复被点击状态。
Session范围内的managed Bean:MenuState,用户保存菜单组的展开状态
package test;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.PostConstruct;
public class MenuState {
private Map <String, Boolean> menu;
private String selectedMenuItem;
public String getSelectedMenuItem() {
return selectedMenuItem;
}
public Map<String, Boolean> getMenu() {
return menu;
}
public void setMenu(Map<String, Boolean> menu) {
this.menu = menu;
}
public void setSelectedMenuItem(String selectedMenuItem) {
this.selectedMenuItem = selectedMenuItem;
}
public MenuState() {
}
@PostConstruct
public void init () {
menu = new HashMap <String, Boolean>();
menu.put("group1", false);
menu.put("group2", false);
}
}
rich:panelMenuGroup的value属性被绑定到了一个HashMap上,其展开状态的值会自动保存进这个变量。
JSF配置文件:
<managed-bean> <managed-bean-name>menuBean</managed-bean-name> <managed-bean-class>test.MenuBean</managed-bean-class> <managed-bean-scope>request</managed-bean-scope> <managed-property> <property-name>menuState</property-name> <property-class>test.MenuState</property-class> <value>#{menuState}</value> </managed-property> </managed-bean> <managed-bean> <managed-bean-name>menuState</managed-bean-name> <managed-bean-class>test.MenuState</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> </managed-bean>