当前页面: 开发资料首页 → J2EE 专题 → 一组动态菜单的自定义标签
一组动态菜单的自定义标签
摘要:
作者:Prabu Arumugam
2003/04/09
菜单是软件应用的重要组件。实现静态菜单相对来说比较简单――仅需一次性的自定义分类和功能即可。对于一个动态菜单,由于每个用户的资料和参数都不尽相同,实现起来既具有挑战性,又显得十分棘手。
Java程序语言内置了创建基本菜单的架构,而JSP缺少此项支持。Web应用必须使用Java applets或JavaScript来实现菜单结构。许多web应用开发人员偏爱于JavaScript(它比applets更易开发)。本文将讲述一个可简化生成动态JavaScript过程的自定义标签库,包括标签库的设计和实现等内容。
设计方案 我们的设计目标是一个可以实现等级分类的对象模型,包括产生JavaScript的方法。
在实现等级分类的菜单系统中,每个菜单都包括一个或多个菜单项或子菜单,子菜单又可以展开包括菜单项和子菜单。菜单提供了实现程序详细功能的入口。不管菜单是何种类型,菜单对象都应该可以产生适当的JavaScript。
在基于复合物的设计模式上,simple menu在叶层次上实现了菜单,composite menu在菜单架构上实现了子菜单组和simple menu。换句话说:Composite可以包含SimpleMenu对象和其他CompositeMenu对象的列表。Menu抽象类声明了menu,定义了render方法供子类提供各自的实现。
下图描述了此复合物的设计模式:
菜单类的UML图 SimpleMenu实现了带有指向各自应用功能URL菜单项。CompositeMenu通过循环访问子菜单列表重写了render方法,分别调用各个的render方法。记住,列表可能既有菜单项,又有子菜单,所以菜单可能有多层。
下面的列表显示了CompositeMenu和SimpleMenu的render方法。这两个方法都产生了JavaScript,调用dynamicmenu.js存在的方法。这个文件的方法负责在浏览器种生成菜单。这些功能的设计与实现不在本文探讨的范围之内。
SimpleMenu的render方法StringBuffer sb = new StringBuffer();
sb.append("addmenuitem(");
sb.append("\"" + getLevelCoord() + "\",");
sb.append("\"" + getMenuName() + "\",");
sb.append("\"" + getUrl() + "\",");
sb.append("\"black\",\"FAEBD7\",\"white\", \"3366CC\",\"white\",
\"3366CC\",\"font-family:Tahoma, Verdana, Arial;
font-size:12px;font-weight:normal,text-decoration:none;padding: 4px\");");
sb.append("\n");
return sb.toString();
CompositeMenu的render方法StringBuffer sb = new StringBuffer();
sb.append("addmenuitem(");
sb.append("\"" + getLevelCoord() + "\",");
sb.append("\"" + getMenuName() + "\",");
if (null == getUrl())
sb.append("null" + ",");
else
sb.append("\"" + getUrl() + "\",");
sb.append("\"black\",\"FAEBD7\",\"white\",\"3366CC\",\"white\",\"3366CC\",
\"font-family:Tahoma, Verdana, Arial; font-size:12px;
font-weight:normal,text-decoration:none;padding: 4px\");");
sb.append("\n");
Iterator it = list.iterator();
int i=1;
while(it.hasNext())
{
Menu menu = (Menu)it.next();
menu.setLevelCoord(getLevelCoord() + "," + i);
sb.append(menu.render());
i++;
}
return sb.toString();
菜单数据源 菜单创建者(menu builder)负责根据数据源创建菜单。菜单数据根据种类分级。它可以来自任何可支持表单等级数据的源。我们实现了创建者,分别使用两种通用的数据源:XML和数据库。当然,你也可以很方便的根据此设计方法开发出其他的创建者。
XMLMenuBuilder 既然菜单结构和XML结构都由等级属性,XML可方便的表达菜单数据。XMLMenuBuilder接受包含菜单定义的XML文件,解析XML文档来创建动态菜单。XML文档的