Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > Java > 利用Dojo和JSON建立无限级AJAX动态加载的功能模块树
【标  题】:利用Dojo和JSON建立无限级AJAX动态加载的功能模块树
【关键字】:Dojo,JSON,AJAX
【来  源】:http://blog.csdn.net/yanchunlili/archive/2006/12/30/1469422.aspx

利用Dojo和JSON建立无限级AJAX动态加载的功能模块树

Your Ad Here         在JavaEye看了“使用hibernate实现树形结构无限级分类”这篇文章后,我也想将自己在所有开发的项目中使用的功能模块树的实现方法以及完整DEMO(含源码)贴出来和大家分享。其实在我的博客里是老早贴出来的,由于时间关系没好好整理。

       功能模块树是几乎在每个项目里都要用到的东西,利用Dojo的好处就是可以实现树的子节点的动态加载,这在树节点很多的情况下是很有用的。

        下载DEMO附件请到JavaEye:http://boogie.javaeye.com/blog/26240

        下载附件二dojotree.rar,解压后将dist\dojotree.war部署到应用服务器即可浏览DEMO,DEMO中内置HSQLDB数据库,启动时自动加载。DEMO运行截图见附件一。

一、tree.jsp主要代码

1、首先在head中导入Dojo库(dojo.js)和TreeWidget

<script type="text/javascript" src="ajax/dojo/dojo.js"></script>
<script type="text/javascript">
dojo.require(
"dojo.widget.Tree");
dojo.require(
"dojo.widget.TreeNode");
dojo.require(
"dojo.widget.TreeSelector");
dojo.require(
"dojo.widget.TreeRPCController");
dojo.require(
"dojo.widget.TreeLoadingController");
dojo.require(
"dojo.widget.TreeContextMenu");
</script>

2、在body中放置TreeWidget,TreeLoadingController中的RPCUrl="treeServlet"为从后台获取数据的servlet名称,TreeNode中的expandLevel表示树初始张开级别

  <div dojoType="TreeLoadingController" RPCUrl="treeServlet" widgetId="treeController" DNDController="create"></div>
  <div dojoType="TreeSelector" widgetId="treeSelector"></div>
  <div dojoType="Tree" DNDMode="between" selector="treeSelector" widgetId="bandTree" controller="treeController">
  <div dojoType="TreeNode" title="root" widgetId="root" objectId="root" isFolder="true" childIconSrc="images/comm.gif" expandLevel="1"/>

3、建立TreeSelector事件处理函数

function treeSelectFired() {
    
// get a reference to the treeSelector and get the selected node 
    var treeSelector = dojo.widget.manager.getWidgetById('treeSelector');
    
var treeNode = treeSelector.selectedNode;
    
// get a reference to the songDisplay div
    var hostDiv = document.getElementById("songDisplay");
    
var isFolder = treeNode['isFolder'];
    
//alert(isFolder);
    if ( !isFolder) {
       
var song = treeNode['title'];
       
var url = treeNode['url'];
       link(url);
    }
 else 
    }

}

4、将select事件处理函数关联到treeSelector

function init() 

    
//get a reference to the treeSelector
    var treeSelector = dojo.widget.manager.getWidgetById('treeSelector');

    
//connect the select event to the function treeSelectFired()
    dojo.event.connect(treeSelector,'select','treeSelectFired'); 
}


dojo.addOnLoad(init);


二、主要java代码及数据结构

1、Gnmk.java中tree的属性

private String id;    

private String gnmkdm;  //功能模块代码  

private String gnmksm;  //功能模块说明  
 
private String gnmktb;  //功能模块图标  

private String gnmklj;  //功能模块路径  

private String gnmkmc;  //功能模块名称  
  
private String gnmksj;  //功能模块上级代码  

private String gnmkbz;  //功能模块标志(‘N’为叶节点)  

2、HSQLDB内存数据库加载SQL(db.sql)

CREATE TABLE GNMK (ID VARCHAR, GNMKDM VARCHAR, GNMKMC VARCHAR, GNMKLJ VARCHAR, GNMKTB VARCHAR, GNMKBZ VARCHAR, GNMKSJ VARCHAR);
INSERT INTO GNMK VALUES ('d098a59f0b765c30010b765d6b780001''01''一级目录1'null'system.gif''Y''');
INSERT INTO GNMK VALUES ('d098a59f0b765e68010b765fda830001''0101''二级目录1''cxtjAction.do''system.gif''N''01');
INSERT INTO GNMK VALUES ('d098a59f0b765e68010b765fda830001''0102''二级目录2''cxtjAction.do''system.gif''N''01');
INSERT INTO GNMK VALUES ('d098a59f0b765c30010b765d6b780002''02''一级目录2'null'system.gif''Y''');
INSERT INTO GNMK VALUES ('d098a59f0b765e68010b765fda830002''0201''二级目录1''cxtjAction.do''system.gif''N''02');
INSERT INTO GNMK VALUES ('d098a59f0b765e68010b765fda830002''0202''二级目录2''cxtjAction.do''system.gif''Y''02');
INSERT INTO GNMK VALUES ('d098a59f0b765e68010b765fda830002''020201''三级目录1''cxtjAction.do''system.gif''N''0202');
INSERT INTO GNMK VALUES ('d098a59f0b765e68010b765fda830002''020202''三级目录2''cxtjAction.do''system.gif''N''0202');

