一  前言

  Flex数据交互常用的有三种方式:WebService、HttpService以及Remoting。

  WebService方式已在这篇文章中给出,这篇文章主要讲解以Remoting方式进行数据交互,Remoting是基于AMF的数据交互,速度及性能均较WebService好,是公认最有效率的方法。

  二  FluorineFX

  FluorineFx是一个开源库,提供了一种在.NET Framework下对Flex/Flash的远程调用过程。FluorineFx官网地址在这,FluorineFx可以在这下载。 

   

  下载安装后,会在vs2008中自动增加两处模板:FluorineFx ServicesLibrary与FluorineFx ASP.NET Web Site。

           

  接下来演示如何利用FluorineFx进行Flex与ASP.NET数据交互。

  三  ASP.NET服务器开发

  (1)新建FluorineFx ServicesLibrary类库,如下图:

  

  (2)在刚才建立的解决方案FlexRemotingDemo中,添加FluorineFx ASP.NET Web Site网站,如下图:

  

  该网站会自动引入FlexRemotingDemo.dll:

  

  在类库FlexRemotingDemo的Sample.cs文件中可以添加自己的函数:  

 /// <summary>
/// 获得监测站信息(14个监测站)
/// </summary>
/// <returns></returns>
public string getStationInfo()
{
string json = "";
DataTable dt = new DataTable();
dt = helper.GetStationInfo();
if (dt != null)
{
json = ConverTableToJSON(dt);
} return json;
}

  将网站发布到IIS下:运行即可看到结果:

  

  (3)修改WEB-INF\flex下的services-config.xml配置文件:  

 <channels>
<channel-definition id="my-amf" class="mx.messaging.channels.AMFChannel">
<endpoint uri="http://localhost/FlexRemotingDemo/Gateway.aspx" class="flex.messaging.endpoints.AMFEndpoint"/>
<properties>
    <!-- <legacy-collection>true</legacy-collection> -->
</properties>
</channel-definition>
<!--
<channel-definition id="my-rtmp" class="mx.messaging.channels.RTMPChannel">
<endpoint uri="rtmp://{server.name}:2037" class="flex.messaging.endpoints.RTMPEndpoint"/>
<properties>
<idle-timeout-minutes>20</idle-timeout-minutes>
</properties>
</channel-definition>
-->
</channels> 

 

  四  Flex客户端开发

  (1)新建Flex项目:

  

  (2)配置Flex项目FlexRemotingDemo:

  

  (3)编写程序代码:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="" minHeight="">
<fx:Declarations>
<mx:RemoteObject id="RO" destination="fluorine" source="ServiceLibraryDemo.Sample">
<mx:method name="getStationInfo" result="onResult(event)"/>
</mx:RemoteObject>
</fx:Declarations> <fx:Script>
<![CDATA[
import mx.events.FlexEvent;
import mx.rpc.AbstractOperation;
import mx.rpc.events.ResultEvent;        protected function btn1_clickHandler(event:MouseEvent):void
{
RO.getStationInfo();
} public function onResult(evt:ResultEvent):void{
txt1.text=evt.result.toString();
} ]]>
</fx:Script> <s:Button id="btn1" label="获得14个监测站信息" x="" y="" click="btn1_clickHandler(event)"/>
<s:TextArea id="txt1" x="" y="" width="" />
</s:Application>

  运行结果如下:

  

  五  源码下载

  源码在这下载

  2013年12月12日修改

  源码下载

  六  RemoteObject的封装   

  如上面,用起来相对比较麻烦,封装RemoteObject以方便使用,这篇文章给出了相应的封装方法,我略作改动以适用本程序。

  (1)CYMRemoteObject.cs

package components
{
/**
* @author chenyuming
*/ import mx.controls.Alert;
import mx.rpc.AbstractOperation;
import mx.rpc.AsyncToken;
import mx.rpc.CallResponder;
import mx.rpc.Responder;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.rpc.remoting.mxml.RemoteObject; public class CYMRemoteObject extends RemoteObject
{
public static const DEFAULT_DESTINATION:String = "fluorine";
public static const DEFAULT_SOURCE:String = ""; public function CYMRemoteObject(source:String,destination:String = DEFAULT_DESTINATION)
{
this.source = source;
super(destination);
} public function call(methodName:String, callback:Function, ...args):void
{
var method:AbstractOperation = this.getOperation(methodName); //为了方便起见,如果有多个参数的话就把参数包成一个Array,在J2EE端使用Object[]来获取参数
method.arguments = args;
var call:AsyncToken = method.send();
call.userDefinedCallback = callback;
call.addResponder(new Responder(resultCallback, faultCallback));
} public function resultCallback(event:ResultEvent):void
{
var callback:Function = event.token.userDefinedCallback as Function; if (callback != null)
{
var result:CYMRemoteObjectResult = new CYMRemoteObjectResult();
result.error = false;
result.result = event.result;
callback(result);
}
} public function faultCallback(event:FaultEvent):void
{
var callback:Function = event.token.userDefinedCallback as Function;
if (callback != null)
{
var result:CYMRemoteObjectResult = new CYMRemoteObjectResult();
result.error = true;
result.errorMessage = event.fault.toString();
callback(result);
}
}
}
}

  CYMRemoteObjectResult.cs

