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

前端之家收集整理的这篇文章主要介绍了利用Dojo和JSON建立无限级AJAX动态加载的功能模块树前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
看了“使用hibernate实现树形结构无限级分类”这篇文章后,我也想将自己在所有开发的项 目中使用的功能模块树的实现方法以及完整DEMO(含源码)贴出来和大家分享。其实在我的博客里是老早贴出来的,由于时间关系没好好整理。

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

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

一、tree.jsp主要代码

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

  1. @H_502_17@@H_502_17@ "text/javascript"@H_502_17@src="ajax/dojo/dojo.js"@H_502_17@>
  2. @H_502_17@ "text/javascript" @H_502_17@>
  3. @H_502_17@dojo.require("dojo.widget.Tree"@H_502_17@);
  4. @H_502_17@dojo.require("dojo.widget.TreeNode"@H_502_17@);
  5. @H_502_17@dojo.require("dojo.widget.TreeSelector"@H_502_17@);
  6. @H_502_17@dojo.require("dojo.widget.TreeRPCController"@H_502_17@);
  7. @H_502_17@dojo.require("dojo.widget.TreeLoadingController"@H_502_17@);
  8. @H_502_17@dojo.require("dojo.widget.TreeContextMenu"@H_502_17@);
  9. @H_502_17@


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

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

3、建立TreeSelector事件处理函数

  1. @H_502_17@function@H_502_17@treeSelectFired(){
  2. @H_502_17@//getareferencetothetreeSelectorandgettheselectednode@H_502_17@
  3. @H_502_17@var@H_502_17@treeSelector=dojo.widget.manager.getWidgetById('treeSelector');
  4. @H_502_17@var@H_502_17@treeNode=treeSelector.selectedNode;
  5. @H_502_17@//getareferencetothesongDisplaydiv@H_502_17@
  6. @H_502_17@var@H_502_17@hostDiv=document.getElementById("songDisplay"@H_502_17@);
  7. @H_502_17@var@H_502_17@isFolder=treeNode['isFolder'];
  8. @H_502_17@//alert(isFolder);@H_502_17@
  9. @H_502_17@if@H_502_17@(!isFolder){
  10. @H_502_17@var@H_502_17@song=treeNode['title'];
  11. @H_502_17@var@H_502_17@url=treeNode['url'];
  12. @H_502_17@link(url);
  13. @H_502_17@}else@H_502_17@{
  14. @H_502_17@}
  15. @H_502_17@}

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

  1. @H_502_17@function@H_502_17@init(){
  2. @H_502_17@
  3. @H_502_17@//getareferencetothetreeSelector@H_502_17@
  4. @H_502_17@var@H_502_17@treeSelector=dojo.widget.manager.getWidgetById('treeSelector');
  5. @H_502_17@
  6. @H_502_17@//connecttheselecteventtothefunctiontreeSelectFired()@H_502_17@
  7. @H_502_17@dojo.event.connect(treeSelector,'select','treeSelectFired');
  8. @H_502_17@}
  9. @H_502_17@
  10. @H_502_17@dojo.addOnLoad(init);


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

