0 0

树形菜单生成5

id name   pid  isSon
主键 菜单名称 父id 是否有子菜单


<li isexpand="false">
            <span>节点3</span>
            <ul>
                <li><span>节点3.1</span></li>
                <li><span>节点3.2</span></li>
            </ul>
   </li>
   读取的数据就是要拼接成这样的格式,每对<li></li>就是一个节点,节点名称用<span></span>包裹
   如果这个菜单下有子菜单的话,子菜单就包裹在<ul></ul>里,以此类推。我的想法就是一次性把所有的菜单拉取出来,
   在内存里采用递归遍历,发现这个菜单有子菜单就立即去查询其子菜单,只到拼接完所有的菜单。我自己拼接了很多次,由于经验不足
   没能正确的拼接出来。希望大家想想怎样拼接……
2013年6月06日 10:27

6个答案 按时间排序 按投票排序

0 0

采纳的答案

package tree;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.collections.CollectionUtils;


public class TreeBuilder {

    /**
     * 将集合建立成树结构
     *
     * @param dirs
     * @return
     */
    @SuppressWarnings("unchecked")
    private List<Node> buildListToTree(List<Node> dirs) {
        List<Node> roots = findRoots(dirs);
        List<Node> notRoots = (List<Node>) CollectionUtils.subtract(dirs, roots);
        for (Node root : roots) {
            root.setChildren(findChildren(root, notRoots));
        }
        return roots;
    }

    /**
     * 找出集合中的根元素
     *
     * @param allDirs
     * @return
     */
    public List<Node> findRoots(List<Node> allNodes) {
        List<Node> results = new ArrayList<Node>();
        for (Node node : allNodes) {
            boolean isRoot = true;
            for (Node comparedOne : allNodes) {
                if (node.getParentId() == comparedOne.getId()) {
                    isRoot = false;
                    break;
                }
            }
            if (isRoot) {
                node.setLevel(0);
                results.add(node);
                node.setRootId(node.getId());
            }
        }
        return results;
    }

    /**
     * 递归找子目录
     *
     * @param root
     * @param allDirs
     * @return
     */
    @SuppressWarnings("unchecked")
    private List<Node> findChildren(Node root, List<Node> allNodes) {
        List<Node> children = new ArrayList<Node>();

        for (Node comparedOne : allNodes) {
            if (comparedOne.getParentId() == root.getId()) {
                comparedOne.setParent(root);
                comparedOne.setLevel(root.getLevel() + 1);
                children.add(comparedOne);
            }
        }
        List<Node> notChildren = (List<Node>) CollectionUtils.subtract(allNodes, children);
        for (Node child : children) {
            List<Node> tmpChildren = findChildren(child, notChildren);
            if (tmpChildren == null || tmpChildren.size() < 1) {
                child.setLeaf(true);
            } else {
                child.setLeaf(false);
            }
            child.setChildren(tmpChildren);
        }
        return children;
    }
   
    public static void main(String[] args) {
        TreeBuilder tb = new TreeBuilder();
        List<Node> allNodes = new ArrayList<Node>();
        allNodes.add(new Node(1,0,"节点1"));
        allNodes.add(new Node(2,0,"节点2"));
        allNodes.add(new Node(3,0,"节点3"));
        allNodes.add(new Node(4,1,"节点4"));
        allNodes.add(new Node(5,1,"节点5"));
        allNodes.add(new Node(6,1,"节点6"));
        allNodes.add(new Node(7,4,"节点7"));
        allNodes.add(new Node(8,4,"节点8"));
        allNodes.add(new Node(9,5,"节点9"));
        allNodes.add(new Node(10,100,"节点10"));
        List<Node> roots = tb.buildListToTree(allNodes);
        for(Node n:roots){
            System.out.println(n);
        }
       
    }
}






package tree;

import java.util.List;

public class Node implements java.io.Serializable {
private static final long serialVersionUID = -2721191232926604726L;

private int id;

private int parentId;

private Node parent;

private List<Node> children;

private String name;

private int level;

private int sort;

private int rootId;

private String type;

private boolean isLeaf;

private String description;


public Node() {
super();
}

public Node(int id, int parentId, String name) {
super();
this.id = id;
this.parentId = parentId;
this.name = name;
}


public String getDescription() {
return description;
}

public void setDescription(String description) {
this.description = description;
}

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public Node getParent() {
return parent;
}

public void setParent(Node parent) {
this.parent = parent;
}

public int getParentId() {
return parentId;
}

public void setParentId(int parentId) {
this.parentId = parentId;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getLevel() {
return level;
}

public void setLevel(int level) {
this.level = level;
}

public String getType() {
return type;
}

public List<Node> getChildren() {
return children;
}

public void setChildren(List<Node> children) {
this.children = children;
}

public void setType(String type) {
this.type = type;
}

public boolean isLeaf() {
return isLeaf;
}

public void setLeaf(boolean isLeaf) {
this.isLeaf = isLeaf;
}

public int getSort() {
return sort;
}

public void setSort(int sort) {
this.sort = sort;
}



public int getRootId() {
        return rootId;
    }

public void setRootId(int rootId) {
        this.rootId = rootId;
    }






   

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + id;
        result = prime * result + parentId;
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Node other = (Node) obj;
        if (id != other.id)
            return false;
        if (parentId != other.parentId)
            return false;
        return true;
    }

    @Override
public String toString() {
return "Node {id=" + id + ", parentId=" + parentId
+ ", children=" + children + ", name=" + name + "}";
}
}

2013年6月06日 12:05
0 0

问题的关键,是数据结构的问题。

2013年6月07日 16:44
0 0

2013年6月06日 21:04
0 0

可以用json格式返回来,
[{
    contactorName = 风扬,
    originProvinceCode = 402881e83a0586b6013a05b173960004,
    sonList=[{a="1",b="2",
           sonList_2=[{a="3",b="4",
        

           }]
    }],
    contactorName = 风扬_2,
     sonList=[{a="1",b="2",
           sonList_2=[{
                 a="3",
                 b="4",
                 sonList_3=[{
                    a="3",b="4"
                }]

           }]
    }],
}]

通过他们直接相关联的code把数据拼接成上面这样,然后再前台遍历就ok啦。

2013年6月06日 16:44
0 0

可以用json格式返回来,
[{
    contactorName = 风扬,
    originProvinceCode = 402881e83a0586b6013a05b173960004,
    sonList=[{a="1",b="2",
   

    }]
}]

2013年6月06日 16:36
0 0

贴后台代码

2013年6月06日 10:55

相关推荐

    java树形菜单生成和前端展示

    用到了阿里巴巴的JSON插件com.alibaba.fastjson.JSONObject,可以自行去网上下载。 index.html只用看286行即可,主要是对多层菜单结构的数据生成html 2个java文件实现了将结果集构建成一个菜单树。

    树形目录菜单生成器 .rar

    这个JavaScript版本的树形菜单生成器,意味着它可以动态地在网页上生成菜单,无需服务器端的额外处理。开发者只需要提供相应的数据结构,该生成器就能自动生成相应的HTML结构,展示出树形菜单。 使用这个生成器时,...

    无限级 树形菜单 动态生成

    综上所述,"无限级树形菜单 动态生成"项目结合了VS2005的Web开发能力和Sql2000的数据管理功能,实现了在Web页面上展示可动态扩展的、无限层级的菜单系统。这样的系统在网站导航、文件系统、组织架构展示等多个场景...

    动态生成树形菜单

    动态生成树形菜单

    dTree 生成无限级树形菜单

    本篇文章将深入探讨如何利用`dTree`来生成动态的树形菜单,并结合后台Action中的List数据进行操作。 首先,我们需要理解`dTree`的基本概念。`dTree`是一个基于JavaScript的开源库,它提供了一种简单的方式来创建...

    树形菜单页面日期生成

    树形菜单生成程序,可以按照自己需要修改代码

    java动态树形菜单

    在Java Web开发中,动态树形菜单是一种常见的用户界面元素,尤其在管理系统的导航部分,它能够以层次结构展示数据,使用户能直观地浏览和操作复杂的数据结构。本示例是一个基于Java实现的JSP动态树形菜单功能,旨在...

    jsp树形菜单 dtree tree 树形菜单

    在这个“jsp树形菜单 dtree tree 树形菜单”的项目中,我们将探讨如何利用JSP、dtree库以及可能的Struts框架来创建一个动态的树形菜单。 首先,JSP(JavaServer Pages)是一种基于Java的技术,用于创建动态Web内容...

    树形菜单例子

    在IT行业中,树形菜单是一种常见的用户界面元素,尤其在网站和应用程序的导航设计中扮演着重要角色。这种菜单结构模仿了计算机科学中的树数据结构,以层级方式展示信息,使得用户可以方便地浏览和访问多级内容。下面...

    好看实用js树形菜单

    在本案例中,"好看实用js树形菜单"是指利用JavaScript实现的一种交互式的、可视化的菜单结构,它通常用于网站或应用程序的导航,帮助用户更方便地浏览和访问层次结构的数据。 树形菜单的核心在于其递归的结构,每个...

    Java 实现的 简单树形菜单的生成 源码

    在Java编程中,树形菜单是一种常见的用户界面元素,它以层次结构展示数据,通常用于文件系统、组织架构或者复杂的导航系统。这个源码可能是为了帮助开发者理解和实现一个简单的树形菜单,使得用户可以通过展开和折叠...

    ajax树形菜单 动态显示

    在这个“ajax树形菜单 动态显示”的项目中,我们关注的是如何利用Ajax技术来实现一个交互式的、只在需要时加载内容的树形菜单。 树形菜单是一种常见的用户界面元素,它通过层级结构来展示信息,常用于网站导航、...

    s2sh+freemarker+jquery+jquery-treeview 无限级树形菜单.rar

    总的来说,这个项目结合了多种技术,利用Struts2处理请求,Spring进行依赖管理和事务控制,Hibernate处理数据,Freemarker生成动态页面,jQuery提供前端交互,而jquery-treeview则提供了树形菜单的可视化。...

    (推荐)超级漂亮的JS树形菜单

    JavaScript作为客户端脚本语言,使得树形菜单能够在用户的浏览器端动态生成和操作,无需服务器端的额外支持。 从压缩包子文件的文件名称列表"js树形菜单"来看,很可能包含了一个或多个JavaScript文件,这些文件可能...

    树形目录菜单生成器v1.0

    “树形目录菜单生成器v1.0”以其便捷的生成方式和丰富的定制选项,为开发者提供了一种高效构建树形菜单的解决方案。掌握并熟练运用这一工具,无疑能为软件和网站的用户界面增添亮点,提升整体用户体验。

    JavaScript实现树形菜单

    树形菜单是用户界面设计中常见的一种元素,尤其在数据层级结构复杂时,如文件系统、组织架构或导航菜单等场景。通过JavaScript实现树形菜单,可以有效地展示这些层次关系,并提供方便的展开、折叠、选择等功能。 ...

    javascript制作 树形菜单.zip

    在JavaScript编程中,树形菜单是一种常见的用户界面元素,它以层级结构展示数据,通常用于网站导航、文件系统浏览或数据库记录的展示。本压缩包包含两个文件:"可以拖动的IEtree树型.htm" 和 "树型结构_lj不错.htm"...

    JavaScript与web树形菜单全

    在这个主题中,我们将深入探讨JavaScript与Web树形菜单的关系,以及如何利用JavaScript创建无限级的树形菜单。 首先,让我们了解什么是树形菜单。树形菜单是一种以树状结构展现信息的界面组件,它允许用户通过展开...

Global site tag (gtag.js) - Google Analytics