开发者社区> 古镇月影> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

动态异步加载树 ExtJS2,以JSON(JavaScript Object Notation)TreeLoader

简介: 引用:http://blog.163.com/chunchun_1010/blog/static/76482548201031744931142/ 使用ExtJS2,以JSON(JavaScript Object Notation)TreeLoader 异步读取数据,构造一棵异步加载的树   1. 下载ExtJS2,地址:http://www.extjs.com/    下载Ext JS 2.1 SDK:ext-2.2.zip。
+关注继续查看

引用:http://blog.163.com/chunchun_1010/blog/static/76482548201031744931142/

使用ExtJS2,以JSON(JavaScript Object Notation)TreeLoader 异步读取数据,构造一棵异步加载的树

 

1. 下载ExtJS2,地址:http://www.extjs.com/ 

   下载Ext JS 2.1 SDK:ext-2.2.zip。 

   examples文件夹下全部是ExtJS例子演示程序。 

   ExtJS2主要的会用到以下几个文件:ext-all.css、ext-base.js、ext-all.js,使用方法可以参考Demo。 

   Ext文档中心: 

      http://www.ajaxjs.com/docs/docs/ 

      http://www.jackytsu.com/extcn/docs/ 



2. 下载JSON-lib,地址:http://json-lib.sourceforge.net/ 

   打开网址后,首页上有一段话: 

      Json-lib requires (at least) the following dependencies in your classpath: 

      jakarta commons-lang 2.3 
      jakarta commons-beanutils 1.7.0 
      jakarta commons-collections 3.2 
      jakarta commons-logging 1.1.1 
      ezmorph 1.0.4


下载上述jar文件,配合JSON-lib 一起使用。 
   
   commons 下载地址:http://commons.apache.org/ 

   ezmorph 下载地址:http://ezmorph.sourceforge.net 

   或者,到 http://www.docjar.com 搜索下载。 

   JSON的用法,可参考相关文档。 
3. 使用ExtJS写tree.js文件。 

   关于Ext.tree.TreePanel,可以参考: 

   http://www.jackytsu.com/extcn/docs/output/Ext.tree.TreePanel.html 


   tree.js代码如下:

--------------------------

Ext.onReady(function(){ 

   var Tree = Ext.tree; 

   //定义根节点的Loader 
   var treeloader=new Tree.TreeLoader({dataUrl:'tree.jsp?DID=1'}); 

   //异步加载根节点 
   var rootnode=new Tree.AsyncTreeNode({ 
        id:'1', 
        text:'目录树根节点' 
                }); 
     
   var treepanel = new Tree.TreePanel({ 
                //renderTo:"tree_div",//如果使用renderTo,则不能使用setRootNode()方法,需要在TreePanel中设置root属性。 
                el:'tree_div',        //填充区域 
                rootVisible:true,     //隐藏根节点 
                border:true,          //边框 
                animate:true,         //动画效果 
                autoScroll:true,      //自动滚动 
                enableDD:false,       //拖拽节点              
                containerScroll:true, 
                loader:treeloader             
            }); 

   //设置根节点 
   treepanel.setRootNode(rootnode); 

   //响应事件,传递node参数 
   treepanel.on('beforeload', 
                function(node){ 
                   treepanel.loader.dataUrl='tree.jsp?DID='+node.id;    //定义子节点的Loader    
                }); 

   treepanel.render();            
   rootnode.expand(false,false); 
}); 

-----------------------------------

4. 展示树的extjsTree.jsp的文件。该jsp文件调用tree.js,展示树。 

   注意使用到了ext-all.css、ext-base.js、ext-all.js这三个文件。 

   extjsTree.jsp代码如下:

-------------------------------------- 

<html> 
<head> 
<title>ExtJS Tree</title> 
<link rel="stylesheet" type="text/css" href="../extjs/ext-all.css" /> 
<script type="text/javascript" src="../extjs/ext-base.js"></script> 
<script type="text/javascript" src="../extjs/ext-all.js"></script> 

<script type="text/javascript" src="../extjs/mytree.js" defer=true charset="GBK"></script> 
</head> 

<body> 
<table width="100%" height="100%" border="0" cellpadding="0" cellspacing="0" onContextMenu="return false;"> 
<tr> 
   <td align=left valign="top" > 
      <!--树的填充区域--> 
      <div id="tree_div" ></div> 
   </td> 
</tr> 
</table> 
</body> 
</html> 

--------------------------------------

5. 构造树节点。 


   定义树节点的属性,括节点ID、Text、图标、是否为叶子节点、是否展开等。 

   JSONTreeNode.java代码如下: 

-------------------------------------- 

package com.tree; 

import java.io.Serializable; 

public class JSONTreeNode implements Serializable{ 

    private static final long serialVersionUID = 1L; 

    public static void main(String[] args) { 
    
    } 
    
     private String id;            //ID 
     private String text;          //节点显示 
     private String cls;           //图标 
     private boolean leaf;         //是否叶子 
     private String href;          //链接 
     private String hrefTarget;    //链接指向 
     private boolean expandable;   //是否展开 
     private String description;   //描述信息 
     
         //get、set方法。略。 

    } 


--------------------------------------

6. 从数据库查询,读取字节点数据及构造JSON数据。 


   JSONTree.java代码如下: 

-------------------------------------- 
package com.tree; 

import java.sql.Connection; 
import java.sql.Statement; 
import java.sql.ResultSet; 
import java.util.ArrayList; 
import net.sf.json.JSONArray; 
import com.db.DBConnction; 
import com.tree.JSONTreeNode; 

public class JSONTree{ 
    private String PID; 
    
    public String getJSONString(){      
        Connection conn =null; 
        Statement st = null; 
        ResultSet rs = null; 
        ArrayList<JSONTreeNode> TreeNodeArray = null; 
        
        String SQLString = "SELECT * FROM S_MLS WHERE PID="+this.PID+" ORDER BY DID";    
            
        try 
        { 
            conn = DBConnction.getConnection(); 
            st = conn.createStatement(); 
                
            rs = st.executeQuery("SELECT PID FROM S_MLS WHERE PID>0 Group By PID Order By PID");            
            
            StringBuffer parentIDBuffer =new StringBuffer(); 
            parentIDBuffer.append("|");         
            while(rs.next()) 
            { 
                parentIDBuffer.append(rs.getString("PID")); 
                parentIDBuffer.append("|"); 
            } 
            //得到所有的parentDID列表(这是一个巧妙的算法^_^) 
            String parentIDString = parentIDBuffer.toString();         
            
            rs = st.executeQuery(SQLString);    
            TreeNodeArray = new ArrayList<JSONTreeNode>(); 
            
            while(rs.next()) 
            { 
                JSONTreeNode TreeNode = new JSONTreeNode(); 
                TreeNode.setId(rs.getString("DID")); 
                TreeNode.setText(rs.getString("JDMC")); 
                TreeNode.setDescription(rs.getString("JDMC"));          
                    TreeNode.setHref("rightframe.jsp?did="+rs.getString("DID").toString()); 
                    TreeNode.setHrefTarget("rightFrame");               
                
                if (parentIDString.indexOf("|"+rs.getString("DID")+"|")>=0) //父节点 
                    { 
                        TreeNode.setCls("folder"); 
                        TreeNode.setLeaf(false); 
                        TreeNode.setExpandable(false); 
                    } 
                    else //子节点 
                   { 
                        TreeNode.setCls("file"); 
                        TreeNode.setLeaf(true); 
                        TreeNode.setExpandable(false); 
                    } 
                    TreeNodeArray.add(TreeNode); 
            } 
            
            JSONArray JsonArray = JSONArray.fromObject(TreeNodeArray); //得到JSON数组     

            return JsonArray.toString();//返回JSON数据 
        } 
        catch(Exception e) 
        { 
            System.out.println("getJSONString() of JSONTree.java throws : "+e.toString()); 
            return ""; 
        } 
        finally 
        { 
            DBConnction.closeConnection(conn,st,rs); 
        } 
    }   


    public String getPID() { 
        return PID; 
    } 

    public void setPID(String pid) { 
        PID = pid; 
    } 


-------------------------------------- 


7. tree.js中ExtJS的TreeLoader调用的tree.jsp。 

   在目录树上点击TreeNode后会加载下一级节点。 

   extjsTree.jsp负责TreeNode点击后,传回由下一级节点构造的JSON数据。 

   extjsTree.jsp代码如下: 

-------------------------------------- 

<%@ page language="java" pageEncoding="GBK"%> 

<jsp:useBean class="com.thams.tree.JSONTree" id="JSONTree"></jsp:useBean> 

<% 
String PID = ""; 

if (request.getParameter("DID")!=null) 

    PID = request.getParameter("DID").toString(); 


JSONTree.setPID(PID); 
%> 

<%=JSONTree.getJSONString()%> 

-------------------------------------- 


8.  