1、Gnmk.java中tree的属性

  1. @H_502_17@@H_502_17@private@H_502_17@Stringid;
  2. @H_502_17@
  3. @H_502_17@private@H_502_17@Stringgnmkdm;//功能模块代码@H_502_17@
  4. @H_502_17@
  5. @H_502_17@private@H_502_17@Stringgnmksm;//功能模块说明@H_502_17@
  6. @H_502_17@
  7. @H_502_17@private@H_502_17@Stringgnmktb;//功能模块图标@H_502_17@
  8. @H_502_17@
  9. @H_502_17@private@H_502_17@Stringgnmklj;//功能模块路径@H_502_17@
  10. @H_502_17@
  11. @H_502_17@private@H_502_17@Stringgnmkmc;//功能模块名称@H_502_17@
  12. @H_502_17@
  13. @H_502_17@private@H_502_17@Stringgnmksj;//功能模块上级代码@H_502_17@
  14. @H_502_17@
  15. @H_502_17@private@H_502_17@Stringgnmkbz;//功能模块标志(‘N’为叶节点)@H_502_17@

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

  1. @H_502_17@CREATE@H_502_17@TABLE@H_502_17@GNMK(IDVARCHAR@H_502_17@,GNMKDMVARCHAR@H_502_17@,GNMKMCVARCHAR@H_502_17@,GNMKLJVARCHAR@H_502_17@,GNMKTBVARCHAR@H_502_17@,GNMKBZVARCHAR@H_502_17@,GNMKSJVARCHAR@H_502_17@);
  2. @H_502_17@INSERT@H_502_17@INTO@H_502_17@GNMKVALUES@H_502_17@('d098a59f0b765c30010b765d6b780001','01','一级目录1',null@H_502_17@,'system.gif','Y',''@H_502_17@);
  3. @H_502_17@INSERT@H_502_17@INTO@H_502_17@GNMKVALUES@H_502_17@('d098a59f0b765e68010b765fda830001','0101','二级目录1','cxtjAction.do','N','01');
  4. @H_502_17@INSERT@H_502_17@INTO@H_502_17@GNMKVALUES@H_502_17@('d098a59f0b765e68010b765fda830001','0102','二级目录2','01');
  5. @H_502_17@INSERT@H_502_17@INTO@H_502_17@GNMKVALUES@H_502_17@('d098a59f0b765c30010b765d6b780002','02','一级目录2',''@H_502_17@);
  6. @H_502_17@INSERT@H_502_17@INTO@H_502_17@GNMKVALUES@H_502_17@('d098a59f0b765e68010b765fda830002','0201','02');
  7. @H_502_17@INSERT@H_502_17@INTO@H_502_17@GNMKVALUES@H_502_17@('d098a59f0b765e68010b765fda830002','0202','02');
  8. @H_502_17@INSERT@H_502_17@INTO@H_502_17@GNMKVALUES@H_502_17@('d098a59f0b765e68010b765fda830002','020201','三级目录1','0202');
  9. @H_502_17@INSERT@H_502_17@INTO@H_502_17@GNMKVALUES@H_502_17@('d098a59f0b765e68010b765fda830002','020202','三级目录2','0202');

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

  1. @H_502_17@public@H_502_17@class@H_502_17@TreeServletextends@H_502_17@HttpServlet{
  2. @H_502_17@
  3. @H_502_17@private@H_502_17@static@H_502_17@final@H_502_17@long@H_502_17@serialVersionUID=1L;
  4. @H_502_17@
  5. @H_502_17@protected@H_502_17@void@H_502_17@doGet(HttpServletRequestrequest,
  6. @H_502_17@HttpServletResponseresponse)throws@H_502_17@ServletException,IOException{
  7. @H_502_17@Stringaction=request.getParameter("action"@H_502_17@);
  8. @H_502_17@System.out.println("actionb=>"@H_502_17@+action);
  9. @H_502_17@System.out.println("actionb=>"@H_502_17@+action);
  10. @H_502_17@Stringdata=request.getParameter("data"@H_502_17@);
  11. @H_502_17@if@H_502_17@(action.equalsIgnoreCase("getChildren"@H_502_17@)){
  12. @H_502_17@JSONTokenerjsonTokener=new@H_502_17@JSONTokener(data);
  13. @H_502_17@JSONObjectjsonObject=(JSONObject)jsonTokener.nextValue();
  14. @H_502_17@JSONObjectparentNodeObject=(JSONObject)jsonObject.get("node"@H_502_17@);
  15. @H_502_17@
  16. @H_502_17@response.setContentType("text/json;charset=gb2312"@H_502_17@);
  17. @H_502_17@PrintWriterout=response.getWriter();
  18. @H_502_17@out.write(getChildren(parentNodeObject));
  19. @H_502_17@}else@H_502_17@{
  20. @H_502_17@}
  21. @H_502_17@}
  22. @H_502_17@
  23. @H_502_17@private@H_502_17@StringgetChildren(JSONObjectparentNodeObject){
  24. @H_502_17@JSONArrayresult=new@H_502_17@JSONArray();
  25. @H_502_17@StringparentObjectId=parentNodeObject.getString("objectId"@H_502_17@);//id唯一@H_502_17@
  26. @H_502_17@//StringparentWidgetId=parentNodeObject.getString("widgetId");//dm@H_502_17@
  27. @H_502_17@parentObjectId=parentObjectId.equalsIgnoreCase("root"@H_502_17@)?""@H_502_17@
  28. @H_502_17@:parentObjectId;
  29. @H_502_17@System.out.println("parentObjectId=>"@H_502_17@+parentObjectId);
  30. @H_502_17@//获取功能模块@H_502_17@
  31. @H_502_17@ListlistGnmk=this@H_502_17@.getGnmkByParent(parentObjectId);
  32. @H_502_17@System.out.println("listGnmk=>"@H_502_17@+listGnmk.size());
  33. @H_502_17@if@H_502_17@(listGnmk!=null@H_502_17@){
  34. @H_502_17@IteratoritGnmk=listGnmk.iterator();
  35. @H_502_17@while@H_502_17@(itGnmk.hasNext()){
  36. @H_502_17@Gnmkqxgnmk=(Gnmk)itGnmk.next();
  37. @H_502_17@try@H_502_17@{
  38. @H_502_17@JSONObjectjsonGnmkObject=new@H_502_17@JSONObject();
  39. @H_502_17@Stringgnmkbz=qxgnmk.getGnmkbz();
  40. @H_502_17@boolean@H_502_17@isFolder=gnmkbz.equalsIgnoreCase("Y"@H_502_17@)?true@H_502_17@
  41. @H_502_17@:false@H_502_17@;
  42. @H_502_17@jsonGnmkObject.put("title"@H_502_17@,qxgnmk.getGnmkmc());
  43. @H_502_17@jsonGnmkObject.put("isFolder"@H_502_17@,isFolder);
  44. @H_502_17@jsonGnmkObject.put("widgetId"@H_502_17@,qxgnmk.getGnmkdm());
  45. @H_502_17@jsonGnmkObject.put("objectId"@H_502_17@,qxgnmk.getGnmkdm());
  46. @H_502_17@jsonGnmkObject.put("childIconSrc"@H_502_17@,"images/"@H_502_17@
  47. @H_502_17@+qxgnmk.getGnmktb());
  48. @H_502_17@jsonGnmkObject.put("url"@H_502_17@,qxgnmk.getGnmklj());
  49. @H_502_17@result.put(jsonGnmkObject);
  50. @H_502_17@}catch@H_502_17@(JSONExceptione){
  51. @H_502_17@e.printStackTrace();
  52. @H_502_17@}
  53. @H_502_17@}
  54. @H_502_17@}
  55. @H_502_17@return@H_502_17@result.toString();
  56. @H_502_17@}
  57. @H_502_17@
  58. @H_502_17@private@H_502_17@ListgetGnmkByParent(Stringgnmksj){
  59. @H_502_17@GnmkDAOgnmkDao=new@H_502_17@GnmkDAO();
  60. @H_502_17@return@H_502_17@gnmkDao.getGnmkByParent(gnmksj);
  61. @H_502_17@}
  62. @H_502_17@}


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

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

  1. @H_502_17@public@H_502_17@void@H_502_17@contextInitialized(ServletContextEventevent){
  2. @H_502_17@try@H_502_17@{
  3. @H_502_17@//loadthedriver@H_502_17@
  4. @H_502_17@Class.forName("org.hsqldb.jdbcDriver"@H_502_17@);
  5. @H_502_17@//createthetableandaddsampledata@H_502_17@
  6. @H_502_17@InputStreamReaderin=new@H_502_17@InputStreamReader(getClass().getClassLoader().getResourceAsStream("db.sql"@H_502_17@));
  7. @H_502_17@BufferedReaderreader=new@H_502_17@BufferedReader(in);
  8. @H_502_17@DBUtils.setupDatabase(reader);
  9. @H_502_17@}catch@H_502_17@(ClassNotFoundExceptione){
  10. @H_502_17@e.printStackTrace();
  11. @H_502_17@}
  12. @H_502_17@
  13. @H_502_17@}

2、web.xml相关配置

  1. @H_502_17@<listener>@H_502_17@
  2. @H_502_17@<listener-class>@H_502_17@
  3. @H_502_17@dojo.sample.ContextListener
  4. @H_502_17@ listener-class>@H_502_17@
  5. @H_502_17@ >@H_502_17@

猜你在找的Dojo相关文章