package components
{
/**
* @author chenyuming
*/
public class CYMRemoteObjectResult
{
public function CYMRemoteObjectResult()
{ } public var error:Boolean = false;
public var errorMessage:String = null;
public var result:Object = null;
}
}

  (2)引用方式

protected function btn1_clickHandler(event:MouseEvent):void
{
var ro:CYMRemoteObject = new CYMRemoteObject("ServiceLibraryDemo.Sample", "fluorine");
ro.call("getStationInfo",onResult3); //RO.getStationInfo();
} public function onResult3(evt:CYMRemoteObjectResult):void
{
if(evt.error)
{
Alert.show(evt.errorMessage);
}
else
{
txt1.text=evt.result.toString();
} }

  七  返回DataTable类型

  上面利用getStationInfo返回的是json类型,有时服务器端更喜欢直接返回DataTable类型以便于直接绑定Flex中形如DataGrid的容器,下面演示数据交互类型为DataTable:

  (1)服务器端:Sample.cs中增加函数getStationInfo2

/// <summary>
/// 获得监测站信息(14个监测站)
/// </summary>
/// <returns></returns>
public DataTable getStationInfo2()
{
DataTable dt = new DataTable();
dt = helper.GetStationInfo(); return dt;
}

  (2)客户端Flex:FlexRemotingDemo.mxml中添加DataGrid容器

<s:Button id="btn2" label="获得14个监测站信息" x="" y="" click="btn2_clickHandler(event)"/>
<s:DataGrid id="dg" x="" y="" width="" height="" dataProvider="{arrColl}"
requestedRowCount="" textAlign="center">
<s:columns>
<s:ArrayList>
<s:GridColumn width="{0.21 * this.dg.width}" dataField="jcd_name" headerText="监测点名称"></s:GridColumn>
<s:GridColumn width="{0.13 * this.dg.width}" dataField="ssly" headerText="所属流域"></s:GridColumn>
<s:GridColumn width="{0.30 * this.dg.width}" dataField="zyzbytr" headerText="主要植被与土壤"></s:GridColumn>
<s:GridColumn width="{0.10 * this.dg.width}" dataField="xqsl" headerText="小区数量"></s:GridColumn>
<s:GridColumn width="{0.13 * this.dg.width}" dataField="fjswylz" headerText="附近水文雨量站"></s:GridColumn>
<s:GridColumn width="{0.13 * this.dg.width}" dataField="jgsj" headerText="竣工时间"></s:GridColumn>
</s:ArrayList>
</s:columns>
</s:DataGrid>

  利用封装好的RemoteObejct对象CYMRemoteObject来绑定DataGrid:

[Bindable]
private var arrColl:ArrayCollection = new ArrayCollection(); protected function btn2_clickHandler(event:MouseEvent):void
{
var ro:CYMRemoteObject = new CYMRemoteObject("ServiceLibraryDemo.Sample","fluorine");
ro.call("getStationInfo2",onResult2);
} public function onResult2(evt:CYMRemoteObjectResult):void
{
if(evt.error)
{
Alert.show(evt.errorMessage);
}
else
{
arrColl.removeAll(); // 获取列名
var columnName:Array = evt.result.serverInfo.columnNames as Array; //获取数据
var columnData:Array = evt.result.serverInfo.initialData as Array; //列数组
var columns:Array=new Array(); for(var rowIndex:int = ; rowIndex < columnData.length; rowIndex++)
{
var obj:Object = new Object();
for(var colIndex:int = ; colIndex < columnName.length; colIndex++)
{
var key:String = columnName[colIndex].toString();
var value:String = columnData[rowIndex][colIndex].toString();
obj[key] = value;
} arrColl.addItem(obj);
}
} }

  运行结果:

 

  八  相关文章

  (1)Flex数据交互之WebService

