分两种情况写:
1.每次都去数据库查询:
首先要取得树的根节点、每次走后台的时候根据选中的nodeId去查询它的子节点
在ExplorerTreeNodeDto中定义了一个List < ExplorerTreeNodeDto > children的属性用来定义子节点
public List < ExplorerTreeNodeDto > loadTree(id) {
// 判断取得根节点还是叶子节点
if (folderId.substring(0, 4).equals(ConstantsManager.PREFIX_FOLDER_ID)) {
// 取得叶子节点的情况
return getTreeNode(id);
} else {
// 取得跟节点的情况
return getRootNode();
}
}
private List < ExplorerTreeNodeDto > getRootNode(final String fccid) {
FolderDao folderDao = getFolderDao();
// 取得根节点数据
List < ExplorerTreeNodeDto > lst = folderDao.getRootNode(fccid);
for (int i = 0; i < lst.size(); i++) {
ExplorerTreeNodeDto dto = lst.get(i);
// 业务中要求初始化的时候显示根节点及其下一层节点
dto.setChildren(folderDao.getTreeNode(dto.getId()));
// 因为DTO中定义的leaf类型是String的,在这里给转化成布尔型的,这样在extjs的树标签中就能自动判断是不是叶子节点
for (int j = 0; j < lst.get(i).getChildren().size(); j++) {
if ("TRUE".equals(dto.getChildren().get(j).getStrLeaf())) {
dto.getChildren().get(j).setLeaf(true);
} else {
dto.getChildren().get(j).setLeaf(false);
}
}
}
return dto;
}
private List < ExplorerTreeNodeDto > getTreeNode(final String folderId) {
FolderDao folderDao = getFolderDao();
List < ExplorerTreeNodeDto > lstDto;
// 取得树的叶子节点
lstDto = folderDao.getTreeNode(folderId);
// 转换leaf类型
for (int i = 0; i < lstDto.size(); i++) {
ExplorerTreeNodeDto dto = lstDto.get(i);
if ("TRUE".equals(dto.getStrLeaf())) {
dto.setLeaf(true);
} else {
dto.setLeaf(false);
}
}
return lstDto;
}
2.只读取一次数据库,取得所有的数据,不再访问数据库
public List < ExplorerTreeNodeDto > loadTreeAll(final String fccId,
final String serviceId, final String subId, final String linkId) {
FolderDao folderDao = getFolderDao();
// 取得根节点数据
List < ExplorerTreeNodeDto > lst = folderDao.getRootNode(fccId);
// 递归读取根节点的子节点
return getTreeNodeRecursive(lst);
}
private List < ExplorerTreeNodeDto > getTreeNodeRecursive(
List < ExplorerTreeNodeDto > lstDto) {
FolderDao folderDao = getFolderDao();
for (int i = 0; i < lstDto.size(); i++) {
ExplorerTreeNodeDto dto = lstDto.get(i);
dto.setChildren(folderDao.getTreeNode(dto.getId()));
if ("TRUE".equals(dto.getStrLeaf())) {
dto.setLeaf(true);
} else {
dto.setLeaf(false);
}
// 递归取得子节点
if (dto.getChildren() != null) {
getTreeNodeRecursive(dto.getChildren());
}
}
return lstDto;
}