`

使用ExtJS2构造动态异步加载的树

    博客分类:
  • EXT
阅读更多

标题:使用ExtJS2构造动态异步加载的树

作者:JRQ
 
 
正文:
 
使用ExtJS2,以JSON(JavaScript Object Notation)TreeLoader 异步读取数据,构造一棵异步加载的树。
 
 
1. 下载ExtJS2,地址:http://www.extjs.com/
 
   下载Ext JS 2.1 SDK:ext-2.1.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写的mytree.js文件。
 
   关于Ext.tree.TreePanel,可以参考:
 
   http://www.jackytsu.com/extcn/docs/output/Ext.tree.TreePanel.html
 
 
   mytree.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文件调用mytree.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" style="height:101%;width:100%"></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. mytree.js中ExtJS的TreeLoader调用的tree.jsp。
 
   在目录树上点击TreeNode后会加载下一级节点。 
 
   tree.jsp负责TreeNode点击后,传回由下一级节点构造的JSON数据。
 
   tree.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()%>
 
-------------------------------------- 
 
 
7. 江湖故事
 
 
   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版本不匹配造成的。在这个问题上折腾了很久,亦浪费很多时间和精力,痛苦啊。
 
       精神的折磨。
 
       其实,真正的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">
 
 
8. AJAX
 
   AJAXAsynchronous JavaScript and XML(异步JavaScript和XML)
     
   只是为了树,也要学ExtJS。
 
   ExtJS2.1+JSON = 动态异步加载的树
 
 
 
[--完--]
 
 
                                                                      By JRQ 
 
                                                                    2008/06/15 于京
=========================================================
=========================================================
=========================================================
【转载注】
   配置须知:
  1、数据库对应的表中必须添加一个虚根!该虚根是一级节点的父节点。
  2、最好把Ext的相关文件都放到项目中——不仅仅是文章1中说的ext-all.css、ext-base.js、ext-all.js这三个文件。
  3、如果使用的JDK是1.5之前的版本,那么必须下载一个json-lib-2.2.2-jdk13.jar。
  4、必须注意文章2中说的jar包的版本!
分享到:
评论
2 楼 helloandy2009 2010-01-06  
      
1 楼 xy_z487 2008-09-19  
 

相关推荐

    ExtJS构造动态异步加载

    本文将深入探讨如何使用ExtJS构建动态异步加载的树形结构,结合AJAX技术实现JSON数据的高效传输。 首先,我们要理解什么是动态异步加载。在传统的网页开发中,如果一次性加载所有数据,可能会导致页面加载速度慢,...

    extjs动态树struts请求数据

    总结以上,ExtJS动态树与Struts的结合使用,需要熟练掌握ExtJS TreePanel的配置,JSON数据的构造和解析,以及Struts2的Action和Result机制。通过Ajax请求,前端可以动态获取和更新树形数据,实现交互式用户界面。

    Extjs自定义组件-下拉树

    - 实例化`TreeLoader`,用于异步加载树节点数据。 - 创建`TreePanel`实例,配置其属性,包括宽度、高度、动画效果等。 - 定义事件处理器,如`treeClk`,用于处理树节点的点击事件。 #### 四、代码片段解析 ```...

    ExtJs下拉树

    - 通过配置,可以实现异步加载、懒加载,以优化性能。 综上所述,ExtJS的下拉树组件是通过组合ComboBox和TreePanel的特性,为用户提供了一种高效的数据选择方式。了解其工作原理和关键API,有助于开发者在实际项目...

    extjs动态生成表格,前台+后台

    动态生成表格是ExtJS中的一个重要功能,它允许开发者根据需求灵活地构造表格结构和数据。 首先,我们需要了解ExtJS中的核心组件之一——GridPanel。GridPanel是一个显示二维数据的组件,通常用于展示大量结构化的...

    ExtJS4下拉树组件

    对于大型树结构,可以利用异步加载技术实现实时加载数据,提高用户体验。 **6.2 自定义样式** 通过修改CSS样式或在组件中添加额外的样式配置,可以轻松地改变组件的外观。 **6.3 事件监听** 利用组件提供的事件...

    基于ExtJS技术实现的DataGrid 动态数据绑定检索例子程序代码

    Store通过AjaxProxy或者JsonPProxy与服务器通信,实现异步加载数据。 `demo.data.php` 是后端服务,它处理来自前端的请求,查询数据库,并返回格式化的JSON数据。在PHP代码中,可能使用了像PDO这样的数据库连接库来...

    Extjs 3.0 中文API

    4. **Ajax交互**:ExtJS 3.0 提供了Ajax请求的封装,如AjaxProxy和DirectProxy,方便与服务器进行异步通信,实现动态数据加载和更新。 5. **事件系统**:事件驱动是ExtJS中的重要特性,所有组件都支持事件监听和...

    Extjs 性能优化 High Performance ExtJs

    为了提高性能,需要对这些操作进行适当的优化,例如通过分页机制减少数据加载量,使用异步加载技术来提高响应速度等。 #### 九、提示信息的使用 提示信息是与用户交互的重要方式之一,合理的使用可以提高用户体验...

    轻松搞定Extjs

    - **进度条对话框**: 展示了如何使用Extjs实现加载进度的显示。 - **让消息框飞出来**: 介绍了一种特殊的动画效果,使消息框出现时更具视觉冲击力。 #### 页面与脚本完全分离 这一章节讲述了如何利用Extjs实现页面...

    extjs常用增删改查操作

    2. **异步加载**:对于大数据量的情况,采用异步加载方式提高应用性能。 3. **错误处理**:增加异常处理逻辑,确保程序的健壮性。 #### 六、总结 通过上述介绍,我们详细了解了如何在 ExtJS 中实现数据的增删改查...

    ExtJS中文手册.pdf

    - **异步通信**:ExtJS支持通过Ajax进行前后端的异步数据交换。 - **支持多种后端**:不仅支持PHP,还支持ASP.NET、ColdFusion等多种后端技术。 - **数据交互**:通过Ajax可以轻松实现数据的加载、更新等操作,极大...

    自己写的一个动态从后台数据库加载Ext.tree的json数据工具类

    5. **加载到树**:使用`loadData`方法将解析后的数据加载到特定的tree节点。 在实际应用中,这个工具类可能还需要考虑错误处理、数据缓存、以及优化性能的策略,例如使用懒加载(lazy loading)来只在需要时加载子...

    ExtJs4新类库特性详解及JS新语法扩展.pdf

    在ExtJS4中,引入了动态加载机制,允许开发者仅在需要时加载特定的类或文件。这通过`Ext.Loader`对象实现,它提供了设置配置和路径的方法,以便在运行时按需加载资源。例如,`Ext.Loader.setConfig({ enabled: true...

    extjs 源代码码下载

    5. **Ajax 交互**:EXTJS 提供了 AJAX 框架,可以方便地与服务器进行异步通信,处理数据的加载、提交和更新,支持 JSON、XML 等多种数据格式。 6. **拖放功能**:EXTJS 支持组件的拖放操作,用户可以方便地创建可...

    Extjs中ComboBoxTree实现的下拉框树效果(自写)

    - 对于异步加载数据和Ajax请求的处理,确保树节点的动态加载不会导致界面卡顿或错误。 综上所述,实现ComboBoxTree这样的复合控件要求开发者不仅对Extjs的现有组件有深入了解,还要有扩展和自定义组件的能力。这种...

    ExtJS 3.2的中文参考手册

    - **对象创建**: 使用构造函数创建对象实例。 - **构造器函数**: 定义类的构造器函数,初始化对象的属性和方法。 - **方法共享**: 通过原型链实现方法的共享,减少内存消耗。 #### 17. **表单组件入门** - **表...

    Extjs中文教程

    - 通过简单的示例展示如何使用Extjs来创建动态效果。 - 如使用`Ext.Msg.alert`显示欢迎消息。 - **让界面动起来** - Extjs提供了丰富的动画效果,可以通过`Ext.Fx`和`Ext.Element`类实现。 - 动画效果包括淡入...

Global site tag (gtag.js) - Google Analytics