ExtJS4+Servlet/Struts2+JSON+accordion布局动态Ext.tree.Panel菜单

 先贴个图给大家,实现的是一个Accordion布局的动态菜单,俗称手拉琴布局,切入正题:
       首先构造出一个窗口(Ext.window.Window),布局选择Accordion,代码:
[javascript]  view plain copy
  1. var win = Ext.create("Ext.window.Window", {  
  2.                 title : "Accordion布局动态菜单",  
  3.                 width : 300,  
  4.                 height : 500,  
  5.                 iconCls : "icon-accordion",  
  6.                 autoScroll : false,  
  7.                 layout : 'accordion'//设置布局  
  8.                 layoutConfig : {  
  9.                     animate : true //动态切换树空间  
  10.                 }  
  11.             });  
  12.             win.show();  


       然后向后台发送AJAX请求,获取窗口的面板列表:
[javascript]  view plain copy
  1. ajax({  
  2.                 url : "/Accordion/accordion",//获取面板的地址  
  3.                 params : {  
  4.                     action : "list"  
  5.                 },  
  6.                 callback : addTree  
  7.             });  


       这里对Ext.Ajax.request方法做了一个简易的封装:
[javascript]  view plain copy
  1. var ajax = function(config) { //封装、简化AJAX  
  2.             Ext.Ajax.request({  
  3.                 url : config.url, //请求地址  
  4.                 params : config.params, //请求参数  
  5.                 method : 'post'//方法  
  6.                 callback : function(options, success, response) {  
  7.                     config.callback(Ext.JSON.decode(response.responseText));  
  8.                     //调用回调函数  
  9.                 }  
  10.             });  
  11.             return false;  
  12.         };  


       在SERVLET代码里面,准备树面板的数据,在doPost方法中根据action判断是获取面板列表还是树节点,然后将数据发送到页面,renderText方法不是很关键,大家可以去下载源码看看,这里就不写出来:
[java]  view plain copy
  1. public void doPost(HttpServletRequest request, HttpServletResponse response)  
  2.         throws ServletException, IOException {  
  3.     String action = request.getParameter("action");  
  4.     initHeader(response);  
  5.     if(action.equals("list")){//获取属面板列表  
  6.         renderText(this.getTreePanelList(), response);  
  7.     }else if(action.equals("node")){  
  8.         renderText(this.getTreeNodeList(request.getParameter("id")), response);  
  9.     }  
  10. }  
       这里获取的树面板列表,调用方法:
[java]  view plain copy
  1. public String getTreePanelList(){  
  2.     JSONArray array = new JSONArray();  
  3.     for (int i = 0; i < 5; i++) { //生成5个属面板  
  4.         JSONObject json = new JSONObject();  
  5.         json.element("id", i+1);  
  6.         json.element("iconCls""icon-panel");  
  7.         json.element("title""Accordion菜单"+(i+1));  
  8.         array.add(json);  
  9.     }  
  10.     return array.toString();  
  11. }  
 通过Google Chrome的开发工具来查看获取的树面板列表数据:

 在获取属面板列表成功之后,执行addTree回调函数,根据获取的数据生成树面板(Ext.tree.Panel)树面板添加进窗口中,在生成树面板之前得先给树面板的树注册一个数据源以及为数据源指定数据模型,数据模型的作用主要是可以将自己想要的业务数据即和树展示无关的数据传递到页面,方便使用:
