本站首页    管理页面    写新日志    退出

The Neurotic Fishbowl

[J2EE]dtree树形菜单比struts-menu好多了,必须夸奖一下
snowrose 发表于 2007/1/16 16:45:17

这几天在做一个树形菜单,找了半天的例子,从struts-menu到自己研究,最后发现d-tree太好了,excellent,非常灵活,而且比较简单,不想struts-menu到处都是tld标签,看他的源码也非常费劲,因为一般的代码都是因需求而定,而struts-menu虽然把权限,菜单继承在一起,但有个最大的问题就是灵活性,做代码的都知道与其修改别人的代码不如自己写的快,又拓宽自己的知识面,于是我选了第二种,写了一个集权限,树形菜单,管理员于一体的,华丽的,高贵的,富丽堂皇的,光彩夺目的模块,总称为系统管理,因为每个项目都有这个结构吧,只是因人不同,好了,先贴一个数据流程图: 500)this.width=500'> 然后把树形菜单的代码贴如下: 1)顶部菜单          <%          java.util.HashSet set=(java.util.HashSet)request.getAttribute("moduleSet");          java.util.Iterator ir1 = set.iterator();    while(ir1.hasNext()){          com.dodomark.db.Module module=(com.dodomark.db.Module)ir1.next();            int i=0;          if(module.getParent()==null){                %>          <td>       <table width="90"  border="0" align="center" cellpadding="0" cellspacing="0" id="table<%=i++%>">              <tr>                <td width="9%"><img id="img1" src="../images/yellow-tab-left.gif" width="9" height="29"></td>                <td id="td1" width="81%" background="../images/yellow-tab.gif">                <div align="center">                 <a href="javascript :getMenu('module.do?call=listMoudleByParent&parentId=<%=module.getModuleId()%>');"><%=module.getModuleName()%></a>                </div>                </td>                <td width="10%"><img id="img2" src="../images/yellow-tab-right.gif" width="9" height="29"></td>              </tr>          </table>    </td><%}}%> 2)生成左侧菜单的action:    public ActionForward listMoudleByParent(ActionMapping actionMapping,   ActionForm actionForm, HttpServletRequest httpServletRequest,   HttpServletResponse httpServletResponse) throws Exception {      System.out.println("%%%%%%%%%%%%%%%%%%%%%%%%%%%%");    if (log.isDebugEnabled()) {   log.debug("entering 'list' method...");  }  Long parentId=new Long(httpServletRequest.getParameter("parentId"));  WebApplicationContext wac = WebApplicationContextUtils    .getRequiredWebApplicationContext(this.getServlet()      .getServletContext());  moduleService = (ModuleService) wac.getBean("moduleService");  Module parent=moduleService.findModuleById(parentId);  Set set=parent.getChild();  List list=java.util.Arrays.asList(set.toArray());   System.out.println(list.toString()+"*****************"+list.size());  httpServletRequest.setAttribute("children", list);  return actionMapping.findForward("listchildren"); }3)生成左侧菜单的页面: <script type="text/javascript">  d = new dTree('d');  d.add(<%=request.getAttribute("parentId")%>,-1,'ROOT');   <%    if(request.getAttribute("children")!=null){    java.util.List list=(java.util.List)request.getAttribute("children");    for(int i=0;i<list.size();i++){    com.dodomark.db.Module module=(com.dodomark.db.Module)list.get(i);     %>         d.add(<%=module.getModuleId()%>,<%=module.getParent().getModuleId()%>,'<%=module.getModuleName()%>','<%=module.getUrl()%>','<%=module.getTitle()%>','mainIframe')     <% }    }  %> document.write(d); </script> 4)javascript : /*--------------------------------------------------| | dTree 2.05 | www.destroydrop.com/javascript/tree/ | |---------------------------------------------------| | Copyright (c) 2002-2003 Geir Landr�               | |                                                   | | This script can be used freely as long as all     | | copyright messages are intact.                    | |                                                   | | Updated: 17.04.2003                               | |--------------------------------------------------*/   // Node object function Node(id, pid, name, url, title, target, icon, iconOpen, open) {  this.id = id;  this.pid = pid;  this.name = name;  this.url = url;  this.title = title;  this.target = target;  this.icon = icon;  this.iconOpen = iconOpen;  this._io = open || false;  this._is = false;  this._ls = false;  this._hc = false;  this._ai = 0;  this._p; };   // Tree object function dTree(objName) {  this.config = {   target     : null,   folderLinks   : true,   useSelection  : true,   useCookies   : true,   useLines    : true,   useIcons    : true,   useStatusText  : false,   closeSameLevel : false,   inOrder     : false  }  this.icon = {   root    : 'img/base.gif',   folder   : 'img/folder.gif',   folderOpen : 'img/folderopen.gif',   node    : 'img/page.gif',   empty    : 'img/empty.gif',   line    : 'img/line.gif',   join    : 'img/join.gif',   joinBottom : 'img/joinbottom.gif',   plus    : 'img/plus.gif',   plusBottom : 'img/plusbottom.gif',   minus    : 'img/minus.gif',   minusBottom : 'img/minusbottom.gif',   nlPlus   : 'img/nolines_plus.gif',   nlMinus   : 'img/nolines_minus.gif'  };  this.obj = objName;  this.aNodes = [];  this.aIndent = [];  this.root = new Node(-1);  this.selectedNode = null;  this.selectedFound = false;  this.completed = false; };   // Adds a new node to the node array dTree.prototype.add = function(id, pid, name, url, title, target, icon, iconOpen, open) {  this.aNodes[this.aNodes.length] = new Node(id, pid, name, url, title, target, icon, iconOpen, open); };   // Open/close all nodes dTree.prototype.openAll = function() {  this.oAll(true); }; dTree.prototype.closeAll = function() {  this.oAll(false); };   // Outputs the tree to the page dTree.prototype.toString = function() {  var str = '<div class="dtree">\n';  if (document.getElementById) {   if (this.config.useCookies) this.selectedNode = this.getSelected();   str += this.addNode(this.root);  } else str += 'Browser not supported.';  str += '</div>';  if (!this.selectedFound) this.selectedNode = null;  this.completed = true;  return str; };   // Creates the tree structure dTree.prototype.addNode = function(pNode) {  var str = '';  var n=0;  if (this.config.inOrder) n = pNode._ai;  for (n; n<this.aNodes.length; n++) {   if (this.aNodes[n].pid == pNode.id) {    var cn = this.aNodes[n];    cn._p = pNode;    cn._ai = n;    this.setCS(cn);    if (!cn.target && this.config.target) cn.target = this.config.target;    if (cn._hc && !cn._io && this.config.useCookies) cn._io = this.isOpen(cn.id);    if (!this.config.folderLinks && cn._hc) cn.url = null;    if (this.config.useSelection && cn.id == this.selectedNode && !this.selectedFound) {      cn._is = true;      this.selectedNode = n;      this.selectedFound = true;    }    str += this.node(cn, n);    if (cn._ls) break;   }  }  return str; };   // Creates the node icon, url and text dTree.prototype.node = function(node, nodeId) {  var str = '<div class="dTreeNode">' + this.indent(node, nodeId);  if (this.config.useIcons) {   if (!node.icon) node.icon = (this.root.id == node.pid) ? this.icon.root : ((node._hc) ? this.icon.folder : this.icon.node);   if (!node.iconOpen) node.iconOpen = (node._hc) ? this.icon.folderOpen : this.icon.node;   if (this.root.id == node.pid) {    node.icon = this.icon.root;    node.iconOpen = this.icon.root;   }   str += '<img id="i' + this.obj + nodeId + '" src="' + ((node._io) ? node.iconOpen : node.icon) + '" alt="" />';  }  if (node.url) {   str += '<a id="s' + this.obj + nodeId + '" class="' + ((this.config.useSelection) ? ((node._is ? 'nodeSel' : 'node')) : 'node') + '" href="' + node.url + '"';   if (node.title) str += ' title="' + node.title + '"';   if (node.target) str += ' target="' + node.target + '"';   if (this.config.useStatusText) str += ' onmouseover="window.status=\'' + node.name + '\';return true;" onmouseout="window.status=\'\';return true;" ';   if (this.config.useSelection && ((node._hc && this.config.folderLinks) || !node._hc))    str += ' onclick="javascript : ' + this.obj + '.s(' + nodeId + ');"';   str += '>';  }  else if ((!this.config.folderLinks || !node.url) && node._hc && node.pid != this.root.id)   str += '<a href="javascript : ' + this.obj + '.o(' + nodeId + ');" class="node">';  str += node.name;  if (node.url || ((!this.config.folderLinks || !node.url) && node._hc)) str += '</a>';  str += '</div>';  if (node._hc) {   str += '<div id="d' + this.obj + nodeId + '" class="clip" style="display:' + ((this.root.id == node.pid || node._io) ? 'block' : 'none') + ';">';   str += this.addNode(node);   str += '</div>';  }  this.aIndent.pop();  return str; };   // Adds the empty and line icons dTree.prototype.indent = function(node, nodeId) {  var str = '';  if (this.root.id != node.pid) {   for (var n=0; n<this.aIndent.length; n++)    str += '<img src="' + ( (this.aIndent[n] == 1 && this.config.useLines) ? this.icon.line : this.icon.empty ) + '" alt="" />';   (node._ls) ? this.aIndent.push(0) : this.aIndent.push(1);   if (node._hc) {    str += '<a href="javascript : ' + this.obj + '.o(' + nodeId + ');"><img id="j' + this.obj + nodeId + '" src="';    if (!this.config.useLines) str += (node._io) ? this.icon.nlMinus : this.icon.nlPlus;    else str += ( (node._io) ? ((node._ls && this.config.useLines) ? this.icon.minusBottom : this.icon.minus) : ((node._ls && this.config.useLines) ? this.icon.plusBottom : this.icon.plus ) );    str += '" alt="" /></a>';   } else str += '<img src="' + ( (this.config.useLines) ? ((node._ls) ? this.icon.joinBottom : this.icon.join ) : this.icon.empty) + '" alt="" />';  }  return str; };   // Checks if a node has any children and if it is the last sibling dTree.prototype.setCS = function(node) {  var lastId;  for (var n=0; n<this.aNodes.length; n++) {   if (this.aNodes[n].pid == node.id) node._hc = true;   if (this.aNodes[n].pid == node.pid) lastId = this.aNodes[n].id;  }  if (lastId==node.id) node._ls = true; };   // Returns the selected node dTree.prototype.getSelected = function() {  var sn = this.getCookie('cs' + this.obj);  return (sn) ? sn : null; };   // Highlights the selected node dTree.prototype.s = function(id) {  if (!this.config.useSelection) return;  var cn = this.aNodes[id];  if (cn._hc && !this.config.folderLinks) return;  if (this.selectedNode != id) {   if (this.selectedNode || this.selectedNode==0) {    eOld = document.getElementById("s" + this.obj + this.selectedNode);    eOld.className = "node";   }   eNew = document.getElementById("s" + this.obj + id);   eNew.className = "nodeSel";   this.selectedNode = id;   if (this.config.useCookies) this.setCookie('cs' + this.obj, cn.id);  } };   // Toggle Open or close dTree.prototype.o = function(id) {  var cn = this.aNodes[id];  this.nodeStatus(!cn._io, id, cn._ls);  cn._io = !cn._io;  if (this.config.closeSameLevel) this.closeLevel(cn);  if (this.config.useCookies) this.updateCookie(); };   // Open or close all nodes dTree.prototype.oAll = function(status) {  for (var n=0; n<this.aNodes.length; n++) {   if (this.aNodes[n]._hc && this.aNodes[n].pid != this.root.id) {    this.nodeStatus(status, n, this.aNodes[n]._ls)    this.aNodes[n]._io = status;   }  }  if (this.config.useCookies) this.updateCookie(); };   // Opens the tree to a specific node dTree.prototype.openTo = function(nId, bSelect, bFirst) {  if (!bFirst) {   for (var n=0; n<this.aNodes.length; n++) {    if (this.aNodes[n].id == nId) {     nId=n;     break;    }   }  }  var cn=this.aNodes[nId];  if (cn.pid==this.root.id || !cn._p) return;  cn._io = true;  cn._is = bSelect;  if (this.completed && cn._hc) this.nodeStatus(true, cn._ai, cn._ls);  if (this.completed && bSelect) this.s(cn._ai);  else if (bSelect) this._sn=cn._ai;  this.openTo(cn._p._ai, false, true); };   // Closes all nodes on the same level as certain node dTree.prototype.closeLevel = function(node) {  for (var n=0; n<this.aNodes.length; n++) {   if (this.aNodes[n].pid == node.pid && this.aNodes[n].id != node.id && this.aNodes[n]._hc) {    this.nodeStatus(false, n, this.aNodes[n]._ls);    this.aNodes[n]._io = false;    this.closeAllChildren(this.aNodes[n]);   }  } }   // Closes all children of a node dTree.prototype.closeAllChildren = function(node) {  for (var n=0; n<this.aNodes.length; n++) {   if (this.aNodes[n].pid == node.id && this.aNodes[n]._hc) {    if (this.aNodes[n]._io) this.nodeStatus(false, n, this.aNodes[n]._ls);    this.aNodes[n]._io = false;    this.closeAllChildren(this.aNodes[n]);     }  } }   // Change the status of a node(open or closed) dTree.prototype.nodeStatus = function(status, id, bottom) {  eDiv = document.getElementById('d' + this.obj + id);  eJoin = document.getElementById('j' + this.obj + id);  if (this.config.useIcons) {   eIcon = document.getElementById('i' + this.obj + id);   eIcon.src = (status) ? this.aNodes[id].iconOpen : this.aNodes[id].icon;  }  eJoin.src = (this.config.useLines)?  ((status)?((bottom)?this.icon.minusBottom:this.icon.minus):((bottom)?this.icon.plusBottom:this.icon.plus)):  ((status)?this.icon.nlMinus:this.icon.nlPlus);  eDiv.style.display = (status) ? 'block': 'none'; };     // [Cookie] Clears a cookie dTree.prototype.clearCookie = function() {  var now = new Date();  var yesterday = new Date(now.getTime() - 1000 * 60 * 60 * 24);  this.setCookie('co'+this.obj, 'cookieValue', yesterday);  this.setCookie('cs'+this.obj, 'cookieValue', yesterday); };   // [Cookie] Sets value in a cookie dTree.prototype.setCookie = function(cookieName, cookieValue, expires, path, domain, secure) {  document.cookie =   escape(cookieName) + '=' + escape(cookieValue)   + (expires ? '; expires=' + expires.toGMTString() : '')   + (path ? '; path=' + path : '')   + (domain ? '; domain=' + domain : '')   + (secure ? '; secure' : ''); };   // [Cookie] Gets a value from a cookie dTree.prototype.getCookie = function(cookieName) {  var cookieValue = '';  var posName = document.cookie.indexOf(escape(cookieName) + '=');  if (posName != -1) {   var posValue = posName + (escape(cookieName) + '=').length;   var endPos = document.cookie.indexOf(';', posValue);   if (endPos != -1) cookieValue = unescape(document.cookie.substring(posValue, endPos));   else cookieValue = unescape(document.cookie.substring(posValue));  }  return (cookieValue); };   // [Cookie] Returns ids of open nodes as a string dTree.prototype.updateCookie = function() {  var str = '';  for (var n=0; n<this.aNodes.length; n++) {   if (this.aNodes[n]._io && this.aNodes[n].pid != this.root.id) {    if (str) str += '.';    str += this.aNodes[n].id;   }  }  this.setCookie('co' + this.obj, str); };   // [Cookie] Checks if a node id is in a cookie dTree.prototype.isOpen = function(id) {  var aOpen = this.getCookie('co' + this.obj).split('.');  for (var n=0; n<aOpen.length; n++)   if (aOpen[n] == id) return true;  return false; };   // If Push and pop is not implemented by the browser if (!Array.prototype.push) {  Array.prototype.push = function array_push() {   for(var i=0;i<arguments.length;i++)    this[this.length]=arguments[i];   return this.length;  } }; if (!Array.prototype.pop) {  Array.prototype.pop = function array_pop() {   lastElement = this[this.length-1];   this.length = Math.max(this.length-1,0);   return lastElement;  } }; 5)css:/*--------------------------------------------------|| dTree 2.05 | www.destroydrop.com/javascript/tree/ ||---------------------------------------------------|| Copyright (c) 2002-2003 Geir Landr�               ||--------------------------------------------------*/ .dtree { font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 11px; color: #666; white-space: nowrap;}.dtree img { border: 0px; vertical-align: middle;}.dtree a { color: #333; text-decoration: none;}.dtree a.node, .dtree a.nodeSel { white-space: nowrap; padding: 1px 2px 1px 2px;}.dtree a.node:hover, .dtree a.nodeSel:hover { color: #333; text-decoration: underline;}.dtree a.nodeSel { background-color: #c0d2ec;}.dtree .clip { overflow: hidden;}

阅读全文(12431) | 回复(6) | 编辑 | 精华

 


Dell spikes game site with Alienware systems
Men 6 Inch Boots(游客)发表评论于2010/4/1 17:12:20

Dell is taking steps to promote Alienware PCs on its Web site as the PC maker tries to collaborate more--rather than compete outright--with its Alienware unit. Dell has added the Area-51 m9750 to its gaming laptop Web site, according to a Dell company blog. Dell Web page features new Alienware game notebooks(Credit: Dell)"The Alien invasion has continued, with the addition of the Area-51 m9750 to the Dell gaming laptop Web site lineup," according Classic Timberland Boots to the post. The 17-inch notebook offers two 512MB GeForce 8700m GT cards as an option. The blog also notes: "It was never really in the cards to do away with the XPS gaming products early, but instead to integrate the development teams from both Alienware and XPS...The XPS isn't going away, though it may go in new directions as hinted by the XPS One and Women High Top Boots the slimline XPS m1330." A Wall Street Journal report had stated that Dell would quickly kill off its XPS line, which Dell later denied. The starting prices for two featured Dell XPS M1730 notebooks are about $600 Men 6 Inch Boots and $1,100 more than the starting prices for two featured Alienware systems on Dell's notebook gaming page.An Area-51 m9750, for exam...

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除

 


