- 浏览: 2989831 次
- 性别:
- 来自: 河南
文章分类
- 全部博客 (340)
- Java综合 (26)
- 程序人生 (53)
- RIA-ExtJS专栏 (18)
- RIA-mxGraph专栏 (4)
- RIA-Flex4专栏 (43)
- 框架-Spring专栏 (16)
- 框架-持久化专栏 (22)
- 框架-Struts2专栏 (11)
- 框架-Struts专栏 (12)
- SQL/NOSQL (12)
- 报表/图表 (2)
- 工作流 (5)
- XML专栏 (4)
- 日常报错解决方案 (5)
- Web前端-综合 (12)
- Web/JSP (14)
- Web前端-ajax专栏 (14)
- Web前端-JQuery专栏 (9)
- IDE技巧 (6)
- FILE/IO (14)
- 远程服务调用 (2)
- SSO单点登录 (2)
- 资源分享 (22)
- 云计算 (1)
- 项目管理 (3)
- php专栏 (1)
- Python专栏 (2)
- Linux (1)
- 缓存系统 (1)
- 队列服务器 (1)
- 网络编程 (0)
- Node.js (1)
最新评论
-
hui1989106a:
我的也不能解压,360和好压都试了,都不行
《Spring in Action》完整中文版分享下载 -
temotemo:
这些example有些过时了,官方建议使用HBase-1.0 ...
Java操作Hbase进行建表、删表以及对数据进行增删改查,条件查询 -
zy8102:
非常感谢~
HeadFirst系列之七:《深入浅出SQL》原版高清PDF电子书分享下载 -
zy8102:
重命名了一下搞定了
HeadFirst系列之七:《深入浅出SQL》原版高清PDF电子书分享下载 -
zy8102:
为什么下载以后老解压不了呢?
HeadFirst系列之七:《深入浅出SQL》原版高清PDF电子书分享下载
今天的第三篇文章,把我两天学习的Flex4树的最重要的与实际开发相关的示例总结一下,实现与JAVA后台交互操作也就是增删改功能
第一:首先是MXML主要代码
<?xml version="1.0" encoding="utf-8"?>
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" width="100%" height="100%"
creationComplete="init()">
<fx:Script>
<![CDATA[
import mx.controls.Alert;
import mx.rpc.events.ResultEvent;
import mx.utils.URLUtil;
protected function init():void{
listResult.convertDataToXml();
}
var xmlList:XML;
protected function listResult_resultHandler(event:ResultEvent):void
{
xmlList=XML(event.result.toString());
mytree.dataProvider=xmlList;
}
protected function tree1_clickHandler(event:MouseEvent):void
{
if(mytree.selectedItem.hasOwnProperty("@value" ))
{
var u:URLRequest=new URLRequest(mytree.selectedItem.@value);
//navigateToURL(new URLRequest(mytree.selectedItem.@value));
navigateToURL(u);
} else
{
//没有那就展开,如果展开了就收缩
mytree.expandItem(mytree.selectedItem,!mytree.isItemOpen(mytree.selectedItem),true);
}
}
var child:XML;
//添加兄弟节点
protected function addBefore():void
{
var xml:XML=mytree.selectedItem as XML;
var text:String=nextName.text;
if(xml!=null && text.length>0) {
var parent:XML=xml.parent();
if(parent!=null) {
child=new XML("<node foddersortName=\"\" foddersortId=\"\" parentid=\"\" />");
child.@foddersortName=text;
parent.insertChildBefore(xml,child);
var v:URLVariables = new URLVariables("method=add&editName="+text+"&parentId="+parent.@foddersortId);
/*
也可以是这种方式
var vars: URLVariables = new URLVariables ();
vars["varName"] = varValue; //把参数键,值对放到vars对象中.
vars["var2Name"] = var2Value;
*/
var r:URLRequest = new URLRequest();
r.url = "http://localhost:8080/FlexBlazeDS/treeOperate.do";
r.method = URLRequestMethod.POST;
r.data = v;
var l:URLLoader = new URLLoader();
l.load(r);
l.addEventListener(Event.COMPLETE,txtCompleteHandler);
} else {
Alert.show("不能选中根节点");
}
} else {
Alert.show("需要先选中节点和填入文字");
}
}
private function txtCompleteHandler(e:Event):void
{
var l:URLLoader = URLLoader(e.target);
var o:Object = URLUtil.stringToObject(l.data,";",true);
var result:String=o.result;
var operateId:String=o.operateId;
if(operateId!=null){
//Alert.show(o.operateId);
//每次添加完毕节点后,就需要将刚插入数据库中的最大的ID查询出来赋给刚刚新增的XML节点的属性中
child.@foddersortId=operateId;
}
if(result=="update"){
Alert.show("更新成功!");
}else if(result=="delete"){
Alert.show("删除成功!");
}else if(result=="add"){
Alert.show("新增成功!");
}else{
Alert.show("操作失败!");
}
}
protected function addAfter():void
{
var xml:XML=mytree.selectedItem as XML;
var text:String=nextName.text;
if(xml!=null && text.length>0) {
var parent:XML=xml.parent();
if(parent!=null) {
child=new XML("<node foddersortName=\"\" foddersortId=\"\" parentid=\"\" />");
child.@foddersortName=text;
parent.insertChildAfter(xml,child);
var v:URLVariables = new URLVariables("method=add&editName="+text+"&parentId="+parent.@foddersortId);
/*
也可以是这种方式
var vars: URLVariables = new URLVariables ();
vars["varName"] = varValue; //把参数键,值对放到vars对象中.
vars["var2Name"] = var2Value;
*/
var r:URLRequest = new URLRequest();
r.url = "http://localhost:8080/FlexBlazeDS/treeOperate.do";
r.method = URLRequestMethod.POST;
r.data = v;
var l:URLLoader = new URLLoader();
l.load(r);
l.addEventListener(Event.COMPLETE,txtCompleteHandler);
} else {
Alert.show("不能选中根节点");
}
} else {
Alert.show("需要先选中节点和填入文字");
}
}
protected function addSon():void
{
var xml:XML=mytree.selectedItem as XML;
var text:String=nextName.text;
if(xml!=null && text.length>0) {
var parent:XML=xml.parent();
child=new XML("<node foddersortName=\"\" foddersortId=\"\" parentid=\"\" />");
child.@foddersortName=text;
xml.appendChild(child);
mytree.expandChildrenOf(xml,true);
var v:URLVariables = new URLVariables("method=add&editName="+text+"&parentId="+xml.@foddersortId);
/*
也可以是这种方式
var vars: URLVariables = new URLVariables ();
vars["varName"] = varValue; //把参数键,值对放到vars对象中.
vars["var2Name"] = var2Value;
*/
var r:URLRequest = new URLRequest();
r.url = "http://localhost:8080/FlexBlazeDS/treeOperate.do";
r.method = URLRequestMethod.POST;
r.data = v;
var l:URLLoader = new URLLoader();
l.load(r);
l.addEventListener(Event.COMPLETE,txtCompleteHandler);
} else {
Alert.show("需要先选中节点和填入文字");
}
}
protected function editNode():void
{
var xml:XML=mytree.selectedItem as XML;
var text:String=nextName.text;
if(xml!=null && text.length>0) {
xml.@foddersortName=text;
} else {
Alert.show("需要先选中节点和填入文字");
}
var v:URLVariables = new URLVariables("method=update&editName="+text+"&parentId="+xml.@foddersortId);
/*
也可以是这种方式
var vars: URLVariables = new URLVariables ();
vars["varName"] = varValue; //把参数键,值对放到vars对象中.
vars["var2Name"] = var2Value;
*/
var r:URLRequest = new URLRequest();
r.url = "http://localhost:8080/FlexBlazeDS/treeOperate.do";
r.method = URLRequestMethod.POST;
r.data = v;
var l:URLLoader = new URLLoader();
l.load(r);
l.addEventListener(Event.COMPLETE,txtCompleteHandler);
}
protected function deleteNode():void
{
var xml:XML=mytree.selectedItem as XML;
if(xml!=null) {
var list:Array=mytree.selectedItems as Array;
for(var k:int=0;k<list.length;k++) {
xml=list[k] as XML;
var parent:XML=xml.parent();
if(parent!=null) {
var children:XMLList=parent.children();
for(var i:int=0;i<children.length();i++) {
if(children[i]==xml) {
delete children[i];
var v:URLVariables = new URLVariables("method=delete&parentId="+xml.@foddersortId);
/*
也可以是这种方式
var vars: URLVariables = new URLVariables ();
vars["varName"] = varValue; //把参数键,值对放到vars对象中.
vars["var2Name"] = var2Value;
*/
var r:URLRequest = new URLRequest();
r.url = "http://localhost:8080/FlexBlazeDS/treeOperate.do";
r.method = URLRequestMethod.POST;
r.data = v;
var l:URLLoader = new URLLoader();
l.load(r);
l.addEventListener(Event.COMPLETE,txtCompleteHandler);
break;
}
}
} else {
Alert.show("不能选中根节点");
}
}
} else {
Alert.show("需要先选中节点");
}
}
protected function selectNode():void
{
var text:String=nextName.text;
if(text.length>0) {
var items:Array=[];
var list:XMLList=new XMLList();
list[0]=mytree.dataProvider[0];
searchItems(list,text,items);
mytree.selectedItems=items;
} else {
Alert.show("输入查找的文字");
}
}
private function searchItems(list:XMLList,find:String,items:Array):void {
for(var i:int=0;i<list.length();i++) {
var one:XML=list[i];
var label:String=one.@foddersortName;
if(label!=null && label.indexOf(find)>=0) {
items.push(one);
}
searchItems(one.children(),find,items);
}
}
protected function closeAll():void{
mytree.openItems=[];
}
protected function openAll():void{
mytree.expandChildrenOf(mytree.selectedItem,true);
}
]]>
</fx:Script>
<fx:Declarations>
<!-- 将非可视元素(例如服务、值对象)放在此处 -->
<s:RemoteObject destination="findName" id="listResult" result="listResult_resultHandler(event)"/>
</fx:Declarations>
<s:TextInput id="nextName" x="432" y="40" />
<mx:Tree x="30" y="10" width="264" height="600" id="mytree" showRoot="false" labelField="@foddersortName" ></mx:Tree>
<s:Button x="443" y="82" label="增加为哥" click="addBefore()"/>
<s:Button x="443" y="111" label="增加为弟" click="addAfter()"/>
<s:Button x="444" y="144" click="addSon()" label="增加为孩子"/>
<s:Button x="444" y="178" click="editNode()" label="修改节点"/>
<s:Button x="444" y="211" click="deleteNode()" label="删除节点"/>
<s:Button x="443" y="244" click="selectNode()" label="选择节点"/>
<s:Button x="443" y="277" click="closeAll()" label="全部收缩"/>
<s:Button x="443" y="306" click="openAll()" label="全部展开"/>
</s:Group>
这里写的是组件形式,在主程序中调用下文件名,如这个叫做FlexTree.mxml,其位于components目录下
那么在主程序中应该这样写
<components:FlexTree/>
就是这么一小行代码就可以执行主程序显示树了
第二:web-info/flex/remoteConfig.xml中关键配置
<destination id="findName" >
<properties>
<source>com.jadetrust.test.FindTreeNode</source>
</properties>
</destination>
第三:后台两个主要处理程序,一个是用来查询所有树节点拼装XML的程序FindTreeNode.java
//把数据库中的无限级联表中数据拼装成一个XML文档
public String convertDataToXml()
{
UserService sf=new UserService();
List<TCategory> cates=sf.findCategoriesAll();
System.out.println(cates);
List<TCategory> listTop=sf.findCategoriesTop();
String treedata="<?xml version='1.0' encoding='utf-8'?>\n<node foddersortId='0' foddersortName='所有分类'>\n";
for(TCategory cate:listTop){
treedata=treedata+"<node foddersortId='"+cate.getCateId() +"' foddersortName='"+cate.getName()+"'>\n";
treedata=CreateXmlNode(cates,cate.getCateId(),treedata);
treedata=treedata+"</node>\n";
}
treedata=treedata+"</node>\n";
System.out.println(treedata);
return treedata;
}
/**
* 递归解析list –> Xml
*/
public String CreateXmlNode(List<TCategory> list,int nodepid,String cratedata){
for (int a=0;a<list.size();a++)
{
TCategory cate=list.get(a);
if(cate.getTCategory()==null || cate.getTCategory().equals("")){
}else{
if (cate.getTCategory().getCateId()==nodepid){
if(cate.getTCategories()!=null){
cratedata=cratedata+"<node foddersortId='"+cate.getCateId() +"' foddersortName='"+cate.getName()+"' parentid='"+cate.getTCategory().getCateId()+"'>\n";
cratedata=CreateXmlNode(list,cate.getCateId(),cratedata);
cratedata=cratedata+"</node>\n";
}else{
cratedata=cratedata+"<node foddersortId='"+cate.getCateId()+"'foddersortName='"+cate.getName()+"' parentid='"+cate.getTCategory().getCateId()+"'/>\n";
}
}
}
}
return cratedata;
}
还有一个处理增删改的servleet程序
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("执行了树操作。。。。。。。。。。。。。。。");
request.setCharacterEncoding("utf-8");
String childName=request.getParameter("editName");
String parentId=request.getParameter("parentId");
String method=request.getParameter("method");
UserService sf=new UserService();
response.setCharacterEncoding("utf-8");
try{
if(method.equals("delete")){
System.out.println("此次删除的ID为"+parentId);
if(parentId!=null){
TCategory cate1=sf.findById(parentId);
System.out.println(cate1);
sf.delete(cate1);
response.getWriter().write("result=delete");
}
}else if(method.equals("update")){
System.out.println("此次更新的ID为"+parentId);
if(childName!=null&&parentId!=null){
TCategory cate1=sf.findById(parentId);
cate1.setName(childName);
System.out.println(cate1);
sf.update(cate1);
response.getWriter().write("result=update");
}
}else if(method.equals("add")){
if(childName!=null&&parentId!=null){
TCategory category=new TCategory();
category.setName(childName);
TCategory cate1=sf.findById(parentId);
category.setTCategory(cate1);
sf.add(category);
Integer lastId=sf.findLastId();
response.getWriter().write("result=add;operateId="+lastId);
}
}
}catch(Exception e){
System.out.println(e.toString());
response.getWriter().write("result=error");
}
}
第三,就是介绍相关的数据库表的结构了MYSQL
CREATE TABLE `t_category` (
`name` varchar(255) DEFAULT NULL,
`parent_id` int(11) DEFAULT NULL,
`cate_id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`cate_id`),
KEY `parent_id` (`parent_id`),
CONSTRAINT `t_category_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `t_category` (`cate_id`)
) ENGINE=InnoDB AUTO_INCREMENT=59 DEFAULT CHARSET=utf8;
对应的Category实体类
package com.jadetrust.dao;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
/**
* TCategory entity. @author MyEclipse Persistence Tools
*/
@Entity
@Table(name = "t_category", catalog = "test")
public class TCategory implements java.io.Serializable {
// Fields
@Override
public String toString() {
return "[ cateId=" + cateId + ", name=" + name + "]";
}
private Integer cateId;
private TCategory TCategory;
private String name;
private Set<TCategory> TCategories = new HashSet<TCategory>(0);
// Constructors
/** default constructor */
public TCategory() {
}
/** full constructor */
public TCategory(TCategory TCategory, String name,
Set<TCategory> TCategories) {
this.TCategory = TCategory;
this.name = name;
this.TCategories = TCategories;
}
// Property accessors
@Id
@GeneratedValue
@Column(name = "cate_id", unique = true, nullable = false)
public Integer getCateId() {
return this.cateId;
}
public void setCateId(Integer cateId) {
this.cateId = cateId;
}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "parent_id")
public TCategory getTCategory() {
return this.TCategory;
}
public void setTCategory(TCategory TCategory) {
this.TCategory = TCategory;
}
@Column(name = "name")
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "TCategory")
public Set<TCategory> getTCategories() {
return this.TCategories;
}
public void setTCategories(Set<TCategory> TCategories) {
this.TCategories = TCategories;
}
}
第四:具体数据库操作类UserService
package com.jadetrust.service.impl;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.jadetrust.common.HibernateSessionFactory;
import com.jadetrust.dao.TCategory;
public class UserService {
public void add(TCategory cate){
Session session=HibernateSessionFactory.getSession();
Transaction tc=session.beginTransaction();
session.save(cate);
tc.commit();
session.close();
}
public void delete(TCategory cate){
Session session=HibernateSessionFactory.getSession();
Transaction tc=session.beginTransaction();
session.delete(cate);
tc.commit();
session.close();
}
public void update(TCategory cate){
Session session=HibernateSessionFactory.getSession();
Transaction tc=session.beginTransaction();
session.merge(cate);
tc.commit();
session.close();
}
public TCategory findById(String id){
String hql = "from TCategory where cateId=:id";
return (TCategory)HibernateSessionFactory.getSession().createQuery(hql).setString("id", id).uniqueResult();
}
public List<TCategory> findChildCategories(String id) {
if(id.equals("cate_root")||id==null||id.equals(" ")){
return findCategoriesTop();
}else{
return HibernateSessionFactory.getSession().
createQuery("from TCategory cate where cate.TCategory.cateId=:id").setString("id", id).list();
}
}
public List<TCategory> findCategoriesTop() {
System.out.println("查询顶级父目录.................");
String hql = "select distinct cate,childs from TCategory cate left join fetch cate.TCategories childs where cate.TCategory.cateId is null";
return HibernateSessionFactory.getSession().createQuery(hql).list();
}
public List<TCategory> findCategoriesAll() {
System.out.println("查询顶级父目录.................");
String hql = "from TCategory";
return HibernateSessionFactory.getSession().createQuery(hql).list();
}
public List<Map<String,String>> findNameById(String id){
List<Map<String,String>> names=new ArrayList<Map<String,String>>();
UserService sf=new UserService();
Set<TCategory> cates=sf.findById(id).getTCategories();
for(TCategory cate:cates){
Map<String,String> maps=new HashMap<String,String>();
maps.put("CATALOGSID", cate.getCateId().toString());
maps.put("CATALOGNAME", cate.getName());
names.add(maps);
}
return names;
}
public Integer findLastId(){
String hql="select max(cateId) from TCategory";
return (Integer)HibernateSessionFactory.getSession().createQuery(hql).uniqueResult();
}
}
这个示例只用了Hibernate,至于这个HibernateSessionFactory,它是利用MyEclipse反转数据库自动生成的,如果不知道可以参考我之前关于数据库反转的文章
相关视图
这个是选择节点,输入插入内容,点击选择节点按钮
评论
客气客气
List 无法解析为类型 Tree/src/com FindTreeNode.java 第 13 行
另:你的这棵树要是再加上CheckBox,那就全了。
是吧,能对你有帮助就好。关于CheckBox的如果你写出来了很期待能发给我参考下喽
另:你的这棵树要是再加上CheckBox,那就全了。
那你意思就是HibernateSessionFactory你不知道喽,请参考怎么反转数据库表成JAVA实体类的:http://javacrazyer.iteye.com/blog/652587 这里面的步骤就含有是否生成HibernateSessionFactory的
请仔细看,从显示到逻辑处理的全部都贴出来了,还需要源码么?可以用心研究下,光给源码锻炼不了也理解不是那么深刻的
呵呵,谢谢!
不行,源码工程直接就导入了,太便宜偷懒的人了
发表评论
-
10条寒冷的冷笑话【心情不好的人,进来看看吧】
2010-08-27 12:24 25471、小明:我说话从来不说第2遍小华:什么?小明:我说话从来不说 ... -
Flex4之事件详解
2010-08-26 15:39 9760第一、Flex事件简介事 ... -
Flex4之DataGrid增删改同步数据库及页面数据示例总结
2010-08-20 10:35 10445有关Flex的DataGrid文章的确不少,都是零零碎碎的,目 ... -
全面认识Flex六大要素
2010-08-19 15:25 2112在学习Flex应用程序的 ... -
Flex4之将Sprite控件添加到FLEX UI中
2010-08-13 09:24 5957在Flex的帮助文档 ... -
Flex4之元数据标签使用
2010-08-09 16:04 4650Flex 元数据标签 1、[ArrayElementTy ... -
Flex4之关于Embed外部资源的使用方法总结
2010-08-09 14:20 8306Flex软件中经常需要使用一些外部的资源,如图片、声音、S ... -
Flex4之使用ActionScript构建组件
2010-08-09 13:37 4232因为是专门针对ActionScript来写的 ... -
Flex4之获取各种颜色RGB值的例子
2010-08-09 10:03 4389接下来的例子演示了Flex中如何将颜色的值转化为字符串,根据R ... -
Flex4之简单菜单制作
2010-08-04 11:45 3621首先呢说明一下,我写的这个菜单呢,为了符合我的项目需要没有用到 ... -
Flex4之关于循环注册事件问题
2010-08-03 15:02 2040首先呢,标题说的有些 ... -
关于FLEX特效的几个网址
2010-07-27 13:01 8160在Tourde FLEX的Data Visualization ... -
FLEX4之内存释放优化原则
2010-07-27 10:17 22741. 被删除对象在外部的所有引用一定要被删除干净才能被系统当成 ... -
Flex4之Filters的用法【模糊,炽热,阴影、齿条】
2010-07-23 14:51 5520先上效果图 具体代码 <?xml versio ... -
Flex4之四种事件处理方式
2010-07-23 14:36 2535首先我这个示例是针对按钮来说的,其实其他的组件大致也都一样 ... -
Flex4之皮肤定制【Skin类和Skin类】
2010-07-23 10:01 22269第一、关于spark.skin.SparkSkin类的 ... -
Flex4之为ToolTip设置旋转特效及字体
2010-07-22 16:21 5151没想到ToolTip一个提示标签也可以加上动画,看来Flex真 ... -
Flex4之在Aert提示框中加入超链接
2010-07-22 16:02 2258闲话不说,贴上代码 <?xml version=&qu ... -
Flex4之在button上显示HTML内容
2010-07-22 15:28 2737HTMLButton.as package myas { ... -
Flex4之添加插件实现代码格式化
2010-07-22 15:13 4350首先到http://sourceforge.net/proje ...
相关推荐
flex 操作xml 实现增删改查flex 操作xml 实现增删改查flex 操作xml 实现增删改查flex 操作xml 实现增删改查flex 操作xml 实现增删改查
flex+java实现增删改查Dome,下载完后将blazeds.war下载jar copy过去即可运行,本程序只供参考。
简单的flex与Java整合(完整的增删改查) 对于学习flex与Java交互的初学者来说是非常容易入手的。
ActionScript3 Flex初级入门,实现Flex增删改查,初级入门的Flex初级程序员可以看看
flex通过java实现增删改查 特别适合初学者 希望对你们有用处
flex+java工程 博文链接:https://guoweisong.iteye.com/blog/724157
flex增删改查例子(完整版)
NULL 博文链接:https://blessht.iteye.com/blog/1132470
非常强大的一个示例,里面增删改查全都有,并且每一句重要代码都有注释为你解释。,不要错过!
为入门flex的人准备的,是最简单的例子,实现了flex与java的集成
flex+java 通过blazeds完美结合实现增删改查功能
flex访问netwebservice实现程序的增删改查,通用数据适合oracle ,sql,access数据库,时间仓促不是很完善,但是基本功能都实现。
flex通过blazeds与java集成增删改查, 各位朋友,压缩包绝对没问题,我自己下载就可以解压
flex链接java增删改查,mysql数据库
Flex操作XML实现增删改查.pdf
flex 简单demo ---包含:增,删,改,查的实际应用
Flex操作XML实现增删改查[借鉴].pdf
简单flex前台,java做为服务端,mysql作为数据库的增删改查程序。
Flex+LINQ+SQL SERVER 2005+Asp.net实现增删改查功能源码(附有数据库)
Flex 和 Java的交互实例.非常值得参考