【转】Struts2 JSON 2

核心提示:最近尝试用extjs来展示树状菜单。着实花了一番功夫。树状菜单的菜单项需要动态加载,而目前版本的extjs中只支持JSON格式的数据。查了一些资料,决定使用struts2的json-plugin。首先按照例子做了一个,但是结果就是不成功,界面上只出来了一个js中生成的root

最近尝试用extjs来展示树状菜单。着实花了一番功夫。树状菜单的菜单项需要动态加载,而目前版本的extjs中只支持JSON格式的数据。查了一些资料,决定使用struts2的json-plugin。首先按照例子做了一个,但是结果就是不成功,界面上只出来了一个js中生成的root节点,不能加载从后台生成的数据。研究后发现是数据格式有问题。使用json-plugin生成的数据格式如下:

  1. {"cls":"folder","id":10,"leaf":false,"children":[{"cls":"file","id":11,"leaf":true,"children":null,"text":"S600"},{"cls":"file","id":12,"leaf":true,"children":null,"text":"SLK200"}],"text":"Benz"} 

而extjs需要的数据格式如下:

  1. [{"cls":"folder","id":10,"leaf":false,"children":[{"cls":"file","id":11,"leaf":true,"children":null,"text":"S600"},{"cls":"file","id":12,"leaf":true,"children":null,"text":"SLK200"}],"text":"Benz"}] 

区别很小,就只相差最外面的两个方括号。但是少了这两个方括号,在json中,含义迥然不同,前者表示一个对象,而后者表示一个数组。而extjs中 tree的dataloader需要的数据必须是一个数组。而这样的数据格式是json-plugin自动生成的,无法改变。所以,我最后放弃了json -plugin,转而使用json-lib来解决这个问题。
1. 下载json-lib, http://json-lib.sourceforge.net/
2. lib目录下的jar文件清单:
commons-beanutils-1.7.0.jar
commons-collections-3.2.jar
commons-digester-1.6.jar
commons-lang-2.3.jar
commons-logging-1.1.jar
dom4j-1.6.1.jar
ezmorph-1.0.4.jar
freemarker-2.3.8.jar
javassist-3.8.1.jar
json-lib-2.2.1-jdk15.jar
log4j-1.2.13.jar
ognl-2.6.11.jar
struts2-core-2.0.11.jar
xml-apis-1.0.b2.jar
xwork-2.0.4.jar

