在公司做了一个树形菜单。由于要基于公司的soa架构,返回客户端的字符是ajax返回的json字符串。于是自己就采用了xtree开源静态的javascript树形控件。通过自己的javascript版本掉用之。
主要用到的javascript方法如下:
/** * 初始化树形菜单 */ function initPartTreeView(data) { /** 从后台服务传回来的数据结构类似如下数据的数据结构 var data = {"id": "0", "name": "root", "childrenList": [ {"id": "1", "name": "name1", "childrenList": [{"id": "11", "name": "name11"}]}, {"id": "2", "name": "name2", "childrenList": []}, {"id": "3", "name": "name3", "childrenList": [] } ]}; **/ //组装树 tree = intiCircle(tree, data); document.getElementById("partTreeView").innerHTML = tree; } /** * 用递归的方法初始化树形菜单 */ function intiCircle(tree,data) { var id = data.id; var name = data.name; var treeItem = new WebFXTreeItem(name, "javascript: showDeptAndStuff('" + id + "')"); //如果没有根节点则首先创建根节点 if(!tree) { tree = new WebFXTree(data.name, "javascript: showDeptAndStuff('" + id + "')"); treeItem = tree; } else { tree.add(treeItem); } //循环递归构建子节点 var relist = data.childrenList; if(relist) { for(var i = 0; i < relist.length; i++) { var ddate = relist[i]; intiCircle(treeItem, ddate); } } return tree; }
主要用到的后台java代码如下:
/** * 根据 上级部门No 得到部门树状字符串 * @param id * @return */ @Override public String getBranchTreeString(String parentNO) { //得到相同级别部门(在同一部门下的)列表 List branchList = this.getBranch(parentNO); String jsonString = ""; //循环组装同级部门 for(int i = 0; i < branchList.size(); i++) { DataObject dataObject = (DataObject) branchList.get(i); //如果前边已经有项目,则用","分开 if(!jsonString.equals("")) { jsonString = jsonString + " , "; } jsonString = jsonString + "{ \"id\": \"" + dataObject.getString("DEP_NO") + "\"" + " , \"name\": \"" + dataObject.getString("DEP_NAME") + "\"" + " , \"childrenList\": [" + this.getBranchTreeString(dataObject.getString("DEP_NO")) + "]" + " }"; } return jsonString; } /** * 得到相同上级部门的部门列表 * @param parentNO 上级部门No * @return */ public List getBranch(String parentNO) { //组装参数 Map param = new HashMap(); param.put("SUPER_DEP_NO", parentNO); DataObject dataObject = das.excuteQuery("SelectDepartInforBySuperDeptNoForBranchTree", param); return dataObject.getList("DEPT_INFO"); }
上面的代码并不完整,因为只是为了表达一个意思,就是树形菜单和多叉树的关系。简而言之,多叉数其实就是树形菜单的一个数据结构模型。以前在学校学数据结构的的时候,从用c++写过遍历多叉树的东西。这几天做了一个无限级树形菜单,在做的时候也没有想到在学校学习的东西。等做完了才突然间意识到自己写了一个遍历多叉数的算法。而且这个算法的核心就是“递归调用”。