Flex数据交互之Remoting的更多相关文章

  1. Flex数据交互之Remoting[转]

    Flex数据交互之Remoting 一 前言 Flex数据交互常用的有三种方式:WebService.HttpService以及Remoting. WebService方式已在这篇文章中给出,这篇文章 ...

  2. Flex数据交互之WebService

    In this article you will learn how to call webservices hosted on asp.net applications from flex. Fir ...

  3. flex数据交互方式 转

    Flex数据交互方法- httpservice, webservice, RemoteObject, socket. 写在前面: 使用SOAP Web Service同Flex交互有很多好处,但是它很 ...

  4. flash数据交互

    新随笔 联系 订阅 管理 随笔 - 14  文章 - 5  评论 - 0 安卓中webview读取html,同时嵌入Flex的SWF,交互 安卓activity与html交互很简单,用javascri ...

  5. Android客户端和服务器端数据交互

    网上有很多例子来演示Android客户端和服务器端数据如何实现交互不过这些例子大多比较繁杂,对于初学者来说这是不利的,现在介绍几种代码简单.逻辑清晰的交互例子,本篇博客介绍第四种: 一.服务器端: 代 ...

  6. 使用Jquery.AJAX方法和PHP后台数据交互小结

    使用jQuery的AJAX方法和后台PHP进行数据交互,交互采用的数据格式JSON格式. 我主要小小的总结了一下,我使用AJAX方法时候遇到一些小小的问题. 第一:在传递数据的时候,传输地址注意是否正 ...

  7. View与Control间的数据交互

    View与Control间的数据交互 1.ViewBag.Name ="Name1" 2.ViewData["VD"] = "view data&qu ...

  8. .net实现与excel的数据交互、导入导出

    应该说,一套成熟的基于web的管理系统,与用户做好的excel表格进行数据交互是一个不可或缺的功能,毕竟,一切以方便客(jin)户(qian)为宗旨. 本人之前从事PHP的开发工作,熟悉PHP的都应该 ...

  9. 无废话ExtJs 入门教程二十[数据交互:AJAX]

    无废话ExtJs 入门教程二十[数据交互:AJAX] extjs技术交流,欢迎加群(521711109) 1.代码如下: 1 <!DOCTYPE html PUBLIC "-//W3C ...

随机推荐

  1. and 与 && or 与 || 的差异之处

    其实就是比较他们的优先级 // --------------------// "||" 比 "or" 的优先级高 // 表达式 (false || true)  ...

  2. alpha 发布评论

    1.飞天小女警:礼物挑选小工具. 这一组的项目是个人最为感兴趣的,核心功能的实现比较有实际意义,希望所能挑选的礼物范围尽量足够大,界面期待完善后的效果. 2.nice!:约跑app.这一款面向喜爱运动 ...

  3. AndroidStudio Rename Package

    AndroidStudio中重命名包名的方法和可能遇到的问题 在开发中,可能会遇到需要重命名和合并某个包的情况.如果进行如下操作可能会导致以下结果: 在一个空包下创建一个包,会出现两个包名合并的情况. ...

  4. FreeBSD 无线配置

    无线配置在 handbook 中早已有了,但 handbook 中采用写入配置文件的办法,缺乏灵活性,补充下 on the fly 的方法 假设网卡接口为 ath0 ifconfig wlan0 cr ...

  5. EnglishLeaning

    今天看了些hadoop官方reference感觉自己词汇量和语法真是又回到解放前了.于是,痛下决心要好好学习英语.找到了一些学习的方法,自己记录下来,也和大家一起借鉴 努力目标: 掌握大量的计算机英语 ...

  6. android 获取SD卡相关信息

    Object localOb; String str1 = null; try { localOb = new FileReader("/sys/block/mmcblk0/device/t ...

  7. Python——面向对象

    一.创建类 语法格式: class 类名: pass 创建方法: 1 构造方法 class Person: def __init__(self, name,age): #构造方法,构造方法的特性, 类 ...

  8. mvc中多参数URL会很长,首次加载不传参数让url很短,路由规则实现方法[bubuko.com]

    如要实现列表中地址全路径“bubuko-11-2.html”,在首次进入时,使用短路径“bubuko.html”,只有再次href后才显示全路径“bubuko-11-2.html”,下面使用路由规则来 ...

  9. Vim常用命令总结

    Vim常用命令总结: 下文是小编自己整理的关于日常linux vim编程过程中用的一些常用命令,资料参考鸟哥的 如果有需要的小伙伴可以参考一下!(底部有下载地址) 一. 一般模式可用的按钮说明 1.1 ...

  10. 修复sublime text系统右键菜单

    修复sublime text系统右键菜单 安装完Sublime Text2后,拿掉电脑里面的备用硬盘,导致每次使用Open with Sublime Text2的时候,都会出错,打开注册表,找到 HK ...