[J2EE] dtree树形菜单比struts-menu好多了,必须夸奖一下
这几天在做一个树形菜单,找了半天的例子,从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;}
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好多了,必须夸奖一下
你是谁?告诉我给你买糖
回复:dtree树形菜单比struts-menu好多了,必须夸奖一下
对不起,我爱你(游客)发表评论于2007/1/19 17:30:46
哎呀,你是我QQ 里的好友啊.给你3个机会猜我是谁.好久不见了,没想到搜个帖子居然搜到你的BLOG里来了.缘分哪.不过现在不能注册,只能游客了。.俺会天天来的
» 1 »
.: 公告
« September 2025 » 日 一 二 三 四 五 六 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
.: 我的分类(专题)
.: 最新日志
.: 最新回复
blog名称:up forever 日志总数:130 评论数量:274 留言数量:4 访问次数:1948953 建立时间:2006年5月25日
.: 留言板
.: 链接