一组动态菜单的自定义标签
2004-09-21 16:47
281 查看
一组动态菜单的自定义标签
作者: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文档的<menu>元素可以看作是菜单项或子菜单,子菜单又可以展开包括菜单项或子菜单。
JDBCMenuBuilder
既然数据库表格可以表示相关联的数据,表也可以用来表达等级数据。HIERARCHYMENU表表示等级化的菜单数据。JDBCMenuBuilder接受从数据库的信息,按照次序从HIERARCHYMENU表中选择菜单数据。
菜单标签库
菜单标签库管理创建javascript菜单的复杂过程。菜单标签自身是一个继承TagSupport类的抽象类,并重写了doStartTag和doEndTag方法。getMenu方法是一个抽象方法应该被子类重写用来提供javascript,它可以增加在doStartTag方法中创建的菜单结构的菜单项。菜单标签的子类重写了getMenu方法,使用了可从数据源提取菜单数据的菜单创建者。
其中动态菜单标签库包含两个标签:JDBCMenuTag和XMLMenuTag。JDBCMenuTag使用JDBCBuilder根据数据库中的数据创建菜单结构,而XMLMenuTag使用XMLBuilder根据XML数据源创建菜单结构。文档提供了详细的使用标签库的说明。
这个版本的标签库也包含一些局限性。它没有使用户角色和菜单发生相关联,每个应用对此都不尽相同。标签库也没有提供对菜单项特定颜色和字体的支持。
菜单标签库应用例子
Menu-example.war文件包含了使用标签库的JSP页面。在Tomcat下以一下步骤部署应用:
(1)拷贝menu-example.war到tomcat安装文件夹/webapps.
(2)重启Tomcat来展开应用。
(3)根据环境调整xmlmenu.jsp和jdbcmenu.jsp
(4)创建一个新的数据库表结构,导入menu.sql文件中的数据。
(5)访问根据XML创建的菜单,访问localhost:8080/menu-example/xmlmenu.jsp.
(6)访问根据JDBC创建大额菜单,访问localhost:8080/menu-example/jdbcmenu.jsp.
结论
动态菜单标签库管理由javascript创建菜单的复杂过程,并允许web应用通过数据库或xml源创建动态等级菜单。
[b]资源/b]
关于菜单标签库的更多信息,请访问menutag.html文档
•《设计模式》,Eric Gamma,Richard Helm,Ralph Johnson,John Vlissides(Addison-Wesley Publishing Co., 1995; ISBN: 0201633612)
•JSP Tag Libraries :
http://java.sun.com/products/jsp/taglibraries.html
相关下载:
• menu.zip:
http://www.onjava.com/onjava/2003/04/09/examples/menu.zip
• men
4000
u-example.war:
http://www.onjava.com/onjava/2003/04/09/examples/menu-example.war
Menu标签库使用文档
http://www.onjava.com/onjava/2003/04/09/examples/menutag.html
Prabu Arumugam 是一名软件架构师和高级JAVA开发人员,就职于Forest Express,LLC.
作者: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文档的<menu>元素可以看作是菜单项或子菜单,子菜单又可以展开包括菜单项或子菜单。
JDBCMenuBuilder
既然数据库表格可以表示相关联的数据,表也可以用来表达等级数据。HIERARCHYMENU表表示等级化的菜单数据。JDBCMenuBuilder接受从数据库的信息,按照次序从HIERARCHYMENU表中选择菜单数据。
菜单标签库
菜单标签库管理创建javascript菜单的复杂过程。菜单标签自身是一个继承TagSupport类的抽象类,并重写了doStartTag和doEndTag方法。getMenu方法是一个抽象方法应该被子类重写用来提供javascript,它可以增加在doStartTag方法中创建的菜单结构的菜单项。菜单标签的子类重写了getMenu方法,使用了可从数据源提取菜单数据的菜单创建者。
其中动态菜单标签库包含两个标签:JDBCMenuTag和XMLMenuTag。JDBCMenuTag使用JDBCBuilder根据数据库中的数据创建菜单结构,而XMLMenuTag使用XMLBuilder根据XML数据源创建菜单结构。文档提供了详细的使用标签库的说明。
这个版本的标签库也包含一些局限性。它没有使用户角色和菜单发生相关联,每个应用对此都不尽相同。标签库也没有提供对菜单项特定颜色和字体的支持。
菜单标签库应用例子
Menu-example.war文件包含了使用标签库的JSP页面。在Tomcat下以一下步骤部署应用:
(1)拷贝menu-example.war到tomcat安装文件夹/webapps.
(2)重启Tomcat来展开应用。
(3)根据环境调整xmlmenu.jsp和jdbcmenu.jsp
(4)创建一个新的数据库表结构,导入menu.sql文件中的数据。
(5)访问根据XML创建的菜单,访问localhost:8080/menu-example/xmlmenu.jsp.
(6)访问根据JDBC创建大额菜单,访问localhost:8080/menu-example/jdbcmenu.jsp.
结论
动态菜单标签库管理由javascript创建菜单的复杂过程,并允许web应用通过数据库或xml源创建动态等级菜单。
[b]资源/b]
关于菜单标签库的更多信息,请访问menutag.html文档
•《设计模式》,Eric Gamma,Richard Helm,Ralph Johnson,John Vlissides(Addison-Wesley Publishing Co., 1995; ISBN: 0201633612)
•JSP Tag Libraries :
http://java.sun.com/products/jsp/taglibraries.html
相关下载:
• menu.zip:
http://www.onjava.com/onjava/2003/04/09/examples/menu.zip
• men
4000
u-example.war:
http://www.onjava.com/onjava/2003/04/09/examples/menu-example.war
Menu标签库使用文档
http://www.onjava.com/onjava/2003/04/09/examples/menutag.html
Prabu Arumugam 是一名软件架构师和高级JAVA开发人员,就职于Forest Express,LLC.
相关文章推荐
- BOS项目练习(权限/角色/用户管理(CRUD),基于数据库实现动态授权,ehcache缓存权限,shiro标签,菜单权限展示)
- 自定义ViewGroup实现标签换行(动态创建标签
- xcelsius动态标签菜单制作
- 自定义标签:在JSP页面中动态执行Spring Bean的方法
- svg自定义菜单的动态实现
- 自定义动态属性标签
- 如何向Struts2自定义标签传递一个动态值?
- android:自定义HorizontalScrollView实现qq侧滑菜单 标签: HorizontalScrollView自定义viewqq侧滑菜单 2016
- Android经典例子ViewPager、动态换肤、Tab标签效果、Renderscript、移动地图+选址、主页滑动效果、侧滑菜单沉浸式状态栏
- ArcEngine java 如何创建自定义菜单、环境菜单、调色板以及动态菜单项
- 利用TagSupport创建自定义标签实现网页左侧菜单
- 动态显示隐藏<td>标签或二级菜单
- 用jquery动态添加html任何标签的自定义属性
- Android自定义View专题六-PathMeasure实战,仿小红书动态标签
- 动态菜单 改变a标签颜色和字体等
- 自定义标签(5)动态属性的标签
- AJAX_树_树型菜单_自定义标签_chat_聊天室_jsp聊天室_树_AJAX_AJAX树
- 自定义动态添加评分标签
- 论坛源码推荐(10.21):灵活而强大的创建动态table-view表单,多功能自定义弹出菜单
- 框架 day54 BOS项目练习(权限/角色/用户管理(CRUD),基于数据库实现动态授权,ehcache缓存权限,shiro标签,菜单权限展示)