EXTJS动态树,非常完整的一个例子

这个是我从ITeye里看到的,最近也在做这个例子,觉得那边的写的非常的不错,现在拿过来分享下,等自己的例子写好,也会拿上来分享的

 

EXTJS动态树的实现举例
一、描述:通过dwr实现JS与后台的交互,从而实现动态树中叶子节点和目录节点的增加和编辑、以及节点的拖曳,节点的增删和拖曳都会改变自身以及它所在的目录节点下的相关节点的序号,能使得后台与前台同步。这个序号借助了tree中node的index。
1、相关基础:
servlet、mysql、dwr、json
2、涉及的ExtJs中部分知识点:
menu、tree、window以及事件机制
3、实现的效果图:
a)ExtJs动态树-右键叶子节点菜单

b)ExtJs动态树-选择右键叶子节点菜单的“编辑”选项

c)ExtJs动态树-右键目录节点菜单

d)ExtJs动态树-选择右键目录节点菜单的“编辑”选项

e)ExtJs动态树-拖曳节点

4、导航数据表结构:

5、源码结构图:

6、页面结构图:
 

二、实现流程
JAVA源码部分:
1、数据库连接

Java代码 复制代码  收藏代码
  1. package com.demo.core.dao;   
  2.   
  3. import java.sql.Connection;   
  4. import java.sql.DriverManager;   
  5.   
  6. public class DBConn {   
  7.   
  8.     private static  String url = "jdbc:mysql://localhost:3306/langsin";   
  9.     private static  String username = "root";   
  10.     private static  String password = "";   
  11.     private static  String driver = "com.mysql.jdbc.Driver";   
  12.        
  13.     public static Connection getConnection(){   
  14.         Connection conn = null;   
  15.         try{   
  16.             Class.forName(driver);   
  17.             conn = DriverManager.getConnection(url,username,password);   
  18.         }catch(Exception e){   
  19.             e.printStackTrace();   
  20.         }   
  21.         return conn;   
  22.     }   
  23. }  
package com.demo.core.dao;

import java.sql.Connection;
import java.sql.DriverManager;

public class DBConn {

	private static  String url = "jdbc:mysql://localhost:3306/langsin";
	private static  String username = "root";
	private static  String password = "";
	private static  String driver = "com.mysql.jdbc.Driver";
	
	public static Connection getConnection(){
		Connection conn = null;
		try{
			Class.forName(driver);
			conn = DriverManager.getConnection(url,username,password);
		}catch(Exception e){
			e.printStackTrace();
		}
		return conn;
	}
}


2、dao层:

