- 浏览: 5142 次
- 性别:
- 来自: 北京
最新评论
最 近尝试用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,这篇文章没有和数据库的交互,那么下一篇文章将会讲述和数据库交互的树的实例,下一个实例是我自己做的。
相关推荐
通过这种方式,我们解决了 Struts2 JSON 插件返回数据格式与 ExtJS Tree 期待格式不匹配的问题。现在,树形菜单应该能够正确地动态加载并显示从服务器获取的数据。这个例子展示了如何在实际开发中灵活应对数据格式...
ExtJS Tree + JSON + Struts2 是一个常见的前端与后端交互技术组合,常用于构建动态的、数据驱动的树形结构界面。在这个项目中,`index.html` 是主页面,`tree.js` 包含了 ExtJS 的树组件相关的 JavaScript 代码,`...
在我的随笔Extjs Tree + JSON + Struts2中我介绍了如何异步加载一个Extjs的树,但是很多网友留言说不能成功操作。现在我自己做了一个所有源代码的包,供大家下载。 有几点事项请大家注意 1、blogjava的文件上载要求...
ExtJS Tree + JSON + Struts2 示例源代码详解 在Web开发中,构建交互式的用户界面是关键。ExtJS是一个强大的JavaScript库,尤其擅长创建桌面级的Web应用。本示例将详细介绍如何结合ExtJS的Tree组件、JSON数据格式...
总结来说,这个实例展示了如何将前端的ExtJS4框架,特别是其Accordion布局和Ext.tree.Panel组件,与Servlet和Struts2后端框架集成,利用JSON进行数据交换,来创建一个动态的、交互性强的Web应用。用户可以通过折叠和...
可以看出,该案例涉及到了前端框架Extjs的使用、后端框架Struts2的应用、ORM技术Hibernate以及JSON数据格式的处理等多个方面,这些技术共同作用于一个典型的Web应用程序中。希望这些知识点能够帮助你更好地理解整个...
本教程将详细讲解如何在SSH(Spring、Struts2、Hibernate)框架下,结合ExtJS库和JSON数据格式来实现这一功能。 首先,SSH框架是一个流行的企业级Java Web开发框架,Spring负责管理对象,Struts2处理请求与响应,...
在本文中,我们将深入探讨如何使用ExtJS框架的Tree组件,结合JSON数据格式以及Struts 2框架,来实现Ajax动态加载树形结构的节点。这是一项常见的需求,特别是在构建可扩展、用户友好的Web应用时,动态加载的树结构...
在这个“struts2与extjs tree的完美结合”的示例中,开发者利用了Struts2的Annotation特性来简化配置,以及Struts2JSON插件来处理JSON数据,从而实现在服务器端动态生成和返回Tree节点。Annotation使得开发者能够在...
其次,`Extjs Tree + JSON + Struts2 - 云自无心水自闲 - BlogJava.mht`这个文件可能展示了EXT JS Tree与Struts2框架集成的例子。Struts2是Java Web开发中的一个MVC框架,它可以帮助我们在服务器端处理JSON数据并将...
在IT行业中,构建高效、可维护的Web应用是至关重要的,而SSH(Spring、Struts2、Hibernate)和ExtJS的结合使用就是一种常见的解决方案。本文将深入探讨如何利用这些技术实现CRUD(创建、读取、更新和删除)功能,并...
总的来说,"extjs tree struts"是一个关于如何在基于Struts的Web应用中使用ExtJS的TreePanel展示后台数据的主题,涉及到前端与后端的交互、JSON数据的处理以及JavaScript和Java的混合编程。理解并掌握这些知识点对于...
2. **EXTJS Tree组件**: - Tree是EXTJS中用于展现层级关系数据的组件,常用于目录结构或组织架构的显示。 - Tree支持动态加载,即根据需要加载子节点,这有助于提高页面性能。 - Tree具有勾选功能,可以通过设置...
确保struts2-core、struts2-json-plugin或struts2-extjs-plugin已添加到类路径中。 2. **创建Struts2 Action** 创建一个Action类,该类将处理树的加载请求。这个Action需要返回树节点的数据,可以是JSON格式,这样...
总结以上,ExtJS动态树与Struts的结合使用,需要熟练掌握ExtJS TreePanel的配置,JSON数据的构造和解析,以及Struts2的Action和Result机制。通过Ajax请求,前端可以动态获取和更新树形数据,实现交互式用户界面。
1. **定义Struts2 Action**:在Struts2中创建一个Action类,该类负责处理前端发送的请求,并返回所需的数据。Action通常会调用业务层的服务方法,处理数据,然后将结果封装成JSON格式。 2. **配置Struts2 Action**...
在尝试使用EXTJS Tree时,作者遇到了一个问题:EXTJS Tree要求JSON数据以数组形式返回,而Struts2的json-plugin默认生成的是一个JSON对象。例如: ```json // json-plugin生成的数据 { "cls": "folder", "id": 10...
本实例将探讨如何在ExtJS和Struts框架下,实现JSON格式的list对象的传输,从而提高数据交互的效率和灵活性。 首先,ExtJS是一个强大的JavaScript库,主要用于构建桌面级的Web应用。它提供了丰富的组件和数据管理...
Java的Struts2框架配合Ext JS处理JSON数据是Web开发中常见的技术组合。Struts2是一个基于MVC模式的Web应用框架,而Ext JS是一个主要用于构建富客户端网页应用的JavaScript框架。JSON(JavaScript Object Notation)...