使用Java+JSP+JavaScript实现多级下拉菜单

来源 :职业圈 | 被引量 : 0次 | 上传用户:yanweiwch
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  【摘要】任何涉及菜单较多的业务系统,优化菜单的展现,减少登录时等待的时间都是很有必要的。通常CS结构下实现的下拉菜单需要读取全菜单,以某种格式组织在一起并展现。文章介绍了一种使用Java+JSP+JavaScript实现的多级下拉菜单,可以在短时间内在读取所有菜单的情况下成功登录系统。
  【关键词】Java;JSP;JavaScrip;多级下拉菜单;节点;数据集
   【中图分类号】 TP311 【文献标识码】A
   【文章编号】1671-5969(2007)21-0185-02
  
  一、实现基本思想
  
  为了减少Client端的数据处理时间,即客户登录时间,在服务器端除了取得所有菜单的基础数据集外,根据设计的算法,生成三个层次的节点ID,和节点名称构成的TreeMap类型的数据集合返回给JSP页面。
  JSP将服务器返回的数据集,放入隐藏的下拉框控件中,并调用JavaScript脚本进行处理。对于这个特殊的结果数据集,根据一定的循环调用算法,生成JSP页面上显示的源代码,并打印出来,形成最终的下拉菜单结果。
  
  二、关键算法简介
  
  1.从数据库取得菜单数据集,生成可排序,并且包含菜单真正路径的数据集合的遍历算法简介:
  步骤一:从数据库取得符合条件的以下字段的数据集:节点ID,节点名称,父节点ID,热键字符,快捷键,是否终结菜单。
  步骤二:遍历初始数据集一次,将快捷键扩展为4位,节点ID扩展为5位,并将快捷键,是否终结菜单,节点名称合并在节点名称字段中。本次遍历目的是生成两个结果集:(节点ID,父节点ID)TreeMap结果集,以及(节点ID,节点名称)TreeMap结果集。
  步骤三:遍历(节点ID,父节点ID)TreeMap结果集一次,以节点ID寻找到根节点ID的方式,获得节点ID路径,并划分节点ID所属的菜单层次,最终得到结果集第一层(节点ID,节点名称)TreeMap,第二层(节点ID,节点名称)TreeMap,第三层(节点ID,节点名称)TreeMap。其中节点ID是节点的完全路径,前缀是4位的快捷键,连接字符是“-”号。之所以前4加入扩展后的快捷键,是因为数据集返回到JSP页面时页面控件有自动排序的功能;节点名称的第一位是“是否终结菜单”字段,该字段用于判断叶子或非叶子菜单。
  2.JSP页面保存从服务器传来的数据结果集,调用JavaScript脚本处理算法简介:
  步骤一:设计菜单展开函数,作为下拉菜单的基础函数,在遍历菜单数据集时使用。设计菜单打开函数,有非叶子菜单函数nodeLeftMenu(A,B),叶子菜单函数nodeView(A,B,0)。
  步骤二:定义N层数据集合,对应页面上的各层数组,定义各种基本元素,例如数组长度,名称,是否终结菜单等,与从服务器返回的数据集合相对应。
  步骤三:遍历第一层,根据“是否终结菜单”判断是否有子菜单:如果有,继续第二层数组遍历;否则,打印该菜单页面代码。菜单项采用IFRAME的格式,确保菜单项的独立性,并且加入菜单项页面菜单调用函数,如果该菜单项也是非叶子菜单,则加入调用非叶子菜单函数nodeLeftMenu(A,B),如果该菜单项是叶子菜单则加入调用叶子菜单函数nodeView(A,B,0)。如果第二层菜单也是非叶子菜单,则继续遍历第三层,并判断菜单是否叶子菜单,按照上述处理方式调用nodeLeftMenu()或者nodeView()。最后,将页面代码打印处理。
  
  三、优缺点分析
  
  1.优点:可以充分利用服务器的快速处理能力,生成基础数据集合。可以让最终的结果集在客户端处理,减轻了服务器的处理负担。实践证明,只要JavaScript对结果集的处理算法得当,浏览器的解析处理时间就很快速。
  2.缺点:当菜单越来越多,并且多到满屏的时候,这种方式实现的下拉菜单就会部分看不到。虽然可以采用展现滚动条方式实现,但又影响了页面美观。处于菜单展开区域的页面如果有类似下拉框控件等就会影响菜单的显示,这也是JSP页面Style方式的缺点。
  
  四、实现源代码
  
  1.服务器从数据库取得数据,生成结果集合,并返回这个集合给JSP页面。算法源代码如下:
  //LOGIC处理结果集,关键算法
  public TreeMap getNodeMap2(String userID,String roleID) {
  TreeMap IDPreIDMap = new TreeMap();
  ——多层结构在这里定义
  TreeMap nodeMap = new TreeMap();
  try { String sql = "";
  if(roleID.equals("")){
  sql = "SELECT DISTINCT 受理目录标识… FROM … …";
  }
  this.setMyDB(1004, 1007);
  ResultSet rs = myDB.executeQuery(sql);//总数据集
  while (rs.next()) {
  String nodeID = Integer.toString(rs.getInt("受理目录标识"));
  … … //从数据库数据获取,并赋予定义的变量
  IDPreIDMap.put(nodeID, preNodeID);//ID,preID集合
  this.IDNameMap.put(nodeID,nodeName);//ID,Name集合
  }
  //对数据集遍历一次,取得所有节点路径,节点名称
  Iterator keyItor = IDPreIDMap.keySet().iterator();
  String key = "",preKey = "",saveKey = "",nodeName = "";
  int count = 0,size = IDPreIDMap.size();
  for(int i=0;i  key = keyItor.next().toString();//取得节点ID
  preKey = IDPreIDMap.get(key).toString();//取得父节点ID
  saveKey = key;//保存当前节点ID
  count = 0;
  //取得节点路径,使用符号-连接父子节点
  while(!preKey.equals("0")){
  }
  //節点路径开始加上快捷键以做排序,节点路径结尾使用符号“-”结束
  nodeName = IDNameMap.get(saveKey).toString();//根据key取得Name
  key = nodeName.substring(0, 4) + "-" + key;
  nodeName = nodeName.substring(4);
  //最终得到nodeMap结果
  if(count==0) nodeMap.put(key,nodeName);… …
  }
  }
  catch (Exception ex) {… …
  }
  finally {
  this.setMyDBDisconnect();
  }
  return nodeMap;
  }
  2.JSP頁面得到这个结果集,放入隐藏的下拉集合中,并调用JavaScript对这个下拉数据集进行处理。相关源代码如下:
  <table width="100%" height="5%" border="0" style='BACKGROUND: #ACB8E8;' >
  <tr><td align="left" >
   <script language="javascript">
  printNodeMenu();
   </script>
  </td> </tr> </table>
  3.JavaScript对下拉控件数据集进行处理,生成页面代码并打印出来,最终展现成多级下拉菜单。算法源代码如下:
  //根据节点数据集合打印出菜单
  function printNodeMenu(){
  var nodeIDs = document.all.nodeIDs;//节点路径以及节点名称的集合
  var maxLen = nodeIDs.length;
  var nodeID="",nodeName="",path="",isEnd="",text="";
  var len=0;//节点路径长度
  var firstNodeID = document.all.firstNodeID;//第二层节点路径以及节点名称的集合
  var maxLen1 = firstNodeID.length;//第二层元素个数
  //遍历打印出菜单页面元素
  for(var i=0;i<maxLen;i++){
  path = nodeIDs.options[i].value;//节点路径
  nodeID = path.substring(5);//去除节点路径开始的快捷键
  //打印第一层
  if(nodeID.length==5){//确认为第一层节点ID
  nodeName = nodeIDs.options[i].text;//第一位为叶子节点标识的节点名称
  isEnd = nodeName.substring(0,1);//是否叶子节点
  nodeName = nodeName.substring(1);//节点名称
  if(isEnd=="0"){//第一层非叶子节点
  text += "<p>"+nodeName+"</p>";
  text += "… …";
  document.writeln(text);//将第一层脚本生成的内容写在页面上
  //再次遍历一次数据集判断是否有子节点
  for(var i1=0;i1<maxLen1;i1++){
  var path1 = firstNodeID.options[i1].value;//节点路径
  var nodeID1 = path1.substring(5);//去除节点路径开始的快捷键
  var text1 = "";
  //打印第二层… …
  }
  }
  }
  else {//第一层叶子节点
  text = "… …";
  document.writeln(text);// 打印非叶子节点内容
  }
  }
  }
  window.parent.document.all.waiting.style.display='none';
  }
  
  【作者简介】范泽武,男,华南理工大学计算机软件学院 2005年秋季班在职软件工程硕士。