回复:dtree树形菜单比struts-menu好多了,必须夸奖一下
q(游客)发表评论于2010/1/13 13:36:24

孙永清 北京华江恒泰 华江恒泰 北京威龙 上海弗泰 上海弗泰 北京嘉华 上海申延机械 北京华科 北创沃得 北创沃得 北京百年华典 空调安装 液压 剪板机 北京空调加氟 北京空调清洗 模温机 收药 台湾液压 液压元件

 


回复:dtree树形菜单比struts-menu好多了,必须夸奖一下
gg(游客)发表评论于2007/11/26 16:27:18

谁来总结一下比较成熟的Web树状结构的解决方案-JavaScript-AJAX ... 有人用过struts-menu吗?简单的看过演示,好像也挺不错的。 ... rootid: 根节点的id rootname:根节点的名字 leafurl:鼠标点击leaf时执行的事件 ...www.javaeye.com/article/2567?page=3 - 25k - 网页快照 - 类似网页 谁来总结一下比较成熟的Web树状结构的解决方案- JavaScript ... rootid: 根节点的id rootname:根节点的名字 leafurl:鼠标点击leaf时执行的事件 .... 本人使用STRUTS MENU+XTREE 方案,能够实现XML配置树,XTREE展现树,感觉不错! ...www.javaeye.com/topic/2567?page=4 - 51k - 网页快照 - 类似网页 用VC++构建树视图控件-数据库开发园地 为m_MyTree设置一个图像列表,使CtreeCtrl的不同节点显示不同的图标 HTREEITEM m_item m_item=m_MyTree.InsertItem ("Root",0,0,0,0); //根节点的图标为IDI_BMP0 ...www.sqlsky.com/vc/070802/19980/ - 22k - 网页快照 - 类似网页 TONY BLOG-思念,远行

 