Java代码 复制代码  收藏代码
  1. package com.demo.navigate.dao;   
  2.   
  3. import java.io.Serializable;   
  4. import java.sql.Connection;   
  5. import java.sql.ResultSet;   
  6. import java.sql.SQLException;   
  7. import java.sql.Statement;   
  8. import java.util.ArrayList;   
  9. import java.util.List;   
  10.   
  11. import com.demo.core.dao.DBConn;   
  12. import com.demo.navigate.model.Navigate;   
  13.   
  14. public class NavigateDao {   
  15.     private static NavigateDao dao;   
  16.     private NavigateDao(){         
  17.     }      
  18.     public static NavigateDao getInstanece(){   
  19.         if(null == dao){   
  20.             dao = new NavigateDao();   
  21.         }   
  22.         return dao;   
  23.     }   
  24.     /**  
  25.      * 获得指定ID的数据  
  26.      * @param id  
  27.      * @return  
  28.      */  
  29.     public Navigate get(Serializable id){   
  30.         Connection conection = null;   
  31.         Statement stmt = null;   
  32.         ResultSet rs = null;   
  33.         Navigate obj = null;   
  34.         try{   
  35.             conection = DBConn.getConnection();    
  36.             stmt = conection.createStatement();   
  37.             StringBuffer sql = new StringBuffer("select * from navigate where id = ");   
  38.             sql.append(id);   
  39.             rs = stmt.executeQuery(sql.toString());   
  40.             if(rs.next())   
  41.             {   
  42.                 obj = new Navigate();   
  43.                 obj.setId(rs.getInt("id"));   
  44.                 obj.setLeaf(rs.getInt("leaf"));   
  45.                 obj.setNumber(rs.getInt("number"));   
  46.                 obj.setParentId(rs.getInt("parentId"));   
  47.                 obj.setTitle(rs.getString("title"));   
  48.                 obj.setUrl(rs.getString("url"));   
  49.             }   
  50.         }catch(Exception e){   
  51.             e.printStackTrace();               
  52.         }finally{   
  53.             try{   
  54.                 if(rs != null) {   
  55.                     try {   
  56.                         rs.close();   
  57.                     } catch (SQLException e) {   
  58.                     }   
  59.                     rs = null;   
  60.                 }                  
  61.                 if (stmt != null) {   
  62.                     try {   
  63.                         stmt.close();   
  64.                     } catch (SQLException sqlex) {   
  65.                     }   
  66.                     stmt = null;   
  67.                 }   
  68.                 if (conection != null) {   
  69.                     try {   
  70.                         conection.close();   
  71.                     } catch (SQLException sqlex) {   
  72.                     }   
  73.                     conection = null;   
  74.                 }   
  75.             }catch(Exception e){   
  76.                 e.printStackTrace();   
  77.             }   
  78.         }   
  79.         return obj;   
  80.     }   
  81.        
  82.     /**  
  83.      * 获得指定节点的所有儿子节点  
  84.      * @param id  
  85.      */  
  86.     @SuppressWarnings("unchecked")   
  87.     public List<Navigate> getChildrenById(Integer id){   
  88.         List<Navigate> list = new ArrayList<Navigate>();   
  89.         Connection conection = null;   
  90.         Statement stmt = null;   
  91.         ResultSet rs = null;   
  92.         try{   
  93.             conection = DBConn.getConnection();    
  94.             stmt = conection.createStatement();   
  95.             StringBuffer sql = new StringBuffer("select * from navigate where parentId = ");   
  96.             sql.append(id);   
  97.             sql.append(" order by number,id");   
  98.             rs = stmt.executeQuery(sql.toString());   
  99.             while(rs.next())   
  100.             {   
  101.                 Navigate obj = new Navigate();   
  102.                 obj.setId(rs.getInt("id"));   
  103.                 obj.setLeaf(rs.getInt("leaf"));   
  104.                 obj.setNumber(rs.getInt("number"));   
  105.                 obj.setParentId(rs.getInt("parentId"));   
  106.                 obj.setTitle(rs.getString("title"));   
  107.                 obj.setUrl(rs.getString("url"));   
  108.                 list.add(obj);   
  109.             }   
  110.         }catch(Exception e){   
  111.             e.printStackTrace();               
  112.         }finally{   
  113.             try{   
  114.                 if(rs != null) {   
  115.                     try {   
  116.                         rs.close();   
  117.                     } catch (SQLException e) {   
  118.                     }   
  119.                     rs = null;   
  120.                 }                  
  121.                 if (stmt != null) {   
  122.                     try {   
  123.                         stmt.close();   
  124.                     } catch (SQLException sqlex) {   
  125.                     }   
  126.                     stmt = null;   
  127.                 }   
  128.                 if (conection != null) {   
  129.                     try {   
  130.                         conection.close();   
  131.                     } catch (SQLException sqlex) {   
  132.                     }   
  133.                     conection = null;   
  134.                 }   
  135.             }catch(Exception e){   
  136.                 e.printStackTrace();   
  137.             }   
  138.         }   
  139.         return list;   
  140.     }   
  141.        
  142.     /**  
  143.      * 保存数据  
  144.      * @param obj   
  145.      */  
  146.     public void save(Navigate obj){   
  147.         StringBuffer sql = new StringBuffer("insert into navigate(parentId,title,leaf,number,url) values(");   
  148.         sql.append(obj.getParentId());   
  149.         sql.append(",'");   
  150.         sql.append(obj.getTitle());   
  151.         sql.append("',");   
  152.         sql.append(obj.getLeaf());   
  153.         sql.append(",");   
  154.         sql.append(obj.getNumber());   
  155.         sql.append(",'");   
  156.         sql.append(obj.getUrl());   
  157.         sql.append("')");   
  158.         this.bulkUpdate(sql.toString());   
  159.     }   
  160.        
  161.     /**  
  162.      * 更新数据  
  163.      * @param obj   
  164.      */  
  165.     public void update(Navigate obj){   
  166.         StringBuffer sql = new StringBuffer("update navigate set");   
  167.         sql.append(" parentId = ");   
  168.         sql.append(obj.getParentId());   
  169.         sql.append(",");   
  170.         sql.append(" title = '");   
  171.         sql.append(obj.getTitle());   
  172.         sql.append("',");   
  173.         sql.append(" leaf = ");   
  174.         sql.append(obj.getLeaf());   
  175.         sql.append(",");   
  176.         sql.append(" number = ");   
  177.         sql.append(obj.getNumber());   
  178.         sql.append(", url = '");   
  179.         sql.append(obj.getUrl());   
  180.         sql.append("' where id = ");   
  181.         sql.append(obj.getId());   
  182.         this.bulkUpdate(sql.toString());   
  183.     }   
  184.        
  185.     /**  
  186.      * 异步更新标题  
  187.      * @param id  
  188.      * @param title  
  189.      * @return true-修改成功 false-修改失败  
  190.      */  
  191.     public Boolean ajaxUpdateTitle(Integer id,String title){   
  192.         Boolean flag = false;   
  193.         Navigate obj = this.get(id);   
  194.         if(null != obj){   
  195.             StringBuffer sql = new StringBuffer("update navigate set");   
  196.             sql.append(" title = '");   
  197.             sql.append(title);   
  198.             sql.append("'");   
  199.             sql.append(" where id = ");   
  200.             sql.append(id);   
  201.             this.bulkUpdate(sql.toString());   
  202.             flag = true;   
  203.         }   
  204.         return flag;   
  205.     }   
  206.        
  207.     /**  
  208.      * 删除指定的一条数据  
  209.      * @param id  
  210.      */  
  211.     public void removeById(Integer id){   
  212.         StringBuffer sql = new StringBuffer("delete from navigate where id = ");   
  213.         sql.append(id);   
  214.         this.bulkUpdate(sql.toString());   
  215.     }   
  216.        
  217.     /**  
  218.      * 异步删除数据,包括其子孙节点  
  219.      * @param id  
  220.      * @param title  
  221.      */  
  222.     @SuppressWarnings("unchecked")   
  223.     public void ajaxRemoveNode(Integer id){   
  224.         List list = this.getChildrenById(id);   
  225.         for (Object object : list) {   
  226.             Navigate obj = (Navigate)object;   
  227.             ajaxRemoveNode(obj.getId());   
  228.         }   
  229.         this.removeById(id);   
  230.     }   
  231.        
  232.     /**  
  233.      * 移动指定节点  
  234.      * @param id    指定的节点的id  
  235.      * @param oldParentId   节点移动前所在的父节点  
  236.      * @param newParentId   节点移动后的目标父节点  
  237.      * @param nodeIndex     节点移动后的目标位置  
  238.      */  
  239.     public void ajaxMoveNode(int id, int oldParentId, int newParentId, int nodeIndex){   
  240.         Navigate obj = this.get(id);   
  241.         int minIndex = obj.getNumber().intValue();   
  242.         int maxIndex = nodeIndex;   
  243.         if(oldParentId == newParentId && minIndex != maxIndex){   
  244.             // 在同一个父节点下发生移动   
  245.             if(minIndex < maxIndex){   
  246.                 // 当要移动的节点的序号小于要移动到的目标序号,则下移   
  247.                 this.downNode(oldParentId, minIndex, maxIndex);   
  248.             }else if(minIndex > maxIndex){   
  249.                 // 当要移动的节点的序号大于要移动到的目标序号,则上移   
  250.                 maxIndex = minIndex;   
  251.                 minIndex = nodeIndex;   
  252.                 this.upNode(oldParentId, minIndex, maxIndex);   
  253.             }   
  254.             // 节点本身的序号设置成要移动到的目标序号   
  255.             obj.setNumber(nodeIndex);   
  256.             this.update(obj);   
  257.         }   
  258.         if(oldParentId != newParentId){   
  259.             // 在不同父节点下发生移动   
  260.             //1、相当于要移动的节点在原父节点下下移到最后再删除掉,因此要指定移动发生时节点所在的位置   
  261.             this.downNode(oldParentId, minIndex, -1);   
  262.             //2、相当于要移动的节点在新父节点下上移到指定的位置,因此需要指定要移动到的位置   
  263.             this.upNode(newParentId, maxIndex, -1);   
  264.             // 节点本身的序号设置成要移动到的目标序号   
  265.             obj.setNumber(nodeIndex);   
  266.             obj.setParentId(newParentId);   
  267.             this.update(obj);   
  268.         }   
  269.     }   
  270.     /**  
  271.      * 指定的节点下移  
  272.      * @param parentId  指定范围内要移动的节点的父节点  
  273.      * @param minIndex  指定节点移动发生时所在的位置  
  274.      * @param maxIndex  指定节点要移动到的目标位置  
  275.      */  
  276.     @SuppressWarnings("unchecked")   
  277.     public
  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值