1. 程式人生 > >bootstrap ACE treeview json生成(Java)

bootstrap ACE treeview json生成(Java)

因專案需要使用到TreeView的資料結構,前端框架使用bootstrap ACE 需要返回固定格式的JSON 資料,在java後臺遞迴處理返回的json。。。如下:


{
"刑偵":
		{
			"text":"刑偵",
			"type":"folder",
			"additionalParameters":
				{
					"id":"1",
					"children":
						{
							"痕跡檢驗":
								{
									"text":"痕跡檢驗",
									"type":"item",
									"additionalParameters":{"id":"10"}},
							"刑偵光源":
								{
									"text":"刑偵光源",
									"type":"item",
									"additionalParameters":{"id":"11"}},
							"現場勘察":
								{
									"text":"現場勘察",
									"type":"item",
									"additionalParameters":{"id":"12"}},
							"反恐處突":
								{
									"text":"反恐處突",
									"type":"item",
									"additionalParameters":{"id":"13"}},
							"聲像技術":
								{
									"text":"聲像技術",
									"type":"item",
									"additionalParameters":{
										"id":"9",
										"children":{
											"三級選單":{
												"text":"聲像技術",
												"type":"item",
												"additionalParameters":{"id":"33"}
											}
										}
											}
								}
						}
				}
		},
"交警":
		{
			"text":"交警",
			"type":"folder",
			"additionalParameters":
				{
					"id":"32",
					"children":
						{
							"交通事故":{"text":"交通事故","type":"item","additionalParameters":{"id":"33"}},
							"交通道理管理":{"text":"交通道理管理","type":"item","additionalParameters":{"id":"34"}}
						}
				}
		} 
}

資料庫結構如下:(是遞迴表即可)

建立對應POJO實體類如下:

package com.lkk.po;


/**
 * @author 作者 DCT:
 * @version 建立時間:2018年11月5日 下午5:00:13
 * 類說明
 */
public class TblKnowledgeTemplate {

		/**
		 * ID
		 */
		private String intKnowledgeTemplateID;
	
		/**
		 * 父節點
		 */
		private String intParentID;
		
		/**
		 * 模板名稱
		 */
		private String name;

		/**
		 * 檢查所見
		 */
		private String nodeValue;
		
		/**
		 * 檢查結論
		 */
		private String nonce;
		
		/**
		 * 型別
		 */
		private String strType;
		
		public String getIntParentID() {
			return intParentID;
		}

		public void setIntParentID(String intParentID) {
			this.intParentID = intParentID;
		}
		public String getName() {
			return name;
		}

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

		public String getNodeValue() {
			return nodeValue;
		}

		public void setNodeValue(String nodeValue) {
			this.nodeValue = nodeValue;
		}

		public String getNonce() {
			return nonce;
		}

		public void setNonce(String nonce) {
			this.nonce = nonce;
		}

		public String getStrType() {
			return strType;
		}

		public void setStrType(String strType) {
			this.strType = strType;
		}

		 
		public String getIntKnowledgeTemplateID() {
			return intKnowledgeTemplateID;
		}

		public void setIntKnowledgeTemplateID(String intKnowledgeTemplateID) {
			this.intKnowledgeTemplateID = intKnowledgeTemplateID;
		}
		
}

根據json樣式,我們需要建立兩個javabean

package com.lkk.po.tree;

import java.util.Map;

/**
 * @author 作者 DCT:
 * @version 建立時間:2018年11月7日 上午9:40:47
 * 類說明
 */
public class AdditionalParameters {
	/**
	 * node id
	 */
	private String id;
	
	/**
	 * subnode ifno
	 */
	private Map<String,Item> children;
	
	/**
	 * node chosen
	 */
	 
	private boolean itemSelected ;
 
	
	public String getId( )
	{
		return id;
	}
 
	
	public void setId( String id )
	{
		this.id = id;
	}
 
	
	
	public Map<String, Item> getChildren( )
	{
		return children;
	}
 
 
	
	public void setChildren( Map<String, Item> children )
	{
		this.children = children;
	}
 
 
	public boolean isItemSelected( )
	{
		return itemSelected;
	}
 
	
	public void setItemSelected( boolean itemSelected )
	{
		this.itemSelected = itemSelected;
	}
 
}
package com.lkk.po.tree;
/**
 * @author 作者 DCT:
 * @version 建立時間:2018年11月7日 上午9:32:44
 * 類說明
 */
public class Item {
	/**
	 * name
	 */
	private String name;
	
	/**
	 * type
	 */
	private String type;
	
	private String nodeValue;
	
	private String nonce;
	
	/**
	 * node parameters info and subnode info
	 */
	private AdditionalParameters additionalParameters;

	public String getName() {
		return name;
	}

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

	public String getType() {
		return type;
	}

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

	public String getNodeValue() {
		return nodeValue;
	}

	public void setNodeValue(String nodeValue) {
		this.nodeValue = nodeValue;
	}

	public String getNonce() {
		return nonce;
	}

	public void setNonce(String nonce) {
		this.nonce = nonce;
	}

	public AdditionalParameters getAdditionalParameters() {
		return additionalParameters;
	}

	public void setAdditionalParameters(AdditionalParameters additionalParameters) {
		this.additionalParameters = additionalParameters;
	}
 
	
	
}

controller 中的業務程式碼如下:


    
private void getChildNodes( Map<String,Item> items, String parentId,String type )
	{
	
	
		List<TblKnowledgeTemplate> permissions=getChildPermissions( parentId,type );
		if(permissions.size()>0){
			for ( TblKnowledgeTemplate permission : permissions )
			{
				//遞迴子節點
				Item item=new Item( );
				item.setName(permission.getName());
				item.setType("folder");
				getChildItems(item,permission.getIntKnowledgeTemplateID().toString(),permission.getName(),type);
				items.put(permission.getName(),item);
			}
		}
		
	}
	
/**
	 * 獲取子項
	 * @param item 當前節點
	 * @param parentId 當前節點的父ID
	 * @param parentName 節點名稱
	 * @param type 節點型別
	 */
    private void getChildItems( Item item, String parentId,String parentName,String type )
	{
		List<TblKnowledgeTemplate> childPermissions = getChildPermissions( parentId,type );
		if(childPermissions.size( )>0){
			//父節點為“folder”
			item.setName(parentName);
			item.setType( "folder" );
			AdditionalParameters additionalParameters=new AdditionalParameters( );
			additionalParameters.setId( parentId );
			Map<String, Item> children=new LinkedHashMap<>( );
			for ( TblKnowledgeTemplate childPermission : childPermissions )
			{
				Item item2=new Item( );
				getChildItems( item2, childPermission.getIntKnowledgeTemplateID().toString( ),childPermission.getName(),type);
				children.put( childPermission.getName( ), item2 );
			}
			additionalParameters.setChildren( children );
			item.setAdditionalParameters( additionalParameters );
			
		}else{
			//父節點為“item”,獲取當前
			item.setName(parentName);
			item.setType("item" );
			AdditionalParameters additionalParameters=new AdditionalParameters( );
			additionalParameters.setId( parentId );
			item.setAdditionalParameters( additionalParameters );
		}
		
		
	}
 
    /**
     * 根據節點parentId和型別查詢子節點
     * @param parentId 當前節點的父ID
	 * @param type 節點型別
     * @return
     */
	private List<TblKnowledgeTemplate> getChildPermissions( String parentId ,String type)
	{ 
		List<TblKnowledgeTemplate> permissions = tblKnowledgeTemplateService.queryChildById( parentId ,type);
		return permissions;
	} 

效果圖如下:

感謝這位博主

參考了以下文章: