`
cuixiufang
  • 浏览: 37775 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

通过java程序操纵richfaces的panelmenu标签动态生成导航菜单

阅读更多
化了好长时间研究这个东东,现在拿出来给大家分享,希望对大家有用。

Menu实体类
@Entity
public class MyMenu implements Serializable {

private Long id;
private String type;
private String menuid;
private String pmenuid;
private String viewlabel;
private String link;
         //getter and setter
...
}

Menu的Action
public class SimplePanelMenuAction {

@In(required = false)
private EntityManager entityManager;

@In(required = false)
@Out(required = false)
private MenuState menuState;

HtmlPanelMenu panelMenu;

public MenuState getMenuState() {
return menuState;
}

public void setMenuState(MenuState menuState) {
this.menuState = menuState;
}

public void select(ActionEvent event) {
menuState.setSelectedMenuItem(event.getComponent().getId());
}

private void loadMenu() {

panelMenu = new HtmlPanelMenu();
FacesContext facesContext = FacesContext.getCurrentInstance();
Class[] params = { ActionEvent.class };
Map<String, Boolean> menu = new HashMap<String, Boolean>();
ActionListener actl= new MethodExpressionActionListener(Expressions.instance().createMethodExpression("#{simplePanelMenu1.select}", Void.TYPE, params).toUnifiedMethodExpression());

List<MyMenu> mymenugrops = entityManager
.createQuery(
"select m from MyMenu m where m.type = 'G' and m.pmenuid = '000000'")
.getResultList();
for (MyMenu mymenugrop : mymenugrops) {
HtmlPanelMenuGroup panelGroup = new HtmlPanelMenuGroup();
panelGroup.setId(mymenugrop.getViewlabel());
panelGroup.setName(mymenugrop.getViewlabel());
panelGroup.setLabel(mymenugrop.getViewlabel());
    menu.put(panelGroup.getId(), false);  

List<MyMenu> submymenugrops = entityManager
.createQuery(
"select m from MyMenu m where m.type = 'G' and m.pmenuid = :p1")
.setParameter("p1", mymenugrop.getMenuid()).getResultList();
for (MyMenu submymenugrop : submymenugrops) {
HtmlPanelMenuGroup subpanelGroup = new HtmlPanelMenuGroup();
subpanelGroup.setId(submymenugrop.getViewlabel());
subpanelGroup.setName(submymenugrop.getViewlabel());
subpanelGroup.setLabel(submymenugrop.getViewlabel());

List<MyMenu> mymenuitems = entityManager
.createQuery(
"select m from MyMenu m where m.type = 'I' and m.pmenuid = :p1")
.setParameter("p1", submymenugrop.getMenuid())
.getResultList();
for (MyMenu mymenuitem : mymenuitems) {
HtmlPanelMenuItem subpanelMenuItem = new HtmlPanelMenuItem();
subpanelMenuItem.setId(mymenuitem.getViewlabel());
subpanelMenuItem.setName(mymenuitem.getViewlabel());
subpanelMenuItem.setLabel(mymenuitem.getViewlabel());

subpanelMenuItem.addActionListener(actl);
subpanelMenuItem
        .setActionExpression(Expressions.instance().createMethodExpression(mymenuitem.getLink()).toUnifiedMethodExpression());
subpanelGroup.getChildren().add(subpanelMenuItem);
}
panelGroup.getChildren().add(subpanelGroup);
}

List<MyMenu> mymenuitems = entityManager
.createQuery(
"select m from MyMenu m where m.type = 'I' and m.pmenuid = :p1")
.setParameter("p1", mymenugrop.getMenuid()).getResultList();
for (MyMenu mymenuitem : mymenuitems) {
HtmlPanelMenuItem panelMenuItem = new HtmlPanelMenuItem();
panelMenuItem.setId(mymenuitem.getViewlabel());
panelMenuItem.setName(mymenuitem.getViewlabel());
panelMenuItem.setLabel(mymenuitem.getViewlabel());

panelMenuItem.addActionListener(actl);
panelMenuItem
        .setActionExpression(Expressions.instance().createMethodExpression(mymenuitem.getLink()).toUnifiedMethodExpression());
panelGroup.getChildren().add(panelMenuItem);
}

panelGroup.setValueExpression("value",Expressions.instance().createValueExpression("#{simplePanelMenu.menuState.menu['"+panelGroup.getLabel()+"']}").toUnifiedValueExpression());

panelMenu.getChildren().add(panelGroup);
menu.put(panelGroup.getLabel(), false);
}
menuState.setMenu(menu);
}

public HtmlPanelMenu getPanelMenu() {
if (panelMenu == null) {
loadMenu();
}
return panelMenu;
}

public  void setPanelMenu(HtmlPanelMenu panelMenu) {
this.panelMenu=panelMenu;
}

@Remove
public void destroy() {
}
}

用于保存菜单状态的Bean
private Map <String, Boolean> menu;  
   
   @In(required=false)
   @Out(required=false)
   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() {  
   }  
}

页面:
<rich:panelMenu id="panelmenu" binding="#{simplePanelMenu.panelMenu}" style="width:185px"
  selectedChild="#{simplePanelMenu.menuState.selectedMenuItem}"
  iconExpandedGroup="disc"   
  iconCollapsedGroup="disc"   
  iconExpandedTopGroup="chevronUp"   
  iconGroupTopPosition="right"   
  iconCollapsedTopGroup="chevronDown"   
  iconCollapsedTopPosition="right" > 
</rich:panelMenu>
<h1>This is TEST2</h1>

分享到:
评论
10 楼 zhangzy2003 2012-08-10  
您好,我现在也在做动态生成菜单,遇到一个问题,能否给些建议? 谢谢!

在后台生成的菜单,页面中无法显示,总是出现 ‘Richfaces’is undefined
9 楼 tbslll 2010-11-03  
你好,我想请问一下,用rich:panelMenu 做一个导航菜单,怎么实现左边是这个菜单,右边是iframe,点击其中的某项,右面的页面会发生跳转
8 楼 ThinkingInAll 2009-11-28  
正好可以用,谢谢
7 楼 cuixiufang 2009-08-06  
6 楼 cuixiufang 2009-08-06  
后台代码的优化:

以上的这种方式会多次查询数据库,给数据库造成很大负担,下面对他进行了一点改进,从数据库里一次把所需数据取出,然后通过Hash表来操作其他菜单。个人测试速度快了几个数量级,希望对大家也有帮助!!

下面是修改后的SimplePanelMenuAction类:

package com.tower.panelmenu;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.ejb.Remove;
import javax.el.ELContext;
import javax.el.Expression;
import javax.el.MethodExpression;
import javax.faces.application.Application;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.el.MethodBinding;
import javax.faces.el.ValueBinding;
import javax.faces.event.ActionEvent;
import javax.faces.event.ActionListener;
import javax.faces.event.MethodExpressionActionListener;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.swing.event.MenuListener;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Destroy;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Out;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.core.Expressions;
import org.jboss.seam.core.Expressions.ValueExpression;
import org.jboss.seam.el.SeamExpressionFactory;
import org.richfaces.component.UIPanelMenuGroup;
import org.richfaces.component.UIPanelMenuItem;
import org.richfaces.component.html.HtmlPanelMenu;
import org.richfaces.component.html.HtmlPanelMenuGroup;
import org.richfaces.component.html.HtmlPanelMenuItem;

@Name("simplePanelMenu")
@Scope(ScopeType.SESSION)
public class SimplePanelMenuAction {

	@In(required = false)
	private EntityManager entityManager;

	// 用于存储菜单的状态
	@In(required = false)
	@Out(required = false)
	private MenuState menuState;

	HtmlPanelMenu panelMenu;

	Map<Long, UIPanelMenuGroup> parentPanel = new HashMap<Long, UIPanelMenuGroup>();

	Map<String, Boolean> menu = new HashMap<String, Boolean>();

	List<MyMenu> menuItems;
	Map<String, MyMenu> menuGroups;

	public MenuState getMenuState() {
		return menuState;
	}

	public void setMenuState(MenuState menuState) {
		this.menuState = menuState;
	}

	// 用于存储菜单的状态而触发的事件
	public void select(ActionEvent event) {
		menuState.setSelectedMenuItem(event.getComponent().getId());
	}

	// 载入菜单
	private void loadMenu() {

        SimpleDateFormat fmt = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS"); 
		System.out.println("Create Menu Start:" + fmt.format(System.currentTimeMillis()));
		panelMenu = new HtmlPanelMenu();
		menuItems = new ArrayList<MyMenu>();
		menuGroups = new HashMap<String, MyMenu>();
		FacesContext facesContext = FacesContext.getCurrentInstance();
		Class[] params = { ActionEvent.class };
		Map<String, Boolean> menu = new HashMap<String, Boolean>();
		ActionListener actl = new MethodExpressionActionListener(Expressions
				.instance().createMethodExpression(
						"#{simplePanelMenu1.select}", Void.TYPE, params)
				.toUnifiedMethodExpression());

		// 添加该用户的所有菜单项目到List和Hash表中
		List<MyMenu> mymenuitems = entityManager.createQuery(
				"select m from MyMenu m order by m.menuid asc ").getResultList();
		for (MyMenu mymenuitem : mymenuitems) {
			if ("I".equals(mymenuitem.getType())){
				menuItems.add(mymenuitem);
			}else{
				menuGroups.put(mymenuitem.getMenuid(), mymenuitem);
			}	
		}
		
		// 添加所有的叶子节点
		for (MyMenu mymenuitem : menuItems) {
			UIPanelMenuItem panelLeafItem = new HtmlPanelMenuItem();
			panelLeafItem.setId("_" + mymenuitem.getViewlabel());
			panelLeafItem.setName(mymenuitem.getViewlabel());
			panelLeafItem.setLabel(mymenuitem.getViewlabel());

			// 给叶子节点添加事件监听和Action
			panelLeafItem.addActionListener(actl);
			panelLeafItem.setActionExpression(Expressions.instance()
					.createMethodExpression(mymenuitem.getLink())
					.toUnifiedMethodExpression());
			
			// 添加该叶子节点的父节点
			addPanel(panelLeafItem, mymenuitem);
		}

		// 设置菜单组的状态绑定
		menuState.setMenu(menu);
		System.out.println("Create Menu Ended:" + fmt.format(System.currentTimeMillis()));
	}

	private void addPanel(UIComponent subPanel, MyMenu node) {
		if (menuGroups.get(node.getPmenuid()) != null) {
			MyMenu parentNode = menuGroups.get(node.getPmenuid());
			UIPanelMenuGroup newPanel;
			if (parentPanel.containsKey(parentNode.getId())) {
				newPanel = parentPanel.get(parentNode.getId());
				newPanel.getChildren().add(subPanel);
			} else {
				newPanel = new HtmlPanelMenuGroup();
				newPanel.setName(parentNode.getViewlabel());
				newPanel.setLabel(parentNode.getViewlabel());
				newPanel.getChildren().add(subPanel);
				parentPanel.put(parentNode.getId(), newPanel);
			}
			// 添加该Group节点的父节点
			addPanel(newPanel, parentNode);
		} else {
			
		    //设置该菜单组的Value属性值
			subPanel.setValueExpression("value", Expressions.instance()
					.createValueExpression(
							"#{simplePanelMenu.menuState.menu['"
									+ ((HtmlPanelMenuGroup) subPanel)
											.getLabel() + "']}")
					.toUnifiedValueExpression());
			
			// 把根Group节点添加到菜单中
			panelMenu.getChildren().add(subPanel);

			// 设置该菜单组的状态初始值
			menu.put(((HtmlPanelMenuGroup) subPanel).getLabel(), false);
		}
	}

	public HtmlPanelMenu getPanelMenu() {
		if (panelMenu == null) {
			loadMenu();
		}
		return panelMenu;
	}

	public void setPanelMenu(HtmlPanelMenu panelMenu) {
		this.panelMenu = panelMenu;
	}

	@Destroy
	public void destroy() {
	}

}
5 楼 364902709 2009-07-30  
看一看,刚好用到,嘿嘿谢谢。
4 楼 hanwn123 2009-07-24  
哈,秀才你好厉害啊,那么早就把这个做出来了。
3 楼 cuixiufang 2009-07-12  
,怎么没人评论评论呀
2 楼 cuixiufang 2009-06-17  
页面上使用标签的话,做不到动态生成。
1 楼 wetouns 2009-04-27  
为什么不直接用标签?觉得从后台来创建有点累。

相关推荐

    RichFaces_3.3.3标签库手册

    《RichFaces 3.3.3 标签库手册》是针对富客户端开发的重要参考资料,主要涵盖RichFaces组件库在3.3.3版本中的各种功能标签及其使用方法。这本手册以HTML化的方式呈现,方便开发者查阅和理解,旨在为JavaServer Faces...

    richfaces标签学习笔记

    在本文中,我们将深入探讨 RichFaces 标签的使用,特别是 `rich:componentControl` 和 `rich:modalPanel` 标签,以及 `inputNumberSlider` 和...通过熟练掌握这些标签和组件,你可以创建出用户体验极佳的网页应用程序。

    Richfaces标签

    `rich:panelMenu`标签用于创建下拉菜单,类似于Windows系统的下拉菜单。 **示例代码:** ```xml &lt;rich:panelMenu style="width:200px" mode="ajax" iconExpandedGroup="disc" iconCollapsedGroup="disc" ...

    RichFaces4.5 JavaApi JSApi

    RichFaces 4.5 是一个强大的JavaServer Faces (JSF) 框架的扩展库,专为构建富互联网应用程序(Rich Internet Applications, RIA)而设计。这个库提供了丰富的组件集,以及对JavaScript(JS)和Java API的支持,使得...

    Richfaces组件使用指南

    RichFaces是一个开源框架,专注于将Ajax功能无缝集成到JavaServer Faces(JSF)应用程序中,无需依赖JavaScript。这个框架充分利用了JSF的生命周期、验证、转换工具以及资源管理功能。它提供的Ajax支持是完全集成到...

    usersrc.rar_jsf richfaces_richfaces_办公 Java

    《Java JSF Richfaces在办公自动化系统中的应用详解》 在现代企业信息化建设中,办公自动化系统的开发与应用已经成为提升工作效率、实现管理现代化的关键。本文将深入探讨如何利用Java、JSF(JavaServer Faces)...

    richfaces-3.0.0

    RichFaces 是一个开源项目,它扩展了 JSF 的功能,提供了大量的可重用 UI 组件,以及对 AJAX(异步 JavaScript 和 XML)技术的支持,使得开发人员能够构建高度交互性和动态的 Web 应用程序。 **描述解析:** ...

    richfaces-ui-3.3.GA jar

    - "richfaces":这是 RichFaces 的标签,它是一个开源的 JavaServer Faces (JSF) 扩展框架,主要用于构建富互联网应用程序(Rich Internet Applications, RIA)。它提供了丰富的UI组件和Ajax功能。 - "richfaces3.3...

    richfaces详细使用

    RichFaces是面向JavaServer Faces(JSF)的增强型框架,其主要优势在于无需依赖JavaScript即可为现有的JSF应用程序添加Ajax功能。它充分利用了JSF的生命周期、验证、转换等机制,通过内置的Ajax支持,极大地简化了...

    richfaces标签学习笔记.doc

    在Java的富客户端框架(RichFaces)中,`rich:componentControl`标签和`rich:modalPanel`标签是两个非常重要的组件,它们用于创建交互式的用户界面。`rich:componentControl`标签允许开发者通过AJAX操作来控制其他组件...

    Java web标签大全

    Java Web标签大全涵盖了许多用于构建动态Web应用程序的关键技术,这些技术包括Struts 2、Struts 1(Bean、HTML和Logic标签)、JSTL、JSP、Spring以及AJAX。下面将对这些标签和框架进行详细介绍。 1. **Struts 2标签...

    a4j richfaces 常用标签例子

    这是用richfaces3.1写的一个学习笔记。需要的看看 在jboss4.2下运行正常。 在tomcat中如果抛异常。 是因为jar包不一样导致的。可以给我发留言。我给你完整包 liucheng418@163.com

    richfaces标签例子

    【richfaces标签例子】是关于JavaServer Faces (JSF)框架中RichFaces组件库的使用教程,主要展示了如何在Web应用程序中实现一个日历组件。RichFaces是一个强大的UI组件库,它扩展了JSF的功能,提供了许多富互联网...

    richfaces(里面包含JAR包)

    **标签解析:** "richfaces jsf" 这两个标签进一步明确了主题,RichFaces是基于JSF框架的,JSF是一个用于构建Web应用程序的Java标准,它提供了一种声明式的方式来创建用户界面。标签中的"jsf"提醒我们RichFaces是JSF...

    Richfaces ShowCase离线包

    **richfaces-showcase.war** 是一个Web应用程序的归档文件,通常用于部署在像Tomcat这样的Java应用服务器上。这个war文件包含了Richfaces ShowCase的全部源代码和资源,包括HTML、CSS、JavaScript、Java类以及相关的...

    Java Web JSF +Richfaces+EJB+JPA航空订票系统

    Java Web JSF + Richfaces + EJB + JPA 航空订票系统是一个综合性的应用,涵盖了多种Java技术,用于构建高效的、可扩展的、易于维护的Web应用程序。在这个系统中,每项技术都有其特定的角色和功能,共同协作以实现...

Global site tag (gtag.js) - Google Analytics