回复:dtree树形菜单比struts-menu好多了,必须夸奖一下
youyou(游客)发表评论于2007/5/25 18:19:14

打个包出来,也让我们学习一下,还可以帮你测试一把。szq68254@163.com

 


回复:dtree树形菜单比struts-menu好多了,必须夸奖一下
snowrose发表评论于2007/1/19 21:45:55

你是谁?告诉我给你买糖

 


回复:dtree树形菜单比struts-menu好多了,必须夸奖一下
对不起,我爱你(游客)发表评论于2007/1/19 17:30:46

哎呀,你是我QQ 里的好友啊.给你3个机会猜我是谁.好久不见了,没想到搜个帖子居然搜到你的BLOG里来了.缘分哪.不过现在不能注册,只能游客了。.俺会天天来的

 


» 1 »

发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)

 
 



The Neurotic Fishbowl

.: 公告




Bloginess

«September 2025»
123456
78910111213
14151617181920
21222324252627
282930

.: 我的分类(专题)

首页(130)
RIA(22)
linux(3)
J2EE(24)
the mood of everyday(58)
oral English(14)
database(2)
soap(3)
java(9)
web developer center(14)


In the Bowl

.: 最新日志

倾情奉献iphone、ipod、ipho
check ipad's rotatio
css position fixed d
field validation whe
常见浏览器cookie个数和大小限制说明
人类无法抗拒的10种心理,学会它,就能控
读as3cookbook 有感
flex builder linux s
Component returned f
use tramp in emacs i


.: 最新回复

replcica watches
replcica watches
Dell spikes game sit
回复:人类无法抗拒的10种心理,学会它,
回复:人类无法抗拒的10种心理,学会它,
回复:flex builder linu
回复:人类无法抗拒的10种心理,学会它,
回复:人类无法抗拒的10种心理,学会它,
回复:致女人------摘自读者
回复:虚心接受别人的意见,谨慎改正


The Fishkeeper
blog名称:up forever
日志总数:130
评论数量:274
留言数量:4
访问次数:1948953
建立时间:2006年5月25日



Text Me

.: 留言板

签写新留言

参观
这个界面很漂亮!
我试试吧
up forever
该换了!


Other Fish in the Sea

.: 链接


http://blogger.org.cn/blog/more.asp?name=hongrui&id=16955

邢红瑞 

http://niegc.cublog.cn/  聂国聪

http://www.blogjava.net/SteelHand/ 铁手剑谱

http://blog.sina.com.cn/qianqq 糖qq

http://blog.csdn.net/misty_wish   师弟

http://www.bbxy.net/xiaoyu/ Goteet老师

http://www.chinaitpower.com    中国it动力

http://jinyuxi.blog.sohu.com/ 靳羽西




