本文所写的例子是针对这篇帖子的。
我们需要两个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>
本文介绍如何使用JSF实现菜单状态的记忆功能,包括菜单项的选择和菜单组的展开状态保存。通过Request范围内的Managed Bean管理和Session范围内的Managed Bean保存状态。
945

被折叠的 条评论
为什么被折叠?



