最近在研究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>
<![CDATA[
import hessian.service.FlexTestService;
import mx.collections.ICollectionView;
import mx.collections.XMLListCollection;
import mx.controls.Alert;
import mx.controls.Tree;
import mx.events.ListEvent;
import mx.rpc.events.ResultEvent;
import mx.managers.PopUpManager;
var noteId:String;
//初始化从数据库中获得tree
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;
}
}