lvetica, sans-serif; MARGIN: 0px 0px 8px; PADDING-BOTTOM: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px } DIV.blogrollmain { FONT: 12px verdana, arial, helvetica, sans-serif } BLOCKQUOTE { COLOR: #202020; FONT: 11px verdana, arial, helvetica, sans-serif } .tinyfont { FONT: 9px verdana, arial, helvetica, sans-serif } TD { COLOR: #202020; FONT-FAMILY: verdana; FONT-SIZE: 12px } .title { COLOR: #996897; FONT-FAMILY: verdana, sans-serif; FONT-SIZE: 10pt; FONT-WEIGHT: bold } .titlefont { COLOR: #996897; FONT-FAMILY: verdana, sans-serif; FONT-SIZE: 14px; FONT-STYLE: italic } .titlefontarch { BORDER-BOTTOM: 1px solid; BORDER-LEFT: 1px solid; BORDER-RIGHT: 1px solid; BORDER-TOP: 1px solid; COLOR: #996897; FONT-FAMILY: verdana, sans-serif; FONT-SIZE: 14px; TEXT-ALIGN: center; WIDTH: 100% } .menu_text { COLOR: #c1ae94; FONT-FAMILY: Verdana, Arial, sans-serif; FONT-SIZE: 10px; MARGIN-BOTTOM: 1px } .links { FONT-FAMILY: Verdana, Arial, sans-serif; FONT-SIZE: 11px } .smallfont { COLOR: #202020; FONT-FAMILY: Verdana, Arial, sans-serif; FONT-SIZE: 11px; MARGIN: 0px } A:link { COLOR: #996897; TEXT-DECORATION: none } A:visited { COLOR: #996897; TEXT-DECORATION: none } A:hover { BACKGROUND-COLOR: #996897; COLOR: #610862; TEXT-DECORATION: underline } A { TEXT-DECORATION: none } .content { WIDTH: auto } .dateheader { MARGIN: 0px; PADDING-BOTTOM: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; PADDING-TOP: 0px; POSITION: relative; WIDTH: auto; Z-INDEX: 3; min-width: 120px } .wbtn1 { BACKGROUND-COLOR: #ffffff; BORDER-BOTTOM: #996897 1px solid; BORDER-LEFT: #996897 1px solid; BORDER-RIGHT: #996897 1px solid; BORDER-TOP: #996897 1px solid; COLOR: #996897; FONT-FAMILY: verdana, arial geneva; FONT-SIZE: 7pt; TEXT-DECORATION: none } .calendar { PADDING-BOTTOM: 4px; PADDING-LEFT: 4px; PADDING-RIGHT: 4px; PADDING-TOP: 4px; TEXT-ALIGN: center } .calhead { BACKGROUND-COLOR: #ffffff; BORDER-BOTTOM: gray 1px solid; COLOR: black; TEXT-ALIGN: center; VERTICAL-ALIGN: middle; WIDTH: 14% } .calbody { BORDER-BOTTOM: 1px solid; TEXT-ALIGN: center; VERTICAL-ALIGN: middle; WIDTH: 14% } .style2 {color: #996897}
本站首页    管理页面    写新日志    退出

The Neurotic Fishbowl

[J2EE]dtree树形菜单比struts-menu好多了,必须夸奖一下
snowrose 发表于 2007/1/16 16:45:17

这几天在做一个树形菜单,找了半天的例子,从struts-menu到自己研究,最后发现d-tree太好了,excellent,非常灵活,而且比较简单,不想struts-menu到处都是tld标签,看他的源码也非常费劲,因为一般的代码都是因需求而定,而struts-menu虽然把权限,菜单继承在一起,但有个最大的问题就是灵活性,做代码的都知道与其修改别人的代码不如自己写的快,又拓宽自己的知识面,于是我选了第二种,写了一个集权限,树形菜单,管理员于一体的,华丽的,高贵的,富丽堂皇的,光彩夺目的模块,总称为系统管理,因为每个项目都有这个结构吧,只是因人不同,好了,先贴一个数据流程图: 500)this.width=500'> 然后把树形菜单的代码贴如下: 1)顶部菜单          <%          java.util.HashSet set=(java.util.HashSet)request.getAttribute("moduleSet");          java.util.Iterator ir1 = set.iterator();    while(ir1.hasNext()){          com.dodomark.db.Module module=(com.dodomark.db.Module)ir1.next();            int i=0;          if(module.getParent()==null){                %>          <td>       <table width="90"  border="0" align="center" cellpadding="0" cellspacing="0" id="table<%=i++%>">              <tr>                <td width="9%"><img id="img1" src="../images/yellow-tab-left.gif" width="9" height="29"></td>                <td id="td1" width="81%" background="../images/yellow-tab.gif">                <div align="center">                 <a href="javascript :getMenu('module.do?call=listMoudleByParent&parentId=<%=module.getModuleId()%>');"><%=module.getModuleName()%></a>                </div>                </td>                <td width="10%"><img id="img2" src="../images/yellow-tab-right.gif" width="9" height="29"></td>              </tr>          </table>    </td><%}}%> 2)生成左侧菜单的action:    public ActionForward listMoudleByParent(ActionMapping actionMapping,   ActionForm actionForm, HttpServletRequest httpServletRequest,   HttpServletResponse httpServletResponse) throws Exception {      System.out.println("%%%%%%%%%%%%%%%%%%%%%%%%%%%%");    if (log.isDebugEnabled()) {   log.debug("entering 'list' method...");  }  Long parentId=new Long(httpServletRequest.getParameter("parentId"));  WebApplicationContext wac = WebApplicationContextUtils    .getRequiredWebApplicationContext(this.getServlet()      .getServletContext());  moduleService = (ModuleService) wac.getBean("moduleService");  Module parent=moduleService.findModuleById(parentId);  Set set=parent.getChild();  List list=java.util.Arrays.asList(set.toArray());   System.out.println(list.toString()+"*****************"+list.size());  httpServletRequest.setAttribute("children", list);  return actionMapping.findForward("listchildren"); }3)生成左侧菜单的页面: <script type="text/javascript">  d = new dTree('d');  d.add(<%=request.getAttribute("parentId")%>,-1,'ROOT');   <%    if(request.getAttribute("children")!=null){    java.util.List list=(java.util.List)request.getAttribute("children");    for(int i=0;i<list.size();i++){    com.dodomark.db.Module module=(com.dodomark.db.Module)list.get(i);     %>         d.add(<%=module.getModuleId()%>,<%=module.getParent().getModuleId()%>,'<%=module.getModuleName()%>','<%=module.getUrl()%>','<%=module.getTitle()%>','mainIframe')     <% }    }  %> document.write(d); </script> 4)javascript : /*--------------------------------------------------| | dTree 2.05 | www.destroydrop.com/javascript/tree/ | |---------------------------------------------------| | Copyright (c) 2002-2003 Geir Landr�               | |                                                   | | This script can be used freely as long as all     | | copyright messages are intact.                    | |                                                   | | Updated: 17.04.2003                               | |--------------------------------------------------*/   // Node object function Node(id, pid, name, url, title, target, icon, iconOpen, open) {  this.id = id;  this.pid = pid;  this.name = name;  this.url = url;  this.title = title;  this.target = target;  this.icon = icon;  this.iconOpen = iconOpen;  this._io = open || false;  this._is = false;  this._ls = false;  this._hc = false;  this._ai = 0;  this._p; };   // Tree object function dTree(objName) {  this.config = {   target     : null,   folderLinks   : true,   useSelection  : true,   useCookies   : true,   useLines    : true,   useIcons    : true,   useStatusText  : false,   closeSameLevel : false,   inOrder     : false  }  this.icon = {   root    : 'img/base.gif',   folder   : 'img/folder.gif',   folderOpen : 'img/folderopen.gif',   node    : 'img/page.gif',   empty    : 'img/empty.gif',   line    : 'img/line.gif',   join    : 'img/join.gif',   joinBottom : 'img/joinbottom.gif',   plus    : 'img/plus.gif',   plusBottom : 'img/plusbottom.gif',   minus    : 'img/minus.gif',   minusBottom : 'img/minusbottom.gif',   nlPlus   : 'img/nolines_plus.gif',   nlMinus   : 'img/nolines_minus.gif'  };  this.obj = objName;  this.aNodes = [];  this.aIndent = [];  this.root = new Node(-1);  this.selectedNode = null;  this.selectedFound = false;  this.completed = false; };   // Adds a new node to the node array dTree.prototype.add = function(id, pid, name, url, title, target, icon, iconOpen, open) {  this.aNodes[this.aNodes.length] = new Node(id, pid, name, url, title, target, icon, iconOpen, open); };   // Open/close all nodes dTree.prototype.openAll = function() {  this.oAll(true); }; dTree.prototype.closeAll = function() {  this.oAll(false); };   // Outputs the tree to the page dTree.prototype.toString = function() {  var str = '<div class="dtree">\n';  if (document.getElementById) {   if (this.config.useCookies) this.selectedNode = this.getSelected();   str += this.addNode(this.root);  } else str += 'Browser not supported.';  str += '</div>';  if (!this.selectedFound) this.selectedNode = null;  this.completed = true;  return str; };   // Creates the tree structure dTree.prototype.addNode = function(pNode) {  var str = '';  var n=0;  if (this.config.inOrder) n = pNode._ai;  for (n; n<this.aNodes.length; n++) {   if (this.aNodes[n].pid == pNode.id) {    var cn = this.aNodes[n];    cn._p = pNode;    cn._ai = n;    this.setCS(cn);    if (!cn.target && this.config.target) cn.target = this.config.target;    if (cn._hc && !cn._io && this.config.useCookies) cn._io = this.isOpen(cn.id);    if (!this.config.folderLinks && cn._hc) cn.url = null;    if (this.config.useSelection && cn.id == this.selectedNode && !this.selectedFound) {      cn._is = true;      this.selectedNode = n;      this.selectedFound = true;    }    str += this.node(cn, n);    if (cn._ls) break;   }  }  return str; };   // Creates the node icon, url and text dTree.prototype.node = function(node, nodeId) {  var str = '<div class="dTreeNode">' + this.indent(node, nodeId);  if (this.config.useIcons) {   if (!node.icon) node.icon = (this.root.id == node.pid) ? this.icon.root : ((node._hc) ? this.icon.folder : this.icon.node);   if (!node.iconOpen) node.iconOpen = (node._hc) ? this.icon.folderOpen : this.icon.node;   if (this.root.id == node.pid) {    node.icon = this.icon.root;    node.iconOpen = this.icon.root;   }   str += '<img id="i' + this.obj + nodeId + '" src="' + ((node._io) ? node.iconOpen : node.icon) + '" alt="" />';  }  if (node.url) {   str += '<a id="s' + this.obj + nodeId + '" class="' + ((this.config.useSelection) ? ((node._is ? 'nodeSel' : 'node')) : 'node') + '" href="' + node.url + '"';   if (node.title) str += ' title="' + node.title + '"';   if (node.target) str += ' target="' + node.target + '"';   if (this.config.useStatusText) str += ' onmouseover="window.status=\'' + node.name + '\';return true;" onmouseout="window.status=\'\';return true;" ';   if (this.config.useSelection && ((node._hc && this.config.folderLinks) || !node._hc))    str += ' onclick="javascript : ' + this.obj + '.s(' + nodeId + ');"';   str += '>';  }  else if ((!this.config.folderLinks || !node.url) && node._hc && node.pid != this.root.id)   str += '<a href="javascript : ' + this.obj + '.o(' + nodeId + ');" class="node">';  str += node.name;  if (node.url || ((!this.config.folderLinks || !node.url) && node._hc)) str += '</a>';  str += '</div>';  if (node._hc) {   str += '<div id="d' + this.obj + nodeId + '" class="clip" style="display:' + ((this.root.id == node.pid || node._io) ? 'block' : 'none') + ';">';   str += this.addNode(node);   str += '</div>';  }  this.aIndent.pop();  return str; };   // Adds the empty and line icons dTree.prototype.indent = function(node, nodeId) {  var str = '';  if (this.root.id != node.pid) {   for (var n=0; n<this.aIndent.length; n++)    str += '<img src="' + ( (this.aIndent[n] == 1 && this.config.useLines) ? this.icon.line : this.icon.empty ) + '" alt="" />';   (node._ls) ? this.aIndent.push(0) : this.aIndent.push(1);   if (node._hc) {    str += '<a href="javascript : ' + this.obj + '.o(' + nodeId + ');"><img id="j' + this.obj + nodeId + '" src="';    if (!this.config.useLines) str += (node._io) ? this.icon.nlMinus : this.icon.nlPlus;    else str += ( (node._io) ? ((node._ls && this.config.useLines) ? this.icon.minusBottom : this.icon.minus) : ((node._ls && this.config.useLines) ? this.icon.plusBottom : this.icon.plus ) );    str += '" alt="" /></a>';   } else str += '<img src="' + ( (this.config.useLines) ? ((node._ls) ? this.icon.joinBottom : this.icon.join ) : this.icon.empty) + '" alt="" />';  }  return str; };   // Checks if a node has any children and if it is the last sibling dTree.prototype.setCS = function(node) {  var lastId;  for (var n=0; n<this.aNodes.length; n++) {   if (this.aNodes[n].pid == node.id) node._hc = true;   if (this.aNodes[n].pid == node.pid) lastId = this.aNodes[n].id;  }  if (lastId==node.id) node._ls = true; };   // Returns the selected node dTree.prototype.getSelected = function() {  var sn = this.getCookie('cs' + this.obj);  return (sn) ? sn : null; };   // Highlights the selected node dTree.prototype.s = function(id) {  if (!this.config.useSelection) return;  var cn = this.aNodes[id];  if (cn._hc && !this.config.folderLinks) return;  if (this.selectedNode != id) {   if (this.selectedNode || this.selectedNode==0) {    eOld = document.getElementById("s" + this.obj + this.selectedNode);    eOld.className = "node";   }   eNew = document.getElementById("s" + this.obj + id);   eNew.className = "nodeSel";   this.selectedNode = id;   if (this.config.useCookies) this.setCookie('cs' + this.obj, cn.id);  } };   // Toggle Open or close dTree.prototype.o = function(id) {  var cn = this.aNodes[id];  this.nodeStatus(!cn._io, id, cn._ls);  cn._io = !cn._io;  if (this.config.closeSameLevel) this.closeLevel(cn);  if (this.config.useCookies) this.updateCookie(); };   // Open or close all nodes dTree.prototype.oAll = function(status) {  for (var n=0; n<this.aNodes.length; n++) {   if (this.aNodes[n]._hc && this.aNodes[n].pid != this.root.id) {    this.nodeStatus(status, n, this.aNodes[n]._ls)    this.aNodes[n]._io = status;   }  }  if (this.config.useCookies) this.updateCookie(); };   // Opens the tree to a specific node dTree.prototype.openTo = function(nId, bSelect, bFirst) {  if (!bFirst) {   for (var n=0; n<this.aNodes.length; n++) {    if (this.aNodes[n].id == nId) {     nId=n;     break;    }   }  }  var cn=this.aNodes[nId];  if (cn.pid==this.root.id || !cn._p) return;  cn._io = true;  cn._is = bSelect;  if (this.completed && cn._hc) this.nodeStatus(true, cn._ai, cn._ls);  if (this.completed && bSelect) this.s(cn._ai);  else if (bSelect) this._sn=cn._ai;  this.openTo(cn._p._ai, false, true); };   // Closes all nodes on the same level as certain node dTree.prototype.closeLevel = function(node) {  for (var n=0; n<this.aNodes.length; n++) {   if (this.aNodes[n].pid == node.pid && this.aNodes[n].id != node.id && this.aNodes[n]._hc) {    this.nodeStatus(false, n, this.aNodes[n]._ls);    this.aNodes[n]._io = false;    this.closeAllChildren(this.aNodes[n]);   }  } }   // Closes all children of a node dTree.prototype.closeAllChildren = function(node) {  for (var n=0; n<this.aNodes.length; n++) {   if (this.aNodes[n].pid == node.id && this.aNodes[n]._hc) {    if (this.aNodes[n]._io) this.nodeStatus(false, n, this.aNodes[n]._ls);    this.aNodes[n]._io = false;    this.closeAllChildren(this.aNodes[n]);     }  } }   // Change the status of a node(open or closed) dTree.prototype.nodeStatus = function(status, id, bottom) {  eDiv = document.getElementById('d' + this.obj + id);  eJoin = document.getElementById('j' + this.obj + id);  if (this.config.useIcons) {   eIcon = document.getElementById('i' + this.obj + id);   eIcon.src = (status) ? this.aNodes[id].iconOpen : this.aNodes[id].icon;  }  eJoin.src = (this.config.useLines)?  ((status)?((bottom)?this.icon.minusBottom:this.icon.minus):((bottom)?this.icon.plusBottom:this.icon.plus)):  ((status)?this.icon.nlMinus:this.icon.nlPlus);  eDiv.style.display = (status) ? 'block': 'none'; };     // [Cookie] Clears a cookie dTree.prototype.clearCookie = function() {  var now = new Date();  var yesterday = new Date(now.getTime() - 1000 * 60 * 60 * 24);  this.setCookie('co'+this.obj, 'cookieValue', yesterday);  this.setCookie('cs'+this.obj, 'cookieValue', yesterday); };   // [Cookie] Sets value in a cookie dTree.prototype.setCookie = function(cookieName, cookieValue, expires, path, domain, secure) {  document.cookie =   escape(cookieName) + '=' + escape(cookieValue)   + (expires ? '; expires=' + expires.toGMTString() : '')   + (path ? '; path=' + path : '')   + (domain ? '; domain=' + domain : '')   + (secure ? '; secure' : ''); };   // [Cookie] Gets a value from a cookie dTree.prototype.getCookie = function(cookieName) {  var cookieValue = '';  var posName = document.cookie.indexOf(escape(cookieName) + '=');  if (posName != -1) {   var posValue = posName + (escape(cookieName) + '=').length;   var endPos = document.cookie.indexOf(';', posValue);   if (endPos != -1) cookieValue = unescape(document.cookie.substring(posValue, endPos));   else cookieValue = unescape(document.cookie.substring(posValue));  }  return (cookieValue); };   // [Cookie] Returns ids of open nodes as a string dTree.prototype.updateCookie = function() {  var str = '';  for (var n=0; n<this.aNodes.length; n++) {   if (this.aNodes[n]._io && this.aNodes[n].pid != this.root.id) {    if (str) str += '.';    str += this.aNodes[n].id;   }  }  this.setCookie('co' + this.obj, str); };   // [Cookie] Checks if a node id is in a cookie dTree.prototype.isOpen = function(id) {  var aOpen = this.getCookie('co' + this.obj).split('.');  for (var n=0; n<aOpen.length; n++)   if (aOpen[n] == id) return true;  return false; };   // If Push and pop is not implemented by the browser if (!Array.prototype.push) {  Array.prototype.push = function array_push() {   for(var i=0;i<arguments.length;i++)    this[this.length]=arguments[i];   return this.length;  } }; if (!Array.prototype.pop) {  Array.prototype.pop = function array_pop() {   lastElement = this[this.length-1];   this.length = Math.max(this.length-1,0);   return lastElement;  } }; 5)css:/*--------------------------------------------------|| dTree 2.05 | www.destroydrop.com/javascript/tree/ ||---------------------------------------------------|| Copyright (c) 2002-2003 Geir Landr�               ||--------------------------------------------------*/ .dtree { font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 11px; color: #666; white-space: nowrap;}.dtree img { border: 0px; vertical-align: middle;}.dtree a { color: #333; text-decoration: none;}.dtree a.node, .dtree a.nodeSel { white-space: nowrap; padding: 1px 2px 1px 2px;}.dtree a.node:hover, .dtree a.nodeSel:hover { color: #333; text-decoration: underline;}.dtree a.nodeSel { background-color: #c0d2ec;}.dtree .clip { overflow: hidden;}