[javascript]  view plain copy
  1. function addTree(data){  
  2.                 for ( var i = 0; i < data.length; i++) {  
  3.                     win.add(Ext.create("Ext.tree.Panel", {  
  4.                         title : data[i].title,  
  5.                         iconCls : data[i].iconCls,  
  6.                         autoScroll : true,  
  7.                         rootVisible : false,  
  8.                         viewConfig : {  
  9.                             loadingText : "正在加载..."  
  10.                         },  
  11.                         store : createStore(data[i].id)  
  12.                     }));  
  13.                     win.doLayout();   
  14.                 }  
  15.             }  
  16.             var model = Ext.define("TreeModel", { //定义树节点数据模型  
  17.                 extend : "Ext.data.Model",  
  18.                 fields : [ {name : "id",type : "string"},  
  19.                            {name : "text",type : "string"},   
  20.                            {name : "iconCls",type : "string"},   
  21.                            {name : "leaf",type : "boolean"}   
  22.                          ]  
  23.             });  
  24.            var createStore  =  function(id){ //创建树面板数据源  
  25.                var me = this;  
  26.                return Ext.create("Ext.data.TreeStore",{  
  27.                    defaultRootId : id, //默认的根节点id  
  28.                    model : model,  
  29.                    proxy : {  
  30.                        type : "ajax"//获取方式  
  31.                        url : "/Accordion/accordion?action=node" //获取树节点的地址  
  32.                    },  
  33.                    clearOnLoad : true,  
  34.                    nodeParam : "id"//设置传递给后台的参数名,值是树节点的id属性  
  35.                });  
  36.            };  
 最后就是实现如果生成树节点的的数据:
[java]  view plain copy
  1. public String getTreeNodeList(String id){ //获取树节点的数据  
  2.     JSONArray array = new JSONArray();  
  3.     for (int j = 0; j < 5; j++) {  
  4.         JSONObject json = new JSONObject();  
  5.         json.element("id", id + "-" +(j+1));  
  6.         json.element("text""树节点-"+ id + "-" +(j+1));  
  7.         if((j+1) % 2 == 0 && id.length() <= 3){ //判断顺序为偶数的节点,及层数不超过三层的节点可以加载子节点  
  8.             json.element("leaf"false); //通过leaf属性来控制树节点是否是叶子节点(没有子节点的节点),能否加载数据  
  9.         }else{  
  10.             json.element("leaf"true);  
  11.         }  
  12.         array.add(json);  
  13.     }  
  14.     return array.toString();  
  15. }  
      然而通过这些代码实现后会发现一个属面板展示上的BUG,树面板里面的树空间的宽度不正确:
      这是一个Ext4的BUG,不过不要紧,BUG总是可以会修复的,将addTree的代码改造一下,给树面板注册一个afterLayout的监听器,实例当中的代码是改造后的,只是跟大家说明下这段代码的用途:
[javascript]  view plain copy
  1. function addTree(data){  
  2.                 for ( var i = 0; i < data.length; i++) {  
  3.                     win.add(Ext.create("Ext.tree.Panel", {  
  4.                         title : data[i].title,  
  5.                         iconCls : data[i].iconCls,  
  6.                         autoScroll : true,  
  7.                         rootVisible : false,  
  8.                         viewConfig : {  
  9.                             loadingText : "正在加载..."  
  10.                         },  
  11.                         store : createStore(data[i].id),  
  12.                         listeners : {  
  13.                             afterlayout : function(){  
  14.                                 if(this.getView().el){  
  15.                                     var el = this.getView().el;  
  16.                                     var table = el.down("table.x-grid-table");  
  17.                                     if(table){  
  18.                                         table.setWidth(el.getWidth());  
  19.                                     }  
  20.                                 }  
  21.                             }  
  22.                         }  
  23.                     }));  
  24.                     win.doLayout();  
  25.                       
  26.                 }  
  27.             }  
   
 最后一个话题,在STRUTS中如何实现,很简单:也是准备数据,然后将数据发送到页面就可以!
 这样,一个Accordion布局整合SERVLET/STRUTS2+JSON+动态Ext.tree.Panel菜单就OK了!
 下面是展示两张将这个模块应用到系统中的效果:




Ext还能做什么?只有想不到的,没有做不到了,进入 http://blog.csdn.net/leecho571/article/details/8207102 感受Ext带来的新的体验

实例下载: http://download.csdn.net/detail/leecho571/3901796,
大家可以去看我的另外一篇文章,里面有更深入的关于Ext.tree.Panel和Ext.tab.Panel的使用

原文出处:http://blog.csdn.net/leecho571/article/details/7051825
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值