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

最近尝试用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();
});

7.解析为List数据
代码如下:
EXTJS中的json数据

var comboStore = new Ext.data.Store({
 proxy: new Ext.data.HttpProxy({
   url:'adminGroup', //这里是struts请求到action
   method:'POST' //请求方式
  }),
 reader: new Ext.data.JsonReader({
  //总记录数
   totalProperty: 'results', //总记录数
   root: 'items', //记录集合
   id:'roleId'
  },
  ['roleId','roleName'] //显示的两个字段
  )
 });

JSON数据内容

{"items":[{"password":"ahui","adminId":1,"role":{"roleName":"系统管理员","roleId":2,"sequence":"2","admin":null,"logoutMark":"否"},"adminName":"ahui","logout":"否"},
 {"password":"xiao","adminId":2,"role":{"roleName":"系统管理员","roleId":2,"sequence":"2","admin":null,"logoutMark":"否"},"adminName":"xiao","logout":"是"},"results":13}

下面是struts2里面的action代码 里面封装了ExtHelper工具类,里面有转换xml和json两种格式

public String findAll() throws Exception{ 

  HttpServletRequest request = ServletActionContext.getRequest(); 

  HttpServletResponse response = ServletActionContext.getResponse(); 

  List list = groupService.getGroup(); //调用service里面的方法,把所有的数据都查询出来 

  String json = ExtHelper.getJsonFromList(list);//把list转换为json格式的数据 

  response.setContentType("text/json;charset=UTF-8");//设置数据到前台显示的字符编码,如果不转会有乱码 

  response.getWriter().write(json); 

  System.out.println(json); 

  return null;
}

解析json的方法有很多,所以是怎么方便怎么来,json自己的包里也可以进行转换,但如果项目中用的是Struts2,直接用Struts2提供的方法更方便。

(0)

相关推荐

  • struts2数据处理_动力节点Java学院整理

    Struts2框架框架使用OGNL语言和值栈技术实现数据的流转处理.值栈就相当于一个容器,用来存放数据,而OGNL是一种快速查询数据的语言. 值栈:ValueStack一种数据结构,操作数据的方式为:先进后出 OGNL : Object-GraphNavigation Language(对象图形导航语言)将多个对象的关系使用一种树形的结构展现出来,更像一个图形,那么如果需要对树形结构的节点数据进行操作,那么可以使用 对象.属性 的方式进行操作,OGNL技术底层采用反射实现. 一:数据的提交方式

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

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

  • Asp.net配合easyui实现返回json数据实例

    本文实例讲述了Asp.net配合easyui实现返回json数据的实现方法.分享给大家供大家参考.具体如下: 最近想用asp.net配合easyui开发一个小框架,然后再用到easyui的combobox的时候出现了一个问题,总所周知,easyui的文档上给出的combobox的格式是 复制代码 代码如下: <input class="easyui-combobox"               name="language"              dat

  • JS中Json数据的处理和解析JSON数据的方法详解

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C.C++.C#.Java.JavaScript.Perl.Python等).这些特性使JSON成为理想的数据交换语言. 易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率). JSON的规则很简单: 对象是一个无序的"'名称/值'对"集合.一个对象以&quo

  • 浅谈JS中json数据的处理

    1. json数据结构(对象和数组) json对象:var obj = {"name":"xiao","age":12}; json数组:var objArray = [{"name":"xiao","age":12},{"name":"xiao","age":12}]; 2. 处理json数据,依赖文件有:jQuery.js

  • js根据json数据中的某一个属性来给数据分组的方法

    如下所示: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> <span id ="span" style="width: 50px;height: 200px;"></span> </body> &

  • js 解析 JSON 数据简单示例

    本文实例讲述了js 解析 JSON 数据.分享给大家供大家参考,具体如下: JSON 数据如下: { "name": "mkyong", "age": 30, "address": { "streetAddress": "88 8nd Street", "city": "New York" }, "phoneNumber": [

  • 详解Java的Struts2框架的结构及其数据转移方式

    Struts2的结构 1.为什么要使用框架? (1)框架自动完成了很多琐屑的任务 对于Struts2来说,它帮助我们方便地完成了数据类型转换.数据验证.国际化等等 Web开发中常见的任务.还有Spring中大量使用的Template模式,都是在让我们的开发 过程更加自动化.智能化.使用框架就是避免重新发明轮子,重新复制这些模板代码. 框架让我们将精力更多地放在更高级别的问题上,而不是常见工作流和基础任务上. (2)使用框架就是优雅地继承了框架背后的架构 框架背后的架构通常定义了一系列的工作流程,

  • 概述Java的struts2框架

    一.struts2框架概念 Struts2框架是一个轻量级的MVC流程框架,轻量级是指程序的代码不是很多,运行时占用的资源不是很多,MVC流程框架就是说它是支持分层开发,控制数据的流程,从哪里来,到那里去,怎么来,怎么去的这样一个框架:Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互. 二.struts2框架的优缺点 1.优点 a) 实现了MVC模式,层次结构清

  • java Swing JFrame框架类中setDefaultCloseOperation的参数含义与用法示例

    本文实例讲述了java Swing JFrame框架类中setDefaultCloseOperation的参数含义与用法.分享给大家供大家参考,具体如下: 先来看一个实例(一个空的java窗口): package awtDemo; import javax.swing.*; //使用Swing类,必须引入Swing包 public class JFrameDemo1{ public static void main( String args[]) { //定义一个窗体对象f,窗体名称为"一个简单

  • thinkPHP框架中layer.js的封装与使用方法示例

    本文实例讲述了thinkPHP框架中layer.js的封装与使用方法.分享给大家供大家参考,具体如下: v层:(还没实现功能的) <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <title>添加</title> </head> <body> <form action="{

随机推荐