阅读全文(12431) | 回复(6) | 编辑 | 精华

 


Dell spikes game site with Alienware systems
Men 6 Inch Boots(游客)发表评论于2010/4/1 17:12:20

Dell is taking steps to promote Alienware PCs on its Web site as the PC maker tries to collaborate more--rather than compete outright--with its Alienware unit. Dell has added the Area-51 m9750 to its gaming laptop Web site, according to a Dell company blog. Dell Web page features new Alienware game notebooks(Credit: Dell)"The Alien invasion has continued, with the addition of the Area-51 m9750 to the Dell gaming laptop Web site lineup," according Classic Timberland Boots to the post. The 17-inch notebook offers two 512MB GeForce 8700m GT cards as an option. The blog also notes: "It was never really in the cards to do away with the XPS gaming products early, but instead to integrate the development teams from both Alienware and XPS...The XPS isn't going away, though it may go in new directions as hinted by the XPS One and Women High Top Boots the slimline XPS m1330." A Wall Street Journal report had stated that Dell would quickly kill off its XPS line, which Dell later denied. The starting prices for two featured Dell XPS M1730 notebooks are about $600 Men 6 Inch Boots and $1,100 more than the starting prices for two featured Alienware systems on Dell's notebook gaming page.An Area-51 m9750, for exam...

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除

 


