java底层封装数据树并导出json绑定easyui tree
pojo类
public class Catalog {
private String catalogId;
private String catalogName;
private String parentId;
private Date create;
public String getCatalogId() {
return catalogId;
}
public void setCatalogId(String catalogId) {
this.catalogId = catalogId;
}
public String getCatalogName() {
return catalogName;
}
public void setCatalogName(String catalogName) {
this.catalogName = catalogName;
}
public String getParentId() {
return parentId;
}
public void setParentId(String parentId) {
this.parentId = parentId;
}
public Date getCreate() {
return create;
}
public void setCreate(Date create) {
this.create = create;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
private String description;
}
Tree 类
public abstract class Tree {
protected static Log log = LogFactory.getLog(Tree.class);
private Map treeNodeMaps = new Hashtable();
private TreeNode root;
private List treeNodeList=new Vector();
public void setTreeNodeList(List treeNodeList) {
this.treeNodeList = treeNodeList;
}
/**
* root if it's parent is empty
*/
protected void reload(List nodes) {
log.info("tree will start reload all data");
synchronized (this) {
// initialize
treeNodeMaps.clear();
root = null;
treeNodeList.clear();
List treeNodes = new Vector(nodes.size());
for (int i = 0; i < nodes.size(); i++)
{
TreeNode node = this.transform(nodes.get(i)); // transform
treeNodes.add(node);
node.setTree(this);
treeNodeMaps.put(node.getNodeId(), node);
}
for (int i = 0; i < treeNodes.size(); i++) {
TreeNode node = (TreeNode) treeNodes.get(i);
String parentId = node.getParentId();
if (this.isRootNode(node)) {
treeNodeList.add(node);
if (root == null)
{
root = node;
}
else
{
log.error("find more then one root node. ignore.");
}
}
else
{
TreeNode parent = (TreeNode) treeNodeMaps.get(parentId);
if (parent != null)
{
parent.addChild(node);
node.setParent(parent);
}
else
{
log.warn("node [id=" + node.getNodeId()
+ "]: missing parent node.");
}
}
}
}
if (root == null) {
log.error("the root node is not be defined");
}
}
protected boolean isRootNode(TreeNode node) {
return StringUtils.isBlank(node.getParentId());
}
public TreeNode getRootNode() {
return root;
}
public TreeNode getTreeNode(String nodeId) {
return (TreeNode) treeNodeMaps.get(nodeId);
}
public List getTreeNodeList() {
return treeNodeList;
}
public void addTreeNode(TreeNode node) {
synchronized (this) {
treeNodeMaps.put(node.getNodeId(), node);
String parentId = node.getParentId();
if (StringUtils.isNotBlank(parentId)) {
TreeNode parent = getTreeNode(parentId);
if (parent != null) {
parent.addChild(node);
node.setParent(parent);
} else {
log.error("parent cannot be found: " + node.getParentId());
}
} else {
if (root == null) {
root = node;
} else {
log.error("find more then one root node. ignore.");
}
}
}
}
public void deleteTreeNode(String nodeId) {
synchronized (this) {
TreeNode node = getTreeNode(nodeId);
if (node == null)
throw new IllegalArgumentException(nodeId + " cannot be found.");
if (node.getParent() == null) {
root = null;
treeNodeMaps.clear();
log.warn("the root node has been removed.");
} else {
node.getParent().getChildren().remove(node);
treeNodeMaps.remove(nodeId);
List children = node.getAllChildren();
for (int i = 0; i < children.size(); i++) {
TreeNode n = (TreeNode) children.get(i);
treeNodeMaps.remove(n.getNodeId());
}
}
}
}
/**
* <pre>
* Usage: Office ->
*
* public TreeNode transform(Object info) {
* OfficeInfo office_info = (OfficeInfo) info;
* TreeNode node = new TreeNode();
* node.setNodeId(office_info.getOfficeId());
* node.setParentId(office_info.getParentId());
* node.setBindData(office_info);
* return node;
* }
* </pre>
*/
protected abstract TreeNode transform(Object info);
}
TreeNode 类
public class TreeNode {
private Tree tree;
private TreeNode parent;
private List children = new Vector();
private List childrenGroup = new Vector();
private String nodeId;
private String parentId;
private Object bindData;
private TreeNode node;
public TreeNode getNode() {
return node;
}
public void setNode(TreeNode node) {
this.node = node;
}
public String getNodeId() {
return nodeId;
}
public void setNodeId(String nodeId) {
this.nodeId = nodeId;
}
public String getParentId() {
return parentId;
}
public void setParentId(String parentId) {
this.parentId = parentId;
}
public Object getBindData() {
return bindData;
}
public void setBindData(Object bindData) {
this.bindData = bindData;
}
public Tree getTree() {
return tree;
}
public void setTree(Tree tree) {
this.tree = tree;
}
public void setParent(TreeNode parent) {
this.parent = parent;
}
public TreeNode getParent() {
return this.parent;
}
public List getChildren() {
return this.children;
}
public void addChild(TreeNode node) {
children.add(node);
}
/**
* get all children, and chilren's children
*/
public List getAllChildren() {
if (this.childrenGroup.isEmpty()) {
synchronized (this.tree) {
for (int i = 0; i < this.children.size(); i++) {
TreeNode node = (TreeNode) this.children.get(i);
this.childrenGroup.add(node);
this.childrenGroup.addAll(node.getAllChildren());//递归添加所有字节点
}
}
}
return this.childrenGroup;
}
/**
* get all children, and chilren's children
*/
public List getAllChildren(Predicate predicate) {
List groups = new Vector();
fillAllChildren(groups, predicate);
return groups;
}
private void fillAllChildren(List groups, Predicate predicate) {
for (int i = 0; i < this.children.size(); i++) {
TreeNode node = (TreeNode) this.children.get(i);
if (predicate.evaluate(node)) {
groups.add(node);
node.fillAllChildren(groups, predicate);
}
}
}
/**
* get all parents, and parent's parent
*/
public List getParents() {
List results = new Vector();
TreeNode parent = this.getParent();
while (parent != null) {
results.add(parent);
parent = parent.getParent();
}
return results;
}
/**
* A.isMyParent(B) == B is A' parent ? <br>
* root.isMyParent(null) == true; <br>
* root.isMyParent(*) == false <br>
* *.isMyParent(null) == false
*/
public boolean isMyParent(String nodeId) {
TreeNode target = tree.getTreeNode(nodeId);
TreeNode parent = this.getParent();
if (parent == null) {
return target == null;
} else {
return parent.equals(target);
}
}
/**
* A.isMyAncestor(B) == B is A' ancestor ? <br>
* *.isMyAncestor(null) == true;
*/
public boolean isMyAncestor(String nodeId) {
TreeNode target = tree.getTreeNode(nodeId);
if (target == null)
return true;
return target.getAllChildren().contains(this);
}
/**
* A.isMyBrother(B) == B is A' brother ? <br>
* *.isMyBrother(null) == false
*/
public boolean isMyBrother(String nodeId) {
TreeNode target = tree.getTreeNode(nodeId);
if (target == null)
return false;
TreeNode p1 = this.getParent();
TreeNode p2 = target.getParent();
return ObjectUtils.equals(p1, p2);
}
}
CatalogTree 类
public class CatalogTree extends Tree {
private static CatalogTree instance = null;
private CatalogTree() {}
public static synchronized CatalogTree getInstance() {
if (instance == null) {
instance = new CatalogTree();
instance.reloadCatalogs();
}
return instance;
}
protected TreeNode transform(Object info) {
Catalog catalog = (Catalog)info;
TreeNode node = new TreeNode();
node.setNodeId(catalog.getCatalogId());
node.setParentId(catalog.getParentId());
node.setBindData(catalog);
node.setNode(node);
return node;
}
public void reloadCatalogs() {
List nodes = CalalogDao.getInstance().findAll();
super.reload(nodes);
}
public Catalog getCatalogNode(String catalogId) {
TreeNode node = super.getTreeNode(catalogId);
return node == null ? null : (Catalog) node.getBindData();
}
}
JsonTree 类
public class JsonTree {
private StringBuffer str=new StringBuffer();
private Tree tree;
public JsonTree(){
tree = CatalogTree.getInstance();
}
public String getJsonToTree(Tree tree){
if(tree==null){
readTreeToJson(this.tree);
}else{
readTreeToJson(tree);
}
filterJson(str);
return str.toString();
}
public String getJsonToTree(){
return getJsonToTree(null);
}
//读树
private void readTreeToJson(Tree tree){
Iterator iter=tree.getTreeNodeList().iterator();
str.append("[");
while(iter.hasNext()){
TreeNode node=(TreeNode)iter.next();
Catalog catalog=(Catalog)node.getBindData();
str.append("{");
str.append("\"id\":"+catalog.getCatalogId()+",");
str.append("\"text\":"+"\""+catalog.getCatalogName()+"\"");
if(node.getChildren().size()>0){
str.append(",");
}else{
str.append("},");
}
readTreeNodeToJson(node);
}
str.append("]");
}
//读节点
private void readTreeNodeToJson(TreeNode treeNode){
Iterator iter=treeNode.getChildren().iterator();
if(iter.hasNext()){
str.append("\"children\":[");
}
while(iter.hasNext()){
TreeNode node=(TreeNode)iter.next();
Catalog catalog=(Catalog)node.getBindData();
str.append("{");
str.append("\"id\":"+catalog.getCatalogId()+",");
str.append("\"text\":"+"\""+catalog.getCatalogName()+"\"");
if(node.getNode().getChildren().size()<=0){
str.append("}");
}
if(iter.hasNext()){
str.append(",");
}else{
str.append("]},");
}
readTreeNodeToJson(node.getNode());
}
}
private StringBuffer filterJson(StringBuffer str){
if(!StringUtils.isBlank(str)){
str.delete(str.length()-2, str.length()-1);
}
return str;
}
}
依赖包
commons-lang3-3.0.1.jar
commons-logging-1.0.4.jar
commons-collections-3.2.1.jar
分享到:
相关推荐
《jQuery EasyUI Tree组件深度解析与实践应用》 在Web开发中,为了构建用户友好的交互界面,我们经常需要使用到各种UI库。jQuery EasyUI就是这样一个强大的前端框架,它基于jQuery,提供了丰富的组件,包括今天我们...
例如,通过jQuery 1.7的事件处理和数据操作功能,配合EasyUI的组件,可以轻松实现用户交互和动态数据加载。例如: - 使用.on() 绑定表格(Grid)的行点击事件,展示选中行的详细信息在Dialog中。 - 利用.data() ...
jQuery EasyUI 的核心在于其组件系统,这些组件包括但不限于数据网格(datagrid)、下拉菜单(combobox)、对话框(dialog)、表单(form)、布局(layout)、菜单(menu)、面板(panel)、进度条(progressbar)、...
**jQuery EasyUI 知识点详解** jQuery EasyUI 是一个基于 jQuery 的前端框架,它提供了一系列的 UI 组件,使得开发者能够快速构建出美观且功能丰富的 Web 应用程序。这个框架大大简化了网页界面的设计工作,使得...
**jQuery和EasyUI简介** jQuery是一个轻量级的JavaScript库,它极大地简化了JavaScript的DOM操作、事件处理、动画设计和...提供的JQueryEasyUI实例下载将是一个很好的实践平台,帮助开发者深入理解和运用这两个库。
2. **组件详解**:jQuery EasyUI 提供了许多组件,如 `datagrid`(数据网格)、`dialog`(对话框)、`menu`(菜单)、`tabs`(选项卡)、`tree`(树形结构)和`form`(表单)。每个组件都有详细的配置选项、方法和...
EasyUI是一个基于JavaScript和jQuery的前端框架,它提供了丰富的UI组件,如表格、下拉菜单、对话框、表单等,这些组件具有响应式设计,可以在不同的设备上提供一致的用户体验。EasyUI的核心优势在于其简洁的API和...
2. **数据绑定**:jQuery EasyUI 支持与后台数据源进行数据绑定,通过Ajax或JSONP实现异步加载,使页面内容动态更新,提高用户体验。例如,表格组件Grid可以直接与服务器端的数据接口进行交互,实现分页、排序、过滤...
《JQueryEasyui1.3.6+电子书文档+14套主题》是一个综合性的资源包,包含jQuery EasyUI框架的1.3.6版本、相关电子书文档以及14种不同风格的主题,旨在帮助开发者更好地理解和应用这个强大的前端开发工具。下面将详细...
2. **数据绑定**:jQueryEasyUI支持通过JSON或Ajax方式动态加载和展示数据,与后端服务进行数据交换,实现前后端分离。 3. **主题系统**:提供了多种预设主题,可以方便地更改应用的整体风格,满足不同设计需求。 ...
- **Ajax 数据绑定**:结合 jQuery 的 Ajax 功能,可以实现数据的动态加载和异步更新。 在 `jquery-easyui-1.2.2` 压缩包中,包含了 jQuery EasyUI 的完整资源文件,包括 CSS 样式、JavaScript 文件、示例代码等,...
1. 数据绑定:EasyUI 提供了数据绑定功能,可以轻松地将后台数据与前端UI组件关联,实现数据的动态展示和更新。 2. 组件丰富:包括对话框(Dialog)、表格(Grid)、表单(Form)、菜单(Menu)、树形控件(Tree)...
在 `JqueryEasyUI1.4参考手册.chm` 中,你将找到关于 jQuery EasyUI 1.4 版本的详尽指南。`.chm` 文件是一种微软编写的帮助文档格式,它包含索引、搜索功能和一系列主题,方便用户查找和学习。 **组件介绍** ...
《jQuery EasyUI 1.3.3:轻松构建高效用户界面》 jQuery EasyUI 是一个基于 jQuery 的前端框架,它提供了丰富的组件和便捷的API,帮助开发者快速构建出功能完善、用户界面友好的Web应用程序。在版本1.3.3中,EasyUI...
**jQueryEasyUI 1.1 完整源代码详解** jQueryEasyUI 是一款基于 jQuery 的前端框架,它为开发者提供了一系列轻量级、易于使用的组件,用于快速构建用户界面。这个1.1版本包含了完整的源代码,允许开发者深入理解其...
2. **数据绑定**:通过与jQuery插件如jQuery AJAX的结合,EasyUI支持数据的动态加载和异步操作,实现了与服务器端的数据交换,如datagrid的分页、排序和过滤功能。 3. **主题系统**:EasyUI 提供了一套完整的主题...
3. **数据绑定**:jQuery EasyUI 支持JSON数据格式,可以方便地将服务器端数据绑定到前端组件,实现动态交互。 4. **事件处理**:每个组件都有自己的事件机制,通过监听和响应这些事件,可以实现自定义的功能和交互...
《jQuery EasyUI 1.4.5 API详解》 jQuery EasyUI 是一款基于 jQuery 的前端框架,它提供了丰富的用户界面组件,使得开发者可以快速构建出美观且功能强大的Web应用。在本文中,我们将深入探讨jQuery EasyUI 1.4.5...
对于表单元素,EasyUI提供了如`combobox`、`combogrid`等组件,它们可以与服务器端进行交互,动态加载数据。例如,`combogrid`组件可以实现类似下拉列表的功能,但同时支持远程数据加载,通过`url`属性指定服务端...
jQuery EasyUI 是一个基于 jQuery 的前端框架,它简化了网页用户界面开发,提供了一系列易于使用的组件,如对话框、表格、菜单、按钮等。1.4.3 版本是该框架的一个稳定版本,提供了丰富的功能和改进。下面将详细阐述...