jeasyui的树递归

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

       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;
    }
    @Transient
	public List<Module> getModuleList() {
		return moduleList;
	}
	public void setModuleList(List<Module> moduleList) {
		this.moduleList = moduleList;
	}
	@Transient
	public List<Module> getModuleListTemp() {
		return moduleListTemp;
	}
	public void setModuleListTemp(List<Module> moduleListTemp) {
		this.moduleListTemp = moduleListTemp;
	}
	@Transient
	public 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的讲解哦,都是差不多的.

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值