menuCd |
highMenuCd |
menuNm | orderNo |
|
1001 |
0 |
고객 | 1 | |
1002 |
1001 |
고객리스트 | 2 | |
1003 | 1002 | 대기리스트 | 3 | |
1004 | 0 | 게시판 | 4 | |
1005 | 1004 | 자유게시판 | 5 | |
1006 | 1004 | 유머게시판 | 6 |
위와 같은 형식의 데이터를 DB에서 뽑아 냈을때 오른쪽과 같이 화면에 표현하고 싶었다.
우선 Tree는 jQuery기반의 드래그앤랍이 기능이 되는 "jquery.dynatree.js" 를 선택했다.
이제 위 2차원 배열형태의 데이터를 dynatree가 요구하는 데이터형태로 변환을 해야 한다.
요구하는 데이터형태는 트리형식으로 아래와 같은 스타일로 만들어주면 된다.
[
{"isFolder":"true","title":"고객","children":[
{"isFolder":"true","title":"고객리스트" }
...
]
....
]
위와 같은 형태로 만들려고 삽질 좀 하다가 javascript 기반으로 잘 만들어져있는 소스를 구글링을통해 발견하여 그것을 java기반으로 수정 하였습니다.
(http://programmingsummaries.tistory.com/250)
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; /** * JSON관련 가공에 필요한 함수들 * @auther ddakker 2013. 12. 12. */ public class JsonUtil { private static final Log log = LogFactory.getLog(JsonUtil.class); /** * 2차원 배열의 부모/자식 관계의 데이터를 트리형식으로 재나열 한다. * @param list 2차원 배열 * @param rootId 최상위 id * @param idKey 유니크한 키(id가 될 필드명) * @param pIdKey 부모키(pId가 될 필드명) * @param titleKey 메뉴명이 표시될 필드명 * @return * @auther ddakker 2013. 12. 12. */ public static List<Map<String, Object>> convertorTreeMap(final List<Map<String, Object>> list, String rootId, final String idKey, final String pIdKey, final String titleKey){ return convertorTreeMap(list, rootId, idKey, pIdKey, titleKey, null); } /** * 2차원 배열의 부모/자식 관계의 데이터를 트리형식으로 재나열 한다. * @param list 2차원 배열 * @param rootId 최상위 id * @param idKey 유니크한 키(id가 될 필드명) * @param pIdKey 부모키(pId가 될 필드명) * @param titleKey 메뉴명이 표시될 필드명 * @param orderKey 정렬이 필요한경우 정령 필드명 * @return * @auther ddakker 2013. 12. 12. */ public static List<Map<String, Object>> convertorTreeMap(List inList, String rootId, final String idKey, final String pIdKey, final String titleKey, final String orderKey){ List<Map<String, Object>> treeList = new ArrayList<Map<String,Object>>(); // 최종 트리 if( inList == null || inList.size() == 0 ) throw new RuntimeException("List<Map> 데이터가 없습니다."); if( inList.get(0) == null ) throw new RuntimeException("Map 데이터가 없습니다."); final List<Map<String, Object>> list = new ArrayList<Map<String,Object>>(); // 원본데이터(Bean일경우 Map으로 변환) Iterator iter; for( iter=inList.iterator(); iter.hasNext(); ) { try{ Object obj = iter.next(); if( obj instanceof Map ) { list.add((Map<String, Object>) obj); }else{ list.add((Map<String, Object>) BeanUtils.describe(obj)); } }catch (Exception e) { throw new RuntimeException("Collection -> List<Map> 으로 변환 중 실패: " + e); } } int listLength = list.size(); int loopLength = 0; final int[] treeLength = new int[] { 0 }; while ( treeLength[0] != listLength && listLength != loopLength++ ) { for ( int i=0; i<list.size(); i++ ) { Map<String, Object> item = list.get(i); if ( rootId.equals((String)item.get(pIdKey)) ) { Map<String, Object> view = new HashMap<String, Object>(item); view.put("title", item.get(titleKey)); view.put("children", new ArrayList<Map<String,Object>>()); treeList.add(view); list.remove(i); treeLength[0]++; if( orderKey != null ){ Collections.sort(treeList, new Comparator<Map<String, Object>>(){ public int compare(Map<String, Object> arg0, Map<String, Object> arg1) { // TODO Auto-generated method stub return ((String)arg0.get(orderKey)).compareTo((String)arg1.get(orderKey)); } }); } view.put("isFolder", "true"); break; }else{ new InnerClass(){ public void getParentNode(List<Map<String, Object>> children, Map<String, Object> item ) { for ( int i=0; i<children.size(); i++ ) { Map<String, Object> child = children.get(i); if ( child.get(idKey).equals(item.get(pIdKey)) ) { Map<String, Object> view = new HashMap<String, Object>(item); view.put("title", item.get(titleKey)); view.put("children", new ArrayList<Map<String,Object>>()); ((List<Map<String,Object>>) child.get("children")).add(view); treeLength[0]++; list.remove(list.indexOf(item)); view.put("isFolder", "true"); if( orderKey != null ){ Collections.sort(((List<Map<String,Object>>) child.get("children")), new Comparator<Map<String, Object>>(){ public int compare(Map<String, Object> arg0, Map<String, Object> arg1) { // TODO Auto-generated method stub return ((String)arg0.get(orderKey)).compareTo((String)arg1.get(orderKey)); } }); } break; }else{ if( ((List<Map<String,Object>>) child.get("children")).size() > 0 ){ getParentNode((List<Map<String,Object>>) child.get("children"), item); } } } } }.getParentNode(treeList, item); } } } return treeList; } public interface InnerClass { public void getParentNode(List<Map<String, Object>> list, Map<String, Object> item ); } }