jeasyui的树递归

来源:互联网 发布:属于网络系统安全技术 编辑:程序博客网 时间:2024/06/10 08:51

       大家都知道,树, 有很多枝干,枝干下有很多分支,分支下又有很多分支.....循环往复,如果我们想得到一棵对下的所有分支信息, 我们要通过一般的循环显然是很难实现的,因为你不知道每一个分去下会有多少分支, 这是不定的, 但我们可以写程序,让程序自己去判断节点下是否还有节点.

       jeasyui,自学过的也许很清楚,  获取树只需要传一个链接得到这个json数据,然后它自己会加载这棵树.以下是我做权限时,自己写的一个递归.

       首先,我们需要创建一个关于树的bean,名为TreeNode

public class TreeNode {public String getId() {return id;}public void setId(String id) {this.id = id;}public String getText() {return text;}public void setText(String text) {this.text = text;}public String getState() {return state;}public void setState(String state) {this.state = state;}public Map<String, Object> getAttributes() {return attributes;}public void setAttributes(Map<String, Object> attributes) {this.attributes = attributes;}public List<TreeNode> getChildren() {return children;}public void setChildren(List<TreeNode> children) {this.children = children;}public void setIconCls(String iconCls) {this.iconCls = iconCls;}public String getIconCls() {return iconCls;}private String id; //节点标识private String text;//节点显示名称private String state;//状态,'open' or  'closed'private String iconCls; //图标样式(该插件有个样式,可以自己修改或添加图标样式,如'icon-ok')private Map<String,Object> attributes;//附加信息(该字段说明树的信息是可扩展的,你可以将一个pojo的其它数据,也附给这个对象,下面会有说明)private List<TreeNode> children;//子节点信息}
      演示的pojo为模块实体,  该实体,你可以改成你自己的实体,这里只做演示.

        

@Entity@Table(name="t_b_module")public class Module extends IdEntity {        private String parentId="0";    //父模块ID,parentId值为0代表是应用即根节点,根模块    private String name;        //模块名称    private String description; //模块描述    private String pic;         //模块图片    private String site;        //模块地址,如果是组件,则为组件标识    private String target;      //打开方式1._blank 表示在新窗口中打开2. _iframe表示在框架中打开窗口    private Boolean alwaysDisplay;  //是否显示    private String moduleIcon;      //模块图标样式    private Long sort;//模块排序号    private String type;// 类型: 1、模块,2、组件    private String projectString;// 项目标识,同一项目使用同一标识        private Boolean isChecked;        private List<Module> moduleListTemp = new ArrayList<Module>();//子模块(如未全选中,则不包含子模块的父模块)    private List<Module> moduleList=new ArrayList<Module>();    //子模块    private List<Role> roles=new ArrayList<Role>();//角色映射        @Column(length=64)    public String getParentId() {return parentId;}public void setParentId(String parentId) {this.parentId = parentId;}    @Column(nullable=false,length=32)    public String getName() {        return name;    } public void setName(String name) {        this.name = name;    }    @Column(length=256)    public String getDescription() {        return description;    }    public void setDescription(String description) {        this.description = description;    }    @Column(length=128)    public String getPic() {        return pic;    }    public void setPic(String pic) {        this.pic = pic;    }    @Column(length=128)    public String getSite() {        return site;    }    public void setSite(String site) {        this.site = site;    }    @Column(length=12)    public String getTarget() {        return target;    }    public void setTarget(String target) {        this.target = target;    }    public Boolean getAlwaysDisplay() {return alwaysDisplay;}public void setAlwaysDisplay(Boolean alwaysDisplay) {this.alwaysDisplay = alwaysDisplay;}    @Column(length=128)    public String getModuleIcon() {return moduleIcon;}public void setModuleIcon(String moduleIcon) {this.moduleIcon = moduleIcon;}         @Column(length=128)    public String getProjectString() {        return projectString;    }    public void setProjectString(String projectString) {        this.projectString = projectString;    }    @Column(nullable=false,length=2)    public String getType() {        return type;    }    public void setType(String type) {        this.type = type;    }    @Transientpublic List<Module> getModuleList() {return moduleList;}public void setModuleList(List<Module> moduleList) {this.moduleList = moduleList;}@Transientpublic List<Module> getModuleListTemp() {return moduleListTemp;}public void setModuleListTemp(List<Module> moduleListTemp) {this.moduleListTemp = moduleListTemp;}@Transientpublic Boolean getIsChecked() {return isChecked;}public void setIsChecked(Boolean isChecked) {this.isChecked = isChecked;}public Long getSort() {return sort;}public void setSort(Long sort) {this.sort = sort;}public void setRoles(List<Role> roles) {this.roles = roles;}@Transient@ManyToMany(mappedBy="modules")public List<Role> getRoles() {return roles;}
            其实我们如果直接将数据库实体封装成树数据,也不是不可以,但如果关联关系一旦复杂了,转json的时候,递归json数据会出错, 就相当于在转圈圈似的.  以下代码即为递归树数据的主要代码, 请注意看注释.

/**     * 根据父ID,得到模块树列表     */    public List<TreeNode> getAllTreeNodesById(String pid){    List<Module> modules = moduleTree(pid); //该方法可不用理会,这是内部得到数据的方法,通过父ID,得到下面的数据节点集合    List<TreeNode> treeNodes = null;    if(null != modules && modules.size() > 0){    treeNodes = new ArrayList<TreeNode>();    for (Module module : modules) {    TreeNode treeNode = getTreeNodeByModuleNew(module); //分别得到每个节点下的子节点集合    treeNodes.add(treeNode);}    }    return treeNodes;    }        /**     * 递归模块树     * @param module     * @return     */    public TreeNode getTreeNodeByModuleNew(Module module){    TreeNode treeNode = new TreeNode();    treeNode.setIconCls(module.getModuleIcon());    treeNode.setText(module.getName());    treeNode.setState("close");Map<String, Object> map = new HashMap<String, Object>(); //附加数据,前台获取数据可(json对象.attributes.site)map.put("id", module.getId());map.put("pid", module.getParentId());map.put("site", module.getSite());treeNode.setAttributes(map);List<Module> modules = moduleTree(module.getId());   //得到子节点集合List<TreeNode> treeNodes = new ArrayList<TreeNode>();for (Module m : modules) {TreeNode tn = getTreeNodeByModuleNew(m);  //循环子节点,得到子节点下的孙节点集合,调用本身,可一直向下递归,直到modules为空treeNodes.add(tn);}treeNode.setChildren(treeNodes);   //添加封装好数据的子节点集合return treeNode;    }



       自己写出了这个递归,真的好开心,跟大家分享一下.  前台的代码我就不贴了, 用以上代码,可实现树的无限级显示.如不懂或有建议,可留言.亲,下一章还有ztree的讲解哦,都是差不多的.

原创粉丝点击