回复:dtree树形菜单比struts-menu好多了,必须夸奖一下
q(游客)发表评论于2010/1/13 13:36:24

孙永清 北京华江恒泰 华江恒泰 北京威龙 上海弗泰 上海弗泰 北京嘉华 上海申延机械 北京华科 北创沃得 北创沃得 北京百年华典 空调安装 液压 剪板机 北京空调加氟 北京空调清洗 模温机 收药 台湾液压 液压元件

 


回复:dtree树形菜单比struts-menu好多了,必须夸奖一下
gg(游客)发表评论于2007/11/26 16:27:18

谁来总结一下比较成熟的Web树状结构的解决方案-JavaScript-AJAX ... 有人用过struts-menu吗?简单的看过演示,好像也挺不错的。 ... rootid: 根节点的id rootname:根节点的名字 leafurl:鼠标点击leaf时执行的事件 ...www.javaeye.com/article/2567?page=3 - 25k - 网页快照 - 类似网页 谁来总结一下比较成熟的Web树状结构的解决方案- JavaScript ... rootid: 根节点的id rootname:根节点的名字 leafurl:鼠标点击leaf时执行的事件 .... 本人使用STRUTS MENU+XTREE 方案,能够实现XML配置树,XTREE展现树,感觉不错! ...www.javaeye.com/topic/2567?page=4 - 51k - 网页快照 - 类似网页 用VC++构建树视图控件-数据库开发园地 为m_MyTree设置一个图像列表,使CtreeCtrl的不同节点显示不同的图标 HTREEITEM m_item m_item=m_MyTree.InsertItem ("Root",0,0,0,0); //根节点的图标为IDI_BMP0 ...www.sqlsky.com/vc/070802/19980/ - 22k - 网页快照 - 类似网页 TONY BLOG-思念,远行

 


