`

Extjs Tree + JSON + Struts2 例子

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

{"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需要的数据格式如下:

[{"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

<?xml version="1.0" encoding="UTF-8"?>  
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"  
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">  
  <welcome-file-list>  
    <welcome-file>index.jsp</welcome-file>  
  </welcome-file-list>  
  <filter>  
    <filter-name>struts2</filter-name>  
    <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>  
  </filter>  
  
  <filter-mapping>  
    <filter-name>struts2</filter-name>  
    <url-pattern>/*</url-pattern>  
  </filter-mapping>  
</web-app>  
  

然后是struts.xml

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE struts PUBLIC   
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"   
    "http://struts.apache.org/dtds/struts-2.0.dtd">  
      
<struts>  
    <constant name="struts.devMode" value="true"/>  
    <constant name="struts.i18n.encoding" value="UTF-8"/>  
    <package name="person" extends="struts-default">  
        <action name="menus" method="execute" class="com.lab.MenuAction">  
            <result>/menu.jsp</result>  
        </action>  
    </package>  
</struts>  

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

public class Menu {   
    private int id;   
    private String text;   
    private boolean leaf;   
    private String cls;   
    private List<Menu> children;   
}   

4. action

package com.lab;   
  
import java.util.ArrayList;   
import java.util.List;   
  
import net.sf.json.JSONArray;   
  
public class MenuAction {   
    private String menuString;   
      
    private List<Menu> menus;   
      
    public String execute() {   
  
        menus = new ArrayList<Menu>();   
          
        Menu benz = new Menu();   
        benz.setText("Benz");   
        benz.setCls("folder");   
        benz.setLeaf(false);   
        benz.setId(10);   
        menus.add(benz);   
          
        List<Menu> benzList = new ArrayList<Menu>();   
        benz.setChildren(benzList);   
          
        Menu menu;   
        menu = new Menu();   
        menu.setText("S600");   
        menu.setCls("file");   
        menu.setLeaf(true);   
        menu.setId(11);   
        benzList.add(menu);   
        menu = new Menu();   
        menu.setText("SLK200");   
        menu.setCls("file");   
        menu.setLeaf(true);   
        menu.setId(12);   
        benzList.add(menu);   
          
        Menu bmw = new Menu();   
        bmw.setText("BMW");   
        bmw.setCls("folder");   
        bmw.setLeaf(false);   
        bmw.setId(20);   
        menus.add(bmw);   
          
        List<Menu> bmwList = new ArrayList<Menu>();   
        bmw.setChildren(bmwList);   
          
        menu = new Menu();   
        menu.setText("325i");   
        menu.setCls("file");   
        menu.setLeaf(true);   
        menu.setId(21);   
        bmwList.add(menu);   
          
        menu = new Menu();   
        menu.setText("X5");   
        menu.setCls("file");   
        menu.setLeaf(true);   
        menu.setId(22);   
        bmwList.add(menu);   
          
        JSONArray jsonObject = JSONArray.fromObject(menus);   
        try {   
            menuString = jsonObject.toString();   
        } catch (Exception e) {   
            menuString = "ss";   
        }   
  
        return "success";   
    }   
  
    public String getMenuString() {   
        return menuString;   
    }   
  
    public void setMenuString(String menuString) {   
        this.menuString = menuString;   
    }   
}   
  

5. menu.jsp

<%@ taglib prefix="s" uri="/struts-tags" %>  
<s:property value="menuString" escape="false"/>  

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

<html>  
<head>  
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">  
<title>Reorder TreePanel</title>  
<link rel="stylesheet" type="text/css" href="extjs/resources/css/ext-all.css" />  
  
    <!-- GC -->  
     <!-- LIBS -->  
     <script type="text/javascript" src="extjs/adapter/ext/ext-base.js"></script>  
     <!-- ENDLIBS -->  
    
    <script type="text/javascript" src="extjs/ext-all.js"></script>  
<script type="text/javascript" src="reorder.js"></script>  
  
<!-- Common Styles for the examples -->  
<link rel="stylesheet" type="text/css" href="extjs/resources/css/example.css" />  
</head>  
<body>  
<script type="text/javascript" src="../examples.js"></script><!-- EXAMPLES -->  
<h1>Drag and Drop ordering in a TreePanel</h1>  
<p>This example shows basic drag and drop node moving in a tree. In this implementation there are no restrictions and    
anything can be dropped anywhere except appending to nodes marked "leaf" (the files). <br></p>  
<p>Drag along the edge of the tree to trigger auto scrolling while performing a drag and drop.</p>  
<p>In order to demonstrate drag and drop insertion points, sorting was <b>not</b> enabled.</p>  
<p>The data for this tree is asynchronously loaded with a JSON TreeLoader.</p>  
<p>The js is not minified so it is readable. See <a href="reorder.js">reorder.js</a>.</p>  
  
<div id="tree-div" style="overflow:auto; height:300px;width:250px;border:1px solid #c3daf9;"></div>  
  
</body>  
</html>  
  


js:


/*  
* Ext JS Library 2.0.1  
* Copyright(c) 2006-2008, Ext JS, LLC.  
* licensing@extjs.com  
*  
* http://extjs.com/license  
*/  
  
Ext.onReady(function(){   
    // shorthand   
    var Tree = Ext.tree;   
      
    var tree = new Tree.TreePanel({   
        el:'tree-div',   
        autoScroll:true,   
        animate:true,   
        enableDD:true,   
        containerScroll: true,   
        loader: new Tree.TreeLoader({   
            dataUrl:'http://localhost:8080/lab/menus.action'  
        })   
    });   
  
    // set the root node   
    var root = new Tree.AsyncTreeNode({   
        text: 'Ext JS',   
        draggable:false,   
        id:'source'  
    });   
    tree.setRootNode(root);   
  
    // render the tree   
    tree.render();   
    root.expand();   
});   


http://ajava.org/course/ajax/14590.html
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    Extjs Tree + JSON + Struts2

    ExtJS Tree + JSON + Struts2 是一个常见的前端与后端交互技术组合,常用于构建动态的、数据驱动的树形结构界面。在这个项目中,`index.html` 是主页面,`tree.js` 包含了 ExtJS 的树组件相关的 JavaScript 代码,`...

    Extjs Tree + JSON + Struts2 示例源代码

    在我的随笔Extjs Tree + JSON + Struts2中我介绍了如何异步加载一个Extjs的树,但是很多网友留言说不能成功操作。现在我自己做了一个所有源代码的包,供大家下载。 有几点事项请大家注意 1、blogjava的文件上载要求...

    extjs tree + json+struts2示例源代码

    ExtJS Tree + JSON + Struts2 示例源代码详解 在Web开发中,构建交互式的用户界面是关键。ExtJS是一个强大的JavaScript库,尤其擅长创建桌面级的Web应用。本示例将详细介绍如何结合ExtJS的Tree组件、JSON数据格式...

    ExtJS4+Accordion+SERVLET/STRUTS2+JSON+Ext.tree.Panel实例

    总结来说,这个实例展示了如何将前端的ExtJS4框架,特别是其Accordion布局和Ext.tree.Panel组件,与Servlet和Struts2后端框架集成,利用JSON进行数据交换,来创建一个动态的、交互性强的Web应用。用户可以通过折叠和...

    Extjs_Tree_JSON_ _Struts2_例子

    可以看出,该案例涉及到了前端框架Extjs的使用、后端框架Struts2的应用、ORM技术Hibernate以及JSON数据格式的处理等多个方面,这些技术共同作用于一个典型的Web应用程序中。希望这些知识点能够帮助你更好地理解整个...

    SSH+extjs+json动态树的构造(附详细步骤及源码)

    本教程将详细讲解如何在SSH(Spring、Struts2、Hibernate)框架下,结合ExtJS库和JSON数据格式来实现这一功能。 首先,SSH框架是一个流行的企业级Java Web开发框架,Spring负责管理对象,Struts2处理请求与响应,...

    ExtJS_Tree利用_JSON_在Struts_2实现Ajax动态加载树结点

    在本文中,我们将深入探讨如何使用ExtJS框架的Tree组件,结合JSON数据格式以及Struts 2框架,来实现Ajax动态加载树形结构的节点。这是一项常见的需求,特别是在构建可扩展、用户友好的Web应用时,动态加载的树结构...

    ext tree json 例子(不含EXT包)

    其次,`Extjs Tree + JSON + Struts2 - 云自无心水自闲 - BlogJava.mht`这个文件可能展示了EXT JS Tree与Struts2框架集成的例子。Struts2是Java Web开发中的一个MVC框架,它可以帮助我们在服务器端处理JSON数据并将...

    struts2与extjs tree的完美结合

    在这个“struts2与extjs tree的完美结合”的示例中,开发者利用了Struts2的Annotation特性来简化配置,以及Struts2JSON插件来处理JSON数据,从而实现在服务器端动态生成和返回Tree节点。Annotation使得开发者能够在...

    Hibernate+Spring+Struts2+ExtJS CRUD

    在IT行业中,构建高效、可维护的Web应用是至关重要的,而SSH(Spring、Struts2、Hibernate)和ExtJS的结合使用就是一种常见的解决方案。本文将深入探讨如何利用这些技术实现CRUD(创建、读取、更新和删除)功能,并...

    extjs tree struts

    总的来说,"extjs tree struts"是一个关于如何在基于Struts的Web应用中使用ExtJS的TreePanel展示后台数据的主题,涉及到前端与后端的交互、JSON数据的处理以及JavaScript和Java的混合编程。理解并掌握这些知识点对于...

    EXT组件初学者教程 grid+tree+window+描述文档

    2. **EXTJS Tree组件**: - Tree是EXTJS中用于展现层级关系数据的组件,常用于目录结构或组织架构的显示。 - Tree支持动态加载,即根据需要加载子节点,这有助于提高页面性能。 - Tree具有勾选功能,可以通过设置...

    ExtJs在struts2.0.x下实现动态树的解决方案

    确保struts2-core、struts2-json-plugin或struts2-extjs-plugin已添加到类路径中。 2. **创建Struts2 Action** 创建一个Action类,该类将处理树的加载请求。这个Action需要返回树节点的数据,可以是JSON格式,这样...

    extjs动态树struts请求数据

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

    整合--Struts2为extjs提供server数据

    【整合Struts2与Extjs】 在Web开发中,前端和后端的数据交互是必不可少的,特别是对于富客户端应用,如使用Extjs构建的界面。传统的数据获取方式可能涉及Servlet或其他HTTP服务接口,但这样的方式在处理大量数据请求...

    EXT树简介.doc

    在尝试使用EXTJS Tree时,作者遇到了一个问题:EXTJS Tree要求JSON数据以数组形式返回,而Struts2的json-plugin默认生成的是一个JSON对象。例如: ```json // json-plugin生成的数据 { "cls": "folder", "id": 10...

    实例:ExtjsTest+struts传输json格式的list对象

    本实例将探讨如何在ExtJS和Struts框架下,实现JSON格式的list对象的传输,从而提高数据交互的效率和灵活性。 首先,ExtJS是一个强大的JavaScript库,主要用于构建桌面级的Web应用。它提供了丰富的组件和数据管理...

    Java的Struts2框架配合Ext JS处理JSON数据的使用示例

    Java的Struts2框架配合Ext JS处理JSON数据是Web开发中常见的技术组合。Struts2是一个基于MVC模式的Web应用框架,而Ext JS是一个主要用于构建富客户端网页应用的JavaScript框架。JSON(JavaScript Object Notation)...

Global site tag (gtag.js) - Google Analytics