3、TreeServlet .java主要代码,在getGnmkByParent(String gnmksj)方法中可以实现自己的业务,DEMO中使用GnmkDAO

public class TreeServlet extends HttpServlet {

    
private static final long serialVersionUID = 1L;

    
protected void doGet(HttpServletRequest request,
            HttpServletResponse response) 
throws ServletException, IOException {
        String action 
= request.getParameter("action");
        System.out.println(
"action b=>" + action);
        System.out.println(
"action b=>" + action);
        String data 
= request.getParameter("data");
        
if (action.equalsIgnoreCase("getChildren")) {
            JSONTokener jsonTokener 
= new JSONTokener(data);
            JSONObject jsonObject 
= (JSONObject) jsonTokener.nextValue();
            JSONObject parentNodeObject 
= (JSONObject) jsonObject.get("node");

            response.setContentType(
"text/json; charset=gb2312");
            PrintWriter out 
= response.getWriter();
            out.write(getChildren(parentNodeObject));
        }
 else {
        }

    }


    
private String getChildren(JSONObject parentNodeObject) {
        JSONArray result 
= new JSONArray();
        String parentObjectId 
= parentNodeObject.getString("objectId");// id 唯一
        
// String parentWidgetId = parentNodeObject.getString("widgetId");// dm
        parentObjectId = parentObjectId.equalsIgnoreCase("root"? ""
                : parentObjectId;
        System.out.println(
"parentObjectId=>" + parentObjectId);
        
// 获取子功能模块
        List listGnmk = this.getGnmkByParent(parentObjectId);
        System.out.println(
"listGnmk=>" + listGnmk.size());
        
if (listGnmk != null{
            Iterator itGnmk 
= listGnmk.iterator();
            
while (itGnmk.hasNext()) {
                Gnmk qxgnmk 
= (Gnmk) itGnmk.next();
                
try {
                    JSONObject jsonGnmkObject 
= new JSONObject();
                    String gnmkbz 
= qxgnmk.getGnmkbz();
                    
boolean isFolder = gnmkbz.equalsIgnoreCase("Y"? true
                            : 
false;
                    jsonGnmkObject.put(
"title", qxgnmk.getGnmkmc());
                    jsonGnmkObject.put(
"isFolder", isFolder);
                    jsonGnmkObject.put(
"widgetId", qxgnmk.getGnmkdm());
                    jsonGnmkObject.put(
"objectId", qxgnmk.getGnmkdm());
                    jsonGnmkObject.put(
"childIconSrc""images/"
                            
+ qxgnmk.getGnmktb());
                    jsonGnmkObject.put(
"url", qxgnmk.getGnmklj());
                    result.put(jsonGnmkObject);
                }
 catch (JSONException e) {
                    e.printStackTrace();
                }

            }

        }

        
return result.toString();
    }


    
private List getGnmkByParent(String gnmksj) {
        GnmkDAO gnmkDao 
= new GnmkDAO();
        
return gnmkDao.getGnmkByParent(gnmksj);
    }

}


三、关于DEMO的其它配置说明

1、实现javax.servlet.ServletContextListener接口的contextInitialized方法来加载HSQLDB及其数据,ContextListener.java主要代码

    public void contextInitialized(ServletContextEvent event) {
        
try {
            
// load the driver
            Class.forName("org.hsqldb.jdbcDriver");
            
// create the table and add sample data
            InputStreamReader in = new InputStreamReader(getClass().getClassLoader().getResourceAsStream("db.sql"));
            BufferedReader reader 
= new BufferedReader(in);
            DBUtils.setupDatabase(reader);
        }
 catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        
    }

2、web.xml相关配置

    <listener>
        
<listener-class>dojo.sample.ContextListener</listener-class>
    
</listener>

    
<servlet>
        
<servlet-name>treeServlet</servlet-name>
        
<servlet-class>dojo.sample.TreeServlet</servlet-class>
    
</servlet>
    
    
<servlet-mapping>
        
<servlet-name>treeServlet</servlet-name>
        
<url-pattern>/treeServlet</url-pattern>
    
</servlet-mapping>
JBI规范1.0[6]——管理:【上一篇】
J2EE中的用户权限模型(RBAC)的设计:【下一篇】
【相关文章】
  • ajax.net 真的挺强悍的
  • 使用AJAX技术时要注意传参数时特殊字符(&)问题
  • ASP.NET AJAX 使用ScriptManager控件
  • Asp.net Ajax 中的脚本错误: 'Sys'未定义 的解决方法
  • 一个AJAX树控件,简单好用,目前只能支持IE,过两天找个空间传上来分享
  • ajax学习笔记----一个初步的ajax开发框架
  • 面向 Java 开发人员的 Ajax: 构建动态的 Java 应用程序
  • Ajax Reload
  • (摘)开源AJAX开发框架
  • PHP和AJAX打造高级RSS聚合器
  • 【随机文章】
  • ASP进阶之文章在线管理更新(四)
  • JavaScript 数组
  • 冷备份后,恢复被误删除的表
  • SQA要辅助RD养成良好的开发习惯
  • 打一跑十,奇怪的错误(已解决)
  • 编程交流与学习--More Effective C++的学习-Item M29:引用计数
  • mplayer播放器
  • Coreldraw初始设置要项
  • 平分秋色? 鹿死谁手?
  • VMBasic 1.0发布
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.