首先配置web.xml

  1. http://java.sun.com/xml/ns/j2ee"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
  4. http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  5. index.jsp
  6. struts2
  7. org.apache.struts2.dispatcher.FilterDispatcher
  8. struts2
  9. /*

然后是struts.xml

  1.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  2.     "http://struts.apache.org/dtds/struts-2.0.dtd">
  3. /menu.jsp

3. 树的节点模型(省略了getter,setter)

  1. public class Menu {  
  2.     private int id;  
  3.     private String text;  
  4.     private boolean leaf;  
  5.     private String cls;  
  6.     private List children;  
  7. }  

4. action

  1. package com.lab;  
  2. import java.util.ArrayList;  
  3. import java.util.List;  
  4. import net.sf.json.JSONArray;  
  5. public class MenuAction {  
  6. private String menuString;  
  7. private List menus;  
  8. public String execute() {  
  9.         menus = new ArrayList ();  
  10.         Menu benz = new Menu();  
  11.         benz.setText("Benz");  
  12.         benz.setCls("folder");  
  13.         benz.setLeaf(false);  
  14.         benz.setId(10);  
  15.         menus.add(benz);  
  16.         List benzList = new ArrayList ();  
  17.         benz.setChildren(benzList);  
  18.         Menu menu;  
  19.         menu = new Menu();  
  20.         menu.setText("S600");  
  21.         menu.setCls("file");  
  22.         menu.setLeaf(true);  
  23.         menu.setId(11);  
  24.         benzList.add(menu);  
  25.         menu = new Menu();  
  26.         menu.setText("SLK200");  
  27.         menu.setCls("file");  
  28.         menu.setLeaf(true);  
  29.         menu.setId(12);  
  30.         benzList.add(menu);  
  31.         Menu bmw = new Menu();  
  32.         bmw.setText("BMW");  
  33.         bmw.setCls("folder");  
  34.         bmw.setLeaf(false);  
  35.         bmw.setId(20);  
  36.         menus.add(bmw);  
  37.         List bmwList = new ArrayList ();  
  38.         bmw.setChildren(bmwList);  
  39.         menu = new Menu();  
  40.         menu.setText("325i");  
  41.         menu.setCls("file");  
  42.         menu.setLeaf(true);  
  43.         menu.setId(21);  
  44.         bmwList.add(menu);  
  45.         menu = new Menu();  
  46.         menu.setText("X5");  
  47.         menu.setCls("file");  
  48.         menu.setLeaf(true);  
  49.         menu.setId(22);  
  50.         bmwList.add(menu);  
  51.         JSONArray jsonObject = JSONArray.fromObject(menus);  
  52. try {  
  53.             menuString = jsonObject.toString();  
  54.         } catch (Exception e) {  
  55.             menuString = "ss";  
  56.         }  
  57. return "success";  
  58.     }  
  59. public String getMenuString() {  
  60. return menuString;  
  61.     }  
  62. public void setMenuString(String menuString) {  
  63. this.menuString = menuString;  
  64.     }  
  65. }  

5. menu.jsp

  1. <%@ taglib prefix="s" uri="/struts-tags" %>

6. html页面和js
我使用的就是extjs的example中的reorder.html和reorder.js,更改了reorder.js中treeloader的dataurl: menus.action

  1. Reorder TreePanel
  2. rel="stylesheet" type="text/css" href="extjs/resources/css/ext-all.css" />
  3. <script type="text/javascript" src="extjs/adapter/ext/ext-base.js"></script>
  4. <script type="text/javascript" src="extjs/ext-all.js"></script>
  5. <script type="text/javascript" src="reorder.js"></script>
  6. rel="stylesheet" type="text/css" href="extjs/resources/css/example.css" />
  7. <script type="text/javascript" src="../examples.js"></script>
  8. Drag and Drop ordering in a TreePanel

  9. This example shows basic drag and drop node moving in a tree. In this implementation there are no restrictions and   

  10. anything can be dropped anywhere except appending to nodes marked "leaf" (the files).

  11. Drag along the edge of the tree to trigger auto scrolling while performing a drag and drop.

  12. In order to demonstrate drag and drop insertion points, sorting was not enabled.

  13. The data for this tree is asynchronously loaded with a JSON TreeLoader.

  14. The js is not minified so it is readable. See reorder.js.

js:

  1. /*
  2. * Ext JS Library 2.0.1
  3. * Copyright(c) 2006-2008, Ext JS, LLC.
  4. * licensing@extjs.com
  5. *
  6. * http://extjs.com/license
  7. */
  8. Ext.onReady(function(){  
  9. // shorthand
  10. var Tree = Ext.tree;  
  11. var tree = new Tree.TreePanel({  
  12.         el:'tree-div',  
  13.         autoScroll:true,  
  14.         animate:true,  
  15.         enableDD:true,  
  16.         containerScroll: true,  
  17.         loader: new Tree.TreeLoader({  
  18.             dataUrl:'http://localhost:8080/lab/menus.action'
  19.         })  
  20.     });  
  21. // set the root node
  22. var root = new Tree.AsyncTreeNode({  
  23.         text: 'Ext JS',  
  24.         draggable:false,  
  25.         id:'source'
  26.     });  
  27.     tree.setRootNode(root);  
  28. // render the tree
  29.     tree.render();  
  30.     root.expand();  
  31. });  

源码下载:http://ajava.org/code/menu/14589.html

看过此文的读者还看过:
Extjs Tree + JSON + Struts2 例子
Extjs Tree + JSON + Struts2 示例源代码(下载)

本文内容搜集于互联网,如有侵犯你的权利,请来信告知。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值