其他文献
【摘要】MasterCAM-X是机械加工自动化中使用最广泛软件Mastercam的最新版本,它在原有版本基础上使四大功能模块集合到一个窗口界面,利用它的图形设计与仿真功能,应用到数控实习中,改善了目前数控技术教学中没有普通机床直观、好理解、效果不理想、效率较低的现象,提高了数控编程能力、操作能力,对机械加工的素质教育和创新能力的培养起着重要作用。   【关键词】Mastercam-X;CAD/CA
期刊
【摘要】文章从学生课堂展示在教学实践中的应用入手,对其体现的互动、合作和社会建构主义进行理论分析,指出学生课堂展示是提高大学英语教学质量的有效途径。  【关键词】学生课堂展示;互动;合作;社会建构主义   【中图分类号】 G718 【文献标识码】A   【文章编号】1671-5969(2007)21-0111-02    培养学生的英语综合应用能力,特别是听说能力,使其在今后的工作和社会交往中能用
期刊
【摘要】行政效率低下在我国不同层级的政府和不同职能的部门都存在,其原因错综复杂。由于行政效率低下导致的GDP虚高,已经成为制约我国社会健康、稳健发展的瓶颈。因此,提高行政效率,倡导健康的经济增长方式是我国构建和谐社会的必然选择。   【关键词】行政效率;GDP虚高;绿色GDP   【中图分类号】 F279 【文献标识码】A  【文章编号】1671-5969(2007)17-0018-02    一
期刊
【摘要】现实生活既是开展教育活动的基础,也是实施教育活动的归宿,作为教育重要阵地的课堂教学更要植根于学生的日常生活。而生活不管是“诗意的栖居在大地上”还是“平平淡淡才是真”,其本意都在于使主体具有幸福感,所以课堂教学也要基于学生的日常生活,引导学生过一种能充分发挥其主体性,具有较高的幸福感受力的创造性生活。   【关键词】课堂教学;学生;日常生活;幸福感受力   【中图分类号】 G633 【文献标
期刊
【摘要】在日常工作中,当遇到某系统菜单很多,并且是多级形式时,常常需要把分级菜单按照菜单树的形式展开。文章介绍了使用Oracle游标实现逻辑上是多级的菜单按照树状文件结构的方式展开,从而满足菜单管理者对于菜单清晰管理的需要。  【关键词】Oracle;游标;多级菜单;菜单树;节点;结果集   【中图分类号】 TP311 【文献标识码】A   【文章编号】1671-5969(2007)21-0187
期刊
【摘要】经过了改革开放以后的快速发展,广东经济增长方式逐渐从高投入、高消耗的粗放型转变为高效率、节能型的集约发展,产业结构也随之不断优化升级。然而,广东的人力资源结构与广东的社会经济发展趋势不相适应,集中表现为人口素质的整体水平低。文章从广东省产业结构转型下的人力资源结构分析出发,对广东省大力发展继续教育的必要性进行了分析。  【关键词】产业结构;人力资源;继续教育;农民工  【中图分类号】 G4
期刊
【摘要】湘西土家族苗族自治州(以下简称湘西州)要走新型工业化道路,必须紧紧抓住湘西州特色资源,从湘西州特色资源入手,找准突破口。文章基于湘西州的三大特色资源与产业发展现状,得出湘西州的新型工业化发展方向是“三带”产业,并提出具体发展措施。   【关键词】湘西州;特色资源;新型工业化   【中图分类号】 F062.9 【文献标识码】A   【文章编号】1671-5969(2007)21-0171-0
期刊
【摘要】两宋时期,由于城镇数量的增加和扩大,人口大批流向城市。不再由宫廷奉养的专业歌舞艺人与农村优秀艺人开辟了固定的演出场所——勾栏。民间舞蹈作为“京瓦伎艺”进入城市勾栏演出,深受市民欢迎。文章依据文献资料对勾栏记载,分析、探讨、推测宋代勾栏的形态和特性。初步认为民间舞蹈第一次走入剧场应该从宋代的勾栏演出开始,勾栏是中国民间舞蹈商业化运作的剧场雏形。目前舞蹈理论界对舞蹈剧场的研究较少,因此对两宋时
期刊
【摘要】高等职业法学教育肩负着为国家培养应用性法学人才的艰巨职责。文章在分析我国高职法学教育面临困惑的基础上,从实践教学、订单教育培养、师资队伍建设、双证制四个方面,针对如何培养有特色的高职法学人才提出了建设性的意见。  【关键词】法学;高职教育;人才培养;法学文秘  【中图分类号】 G642【文献标识码】A  【文章编号】1671-5969(2007)17-0069-02    一、高等职业教育
期刊
【摘要】语文教学工作不仅要使学生掌握语言文字的基本知识,更要注重对学生品德的培养。由于语文教材的审美性、艺术性对学生具有很大的吸引力,教师应通过对教材的处理,有意识地在教学过程中渗透德育内容,起到“润物细无声”的教化作用。   【关键词】语文教学;德育渗透;人生观;价值观;审美观  【中图分类号】 G623【文献标识码】A  【文章编号】1671-5969(2007)17-0139-02    每
期刊