回复:dtree树形菜单比struts-menu好多了,必须夸奖一下
youyou(游客)发表评论于2007/5/25 18:19:14

打个包出来,也让我们学习一下,还可以帮你测试一把。szq68254@163.com

 


回复:dtree树形菜单比struts-menu好多了,必须夸奖一下
snowrose发表评论于2007/1/19 21:45:55

你是谁?告诉我给你买糖

 


回复:dtree树形菜单比struts-menu好多了,必须夸奖一下
对不起,我爱你(游客)发表评论于2007/1/19 17:30:46

哎呀,你是我QQ 里的好友啊.给你3个机会猜我是谁.好久不见了,没想到搜个帖子居然搜到你的BLOG里来了.缘分哪.不过现在不能注册,只能游客了。.俺会天天来的

 


» 1 »

发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)

 
 



The Neurotic Fishbowl

.: 公告




Bloginess

«September 2025»
123456
78910111213
14151617181920
21222324252627
282930

.: 我的分类(专题)

首页(130)
RIA(22)
linux(3)
J2EE(24)
the mood of everyday(58)
oral English(14)
database(2)
soap(3)
java(9)
web developer center(14)


In the Bowl

.: 最新日志

倾情奉献iphone、ipod、ipho
check ipad's rotatio
css position fixed d
field validation whe
常见浏览器cookie个数和大小限制说明
人类无法抗拒的10种心理,学会它,就能控
读as3cookbook 有感
flex builder linux s
Component returned f
use tramp in emacs i


.: 最新回复

replcica watches
replcica watches
Dell spikes game sit
回复:人类无法抗拒的10种心理,学会它,
回复:人类无法抗拒的10种心理,学会它,
回复:flex builder linu
回复:人类无法抗拒的10种心理,学会它,
回复:人类无法抗拒的10种心理,学会它,
回复:致女人------摘自读者
回复:虚心接受别人的意见,谨慎改正


The Fishkeeper
blog名称:up forever
日志总数:130
评论数量:274
留言数量:4
访问次数:1948953
建立时间:2006年5月25日



Text Me

.: 留言板

签写新留言

参观
这个界面很漂亮!
我试试吧
up forever
该换了!


Other Fish in the Sea

.: 链接


http://blogger.org.cn/blog/more.asp?name=hongrui&id=16955

邢红瑞 

http://niegc.cublog.cn/  聂国聪

http://www.blogjava.net/SteelHand/ 铁手剑谱

http://blog.sina.com.cn/qianqq 糖qq

http://blog.csdn.net/misty_wish   师弟

http://www.bbxy.net/xiaoyu/ Goteet老师

http://www.chinaitpower.com    中国it动力

http://jinyuxi.blog.sohu.com/ 靳羽西




站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.047 second(s), page refreshed 144788086 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号