   1). 如果要做ExtJS Tree的DEMO,生成TreeLoader()时,尽量不要使用静态的JSON格式文件。 
       
       如: 
           Tree.TreeLoader({dataUrl:'/jsondata.txt'}); 

           Tree.TreeLoader({dataUrl:'/jsondata.js'});   

       等诸如此类。 


       在网上查资料时,做ExtJS Tree时,很多资料说使用静态的JSON文件做Demo,我使用ExtJS2.1,一次没有成功。 

       为此浪费了很多时间精力,付出惨重代价。 


   2). 使用JSON的时候,需要一些jar文件来配合使用。 

       从网上下载的时候,很多是zip文件,当时没有多加考虑,按照以往的经验,直接修改后缀名为jar,然后导入到lib文件夹,结果会报错。 

       诸如: 

       javax.servlet.ServletException: org/apache/commons/lang/exception/NestableRuntimeException 

       java.lang.NoClassDefFoundError: org/apache/commons/lang/exception/NestableRuntimeException 


       其实,真正的jar文件需要解压zip文件后才能得到的。低级错误. 


   3). 关于s.gif文件的问题 
       
       该问题会在系统不连互联网的情况下暴露。 
       
       因为ExtJS在生成Tree时,默认情况下,总是访问http://extjs.com/s.gif下载这个s.gif图片文件。 

       在不连网的情况下,树节点的导航图片显示不出,通过右键属性可知,是http://extjs.com/s.gif。 

       通过搜索,发现该s.gif是在ext-base.js这个文件中定义的: 
     
       BLANK_IMAGE_URL:"http:/"+"/extjs.com/s.gif" 

       并且ExtJS中的示例程序是带有这个s.gif图片文件的。       

       根据具体应用情况,把ext-base.js修改成为: 

       BLANK_IMAGE_URL:"../images/default/s.gif" 


   4). 调试的时候,JS报错:未结束的字符串常量。 

      这个问题是因为JS调用时没有指定字符集,造成JS里的汉字出现乱码引起的。 

      调用JS时,可以指定使用字符集。 

      如:<script type="text/javascript" defer=true src="xxx.js" charset="GBK"> 


9. AJAX 

   AJAX:Asynchronous JavaScript and XML(异步JavaScript和XML) 
      
   只是为了树,也要学ExtJS。 

   ExtJS2.1+JSON = 动态异步加载的树

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
如何不重启热更新线上 Java 代码?
热更新代码的场景 1)当线上服务器出现问题时,有些时候现有的手段不足以发现问题所在,可能需要追加打印日志或者增加一些调试代码,如果我们去改代码重新部署,会破坏问题现场,可以通过热部署的手段来增加调试代码
118 0
JavaScript 技术篇 - Node.js、npm的安装过程演示
JavaScript 技术篇 - Node.js、npm的安装过程演示
33 0
杨老师课堂之JavaEE三大框架Struts2入门第一课
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kese7952/article/details/81080707 本篇任务 1.
1167 0
JavaEE Mybatis使用
1. Mybatis官网 下载地址 解压之后的内容: 图1.png Mybatis框架结构: 图2.png 简要概述: SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。
937 0
深入JavaWeb技术世界15:通过项目逐步深入了解Mybatis(二)
本文出自我的公众号:程序员江湖。 满满干货,关注就送。 转自http://www.54tianzhisheng.cn/2017/06/13 Mybatis 解决 jdbc 编程的问题 1、 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
1197 0
Express框架使用以及数据库公共操作类整理(Win7下的NodeJs)
具体步骤: 1、安装开发工具WebStorm; 2、安装node/npm(下载地址:https://nodejs.org/download/)选择适合你的xxx.mis安装; 3、安装express框架(cmd窗口模式,用npm命令执行:npm install express); 4、创建n...
861 0
九个让人难以置信的HTML5和JavaScript实验
您可能还喜欢   8个惊艳的 HTML5 和 JavaScript 特效 让人眼花缭乱的 HTML5 和 JavaScript 效果 推荐18个基于 HTML 5 Canvas 开发的图表库 29款基于 HTML5 Canvas 开发的网页游戏 五大主流浏览器 CSS3 和 HTML5 兼容性大比拼     Google的 Chrome实验室 收集了很多让人难以置信的基于 HTML5 Canvas 和 JavaScript 的实验项目,里面的例子都很独特,让人惊叹。
913 0
+关注
1699
文章
3
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载