最近在研究flex,关于flex tree基于数据库数据的网上的例子基本没有,大部分都是基于xml的对xml的操作实现tree的改变,通过改变数据库数据实现tree的改变例子没有找到,所以分享给大家一个例子:
我是用hessian实现flex端与java端通讯的
1.flex端代码
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute"
verticalAlign="middle"
backgroundColor="white" creationComplete="init();">
<mx:Script>
<
private function init():void
{
getTree();
}
//监听tree item的click事件

private function tree_itemClick(evt:ListEvent):void
{
var item:Object = Tree(evt.currentTarget).selectedItem;

if (tree.dataDescriptor.isBranch(item))
{
tree.expandItem(item, !tree.isItemOpen(item), true);
}
}
//tree的item有子节点的显示(子节点个数)

private function tree_labelFunc(item:XML):String
{
var children:ICollectionView;
var suffix:String = "";

if (tree.dataDescriptor.isBranch(item))
{
children = tree.dataDescriptor.getChildren(item);
suffix = " (" + children.length + ")";
}
return item[tree.labelField] + suffix;
}
[Bindable]
public var selectedNode:XML;
//当tree发生change事件时的事件

public function treeChanged(event:Event):void
{
//将选中的节点转换成xml,赋予selectedNode,as为转换类型
selectedNode = Tree(event.target).selectedItem as XML;
noteId = selectedNode.@sid;
}
//获得tree的方法

public function getTree():void
{
//构造service时指定回调方法名称
var service:FlexTestService = new FlexTestService(result);
service.getTree();
}
var returnString:String;
var treeDate:XML
//回调方法

public function result(data:Object):void
{
//java端返回的数据转化成String类型
returnString = data as String;
//利用returnString构造一个xml
treeDate = new XML(returnString);
//把构造的xml文件绑定到tree上
tree.dataProvider = treeDate;
}
//删除某一节点

public function delNote():void
{
var service:FlexTestService = new FlexTestService(result);
service.delNote(noteId);
}
//增加一个节点

public function addNote():void
{
var service:FlexTestService = new FlexTestService(result);
service.addNote(noteId, nodeName.text);
}
//重命名节点

public function updateNote():void
{
var service:FlexTestService = new FlexTestService(result);
service.updateNote(noteId, nodeName.text);
}
]]>
</mx:Script>
<mx:Tree id="tree"
showRoot="false"
labelField="@label"
labelFunction="tree_labelFunc"
width="258"
rowCount="6"
itemClick="tree_itemClick(event);" x="301" y="205" height="208" change="treeChanged(event);"/>
<mx:Button width="98" height="31" click="addNote();" x="374" y="440" label="添加" fontSize="16"/>
<mx:Button width="98" height="31" click="updateNote();" x="374" y="482" label="修改" fontSize="16"/>
<mx:Button width="98" height="31" click="delNote();" x="374" y="521" label="删除" fontSize="16"/>
<mx:TextArea text="您选择的节点: {selectedNode.@label}" x="576" y="207" height="206" width="261"/>
<mx:Text x="576" y="482" text="节点名称" fontSize="14" fontWeight="bold"/>
<mx:TextInput id="nodeName" x="660" y="479" fontSize="16"/>
</mx:Application>
2. flex 端 FlexTestService.as

package hessian.service
{
import mx.rpc.AsyncToken;
import mx.controls.Alert;
import hessian.client.HessianService;

public class FlexTestService extends BaseService
{
private static var _userService : HessianService;
//调用java端服务,调用的方法名要与java端服务接口名一致

protected static function getFlexTestService():HessianService
{

if (!_userService)
{
_userService = new HessianService("http://localhost/remoting/testService");
}
return _userService;
}

public function FlexTestService(resultCallback:Function = null, faultCallback:Function = null)
{
super(resultCallback, faultCallback);
}
//获得tree数据

public function getTree():void
{
var token:AsyncToken = getFlexTestService().getTree.send();
token.addResponder(this);
}
//增加节点

public function addNote(sid:String, name:String):void
{
var token:AsyncToken = getFlexTestService().addNode.send(sid, name);
token.addResponder(this);
}
//删除节点

public function delNote(sid:String):void
{
var token:AsyncToken = getFlexTestService().delNode.send(sid);
token.addResponder(this);
}
//更新节点

public function updateNote(sid:String, name:String):void
{
var token:AsyncToken = getFlexTestService().updateNode.send(sid, name);
token.addResponder(this);
}
}
}

3.java端服务接口 TestService.java
package net.shopin.api;
import net.shopin.view.CatalogVO;
import java.util.List;

public interface TestService
{

/** *//**
* 获取所有节点
* @return
*/
String getTree();

/** *//**
* 增加节点
* @return
*/
String addNode(String sid,String name);

/** *//**
* 删除节点
* @return
*/
String delNode(String sid);

/** *//**
* 更新节点
* @return
*/
String updateNode(String sid,String name);
}

4.java 端服务接口实现 TestServiceImpl
package net.shopin.business;
import com.shopin.modules.orm.hibernate.SimpleHibernateDao;
import com.shopin.modules.utils.DozerMapper;
import java.util.List;
import java.util.ArrayList;
import net.shopin.entity.Catalog;
import net.shopin.entity.ProductList;
import net.shopin.api.TestService;
import net.shopin.view.CatalogVO;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.stereotype.Component;
import org.springframework.beans.factory.annotation.Autowired;
import org.hibernate.SessionFactory;
import org.hibernate.Criteria;
import org.hibernate.criterion.Restrictions;
import org.apache.commons.lang.ObjectUtils;
@Transactional
@Component("testService")

public class TestServiceImpl implements TestService
{
private SimpleHibernateDao<Catalog, Long> testDao;
@Autowired

public void setSessionFactory(SessionFactory sessionFactory)
{
testDao = new SimpleHibernateDao<Catalog, Long>(sessionFactory, Catalog.class);
}
@Transactional(readOnly = true)

public String getTree()
{
Catalog catalog = testDao.findByUnique("sid", Long.parseLong("1"));
Criteria criteria = testDao.createCriteria();
criteria.add(Restrictions.eq("fatherNodeId", catalog));
List<Catalog> list = criteria.list();
String tree = listToxml(list);
return tree;
}

private List<Catalog> getSonNode(String sid)
{
// System.out.println("--------getSonNode-----------");
String hql = "from Catalog as o where o.fatherNodeId = ? ";
Catalog catalog = testDao.findByUnique("sid", Long.parseLong(sid));
List<Catalog> list = testDao.find(hql, catalog);
return list;
}
//把list对象转化成XML

private String listToxml(List flist)
{
ArrayList list = (ArrayList) flist;
String treedata = "<treeRoot>\n";
treedata = CreateXmlNode(list, 1L, treedata);
treedata = treedata + "</treeRoot>\n";
// System.out.println(treedata);
return treedata;
}

/** *//**
* 递归解析list –> Xml
*/

private String CreateXmlNode(List<Catalog> list, Long nodepid, String cratedata)
{

for (int a = 0; a < list.size(); a++)
{
Catalog fsort = (Catalog) list.get(a);

if ((fsort.getFatherNodeId().getSid().toString()).equals(nodepid.toString()))
{
List<Catalog> lists = getSonNode(fsort.getSid().toString());

if (lists.size() > 0)
{
cratedata = cratedata + "<second label=\"" + fsort.getFatherNodeId().getNodeName() + "-" + fsort.getNodeName() + "\" sid=\"" + fsort.getSid() + "\">\n";
cratedata = CreateXmlNode(lists, fsort.getSid(), cratedata);
cratedata = cratedata + "</second>\n";

} else
{
cratedata = cratedata + "<third label=\"" + fsort.getFatherNodeId().getNodeName() + "-" + fsort.getNodeName() + "\" sid=\"" + fsort.getSid() + "\"/>\n";
}
}
}
return cratedata;
}

public String addNode(String sid, String name)
{
Catalog catalog = testDao.findByUnique("sid", Long.parseLong(sid));
Catalog newCatalog = new Catalog();
newCatalog.setNodeName(name);
newCatalog.setFatherNodeId(catalog);
testDao.save(newCatalog);
String data = getTree();
return data;
}

public String delNode(String sid)
{

if (getSonNode(sid).size() > 0)
{
System.out.println("不可以删除此节点");

} else
{
String hql = "from Catalog as o where o.sid = ? ";
Catalog catalog = testDao.findByUnique("sid", Long.parseLong(sid));
testDao.delete(catalog);
}
String data = getTree();
return data;
}

public String updateNode(String sid, String name)
{
String hql = "from Catalog as o where o.sid = ? ";
Catalog catalog = testDao.findByUnique("sid", Long.parseLong(sid));
catalog.setNodeName(name);
testDao.save(catalog);
String data = getTree();
return data;
}
}
