目录树的数据库设计、java后台读取,以及前台javascript的显示

来源:互联网 发布:php中单双引号的区别 编辑:程序博客网 时间:2024/06/10 14:03

—–整理自凋落学长的笔记

我们网站肯定经常用到目录树

树在java web项目中的应用 ,主要是用来存储目录。

即这种:

这个 应该是从数据库查出来的 而不是写死在页面上的

如果每一个目录下 都可以有0-n个目录 是无限级别的 是存储在数据库中的 可维护的

1.数据库结构设计

那么 树形结构如何在关系数据库中存储中呢?

一对多 那种存储子目录吗?

这不行 ,因为是无限级别的 ,一对多只能两级。那如何存储不确定的分支数量 和不确定的分支级数。

简单的来说 ,表结构是这样的:

有一个根节点 父级id是 0

剩下的所有节点 全部具有父节点 主键自增就好了 ,父级id是该级别的上一级

url

即绝对路径 指从根节点到自己这里的所有经过的节点名称 中间用符号隔开

那么到这里大家可能想怎么查找? 我们可以在java后台中,查出list 然后再组合

2.java树结构

那么java怎么操作这个玩意儿?

java有List 有Map 有Set
但是没有tree

所以我们要自定义一个对象

我们这里可以叫menu对象

这四个属性确实和 数据库中的四个列

一一对应了。
但是我们如果仅仅是用List

来表达一个菜单的话,没有什么用。

所以接着写

每一个Menu对象 有 额外的两个属性。

父节点的实体对象 和子节点的Menu对象集合

于是 这就是一个 有父节点 有子节点 的对象

2.2 List《Menu》 转化成Menu root

我们需要用java代码把 parentMenu对象和 set赋值

至于 set基本上就简单了。大概就是

树的宽度遍历方法

先通过遍历List

对象 找到父id是0的,根节点 然后用上面的方法 把他的子节点通过递归赋值

大概就是这样了。

我们就可以得到一个Menu对象

它就是整个菜单

技巧:url

为什么要存储绝对路径

你可以用符号分割 大概这样:

url.split(“/”).length = ?

通过这个长度就可以得到 这是第几级目录

最后从数据库中查出来的Menu对象集合 通过这一整个大保健之后

就变成了一个Menu对象

3. 页面展示树

通常我们是把每个目录包含的连接什么的做成 文章开头那样目录树

通过一些js的tree.js这种函数库

这里我们为了方便用一个 列表来大概显示出来这些目录
<ul></ul>

这样大家先看着 。然后自己改进

我们在上一步中 直接把 Menu对象转化为

JSON格式

然后在页面中使用javascript代码解析 json字符串

也是 那个递归加循环的方法

然后通过append生成新的菜单列表

<%@taglib prefix="s" uri="/struts-tags" %><HTML><HEAD>    <script src="js/jquery-1.8.3.js" type="text/javascript"></script></HEAD><BODY id="0">    <a href="#" onclick="show('<s:property value="json"/>')">啊啊</a><script type="text/javascript">function show(jsonstr){    alert(jsonstr);    var m = eval("("+jsonstr+")");    parseJson(m);}    function parseJson(json){        $("#" + json.parentID).append("<ul id=" + json.ID + ">" + json.name + "</ul>");        if(json.menuSet.length>0){            $.each(json.menuSet,function(){                parseJson(this);            })        }else{            return;        }    }</script></BODY></HTML>

没有注释 应该不用写了吧。。。很简单的

然后看运行图

嗯 。大功告成

0 0
原创粉丝点击