最近在研究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;
}
}
