[原创]flex 3 + .net开发flash Remoting三 --- Flex编程
flex 3 + .net开发flash Remoting三 --- Flex编程
一. 相关说明。
1. 声明。
在研究flash Remoting的时候,参考了很多相关方面的资料,其中包括博客园里很多网友的大作(比较全面的有“幸福★星”的 Flex与Asp.Net通过Remoting 方式进行通讯 系列文章),如在本篇中有雷同或类似的代码,请大家多多包涵。
2. 永远的Hellow World。
在研究flash Remoting的时候,发现书中或网上的很多都是以Hellow World为示例,为使文章通俗易懂,本篇仍旧将“Hellow World”进行到底。
3. Flash Remoting访问服务器端的两种方式的实现。
1.可视化组件访问。这种方式方便快捷,现在网上大部分的资料都是以这种方式实现。
2.编程创建NetConnection类实例访问。这种方式实现相对要麻烦一些。
虽然以上两种方式最终的实现原理是一样的,但本人还是喜欢以编程的方式(即方法2)实现。
二. Flash Remoting访问远程服务(以可视化组件方式实现)。
1. 在Flex编程之前,请先完成服务器端相关代码创建,详见本系列文章第二篇“flex 3 + .net开发flash Remoting二 --- 功能定义”。
2. 在建立Flex工程后,有一个默认的MXML Application,打开该文件。
3. 在 Design 模式下,添加一个 Button控件,id为btDisplayHellow,Label属性为 Call,click事件sampleRemoteObject.DisplayHellow(), 在 Source 模式下,加入如下代码:
<mx:Script>
<![CDATA[
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.controls.Alert;
public function RemoteResult(re:ResultEvent):void
{
var str:String = re.result as String;
Alert.show(str);
}
public function RemoteFault(re:FaultEvent):void
{
Alert.show("Message:" + re.fault.faultString,"出错");
}
]]>
</mx:Script>
<!--这里Source 对应.NET类,前面是命名空间,后面是类名 source = 命名空间.类名-->
<mx:RemoteObject id="sampleRemoteObject"
destination="fluorine"
source="Hxw.Demo.FlashRemoting.Hellow"
showBusyCursor="true">
<!--这里是.NET中的方法,name = 方法名 -->
<mx:method name="DisplayHellow" result="RemoteResult(event)" fault="RemoteFault(event)"/>
<mx:Button x="10" y="21" label="Call" id="btDisplayHellow" width="120" fontSize="15" click="sampleRemoteObject.DisplayHellow()"/>
</mx:RemoteObject>
<![CDATA[
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.controls.Alert;
public function RemoteResult(re:ResultEvent):void
{
var str:String = re.result as String;
Alert.show(str);
}
public function RemoteFault(re:FaultEvent):void
{
Alert.show("Message:" + re.fault.faultString,"出错");
}
]]>
</mx:Script>
<!--这里Source 对应.NET类,前面是命名空间,后面是类名 source = 命名空间.类名-->
<mx:RemoteObject id="sampleRemoteObject"
destination="fluorine"
source="Hxw.Demo.FlashRemoting.Hellow"
showBusyCursor="true">
<!--这里是.NET中的方法,name = 方法名 -->
<mx:method name="DisplayHellow" result="RemoteResult(event)" fault="RemoteFault(event)"/>
<mx:Button x="10" y="21" label="Call" id="btDisplayHellow" width="120" fontSize="15" click="sampleRemoteObject.DisplayHellow()"/>
</mx:RemoteObject>
4. 运行工程。
5. 如果Flash Remtoing调用远程服务出错,请注意以下方面:
. 请注意在Flex运行工程之前,请先运行.net服务器端程序。
. Flex的工程相关配置是否正确,详见本系列文章第一篇“flex 3 + .net开发flash Remoting一 --- 开发环境”。
. 如果要修改Flex工程配置,请在Flex工程上点击右键,Properties --> Flex Server进行修改。
三. Flash Remoting访问远程服务(以编程方式实现)。
1. 在Flex编程之前,请先完成服务器端相关代码创建,详见本系列文章第二篇“flex 3 + .net开发flash Remoting二 --- 功能定义”。
2. 在建立Flex工程后,有一个默认的MXML Application,打开该文件。
3. 在 Design 模式下,添加一个 Button控件,id为btDisplayHellow,Label属性为 Call,click事件为simpleTest() 在 Source 模式下,加入如下代码:
1). CUEvent.as,自定义事件类。
package com.demo.fr
{
import flash.events.Event;
//从Event继承一个类。
//为什么as3中仅仅能够定义一个构造器,郁闷。
public class CUEvent extends Event
{
//数据实体。
private var _sender : Object = null;
//方法名。
private var _currentTargetName: String = "";
//构造器(为什么as3中仅仅能够定义一个构造器,郁闷)。
public function CUEvent(type : String,bubbles : Boolean = false,cancelable : Boolean = false)
{
super(type,bubbles,cancelable);
}
//获取 数据实体。
public function get Sender():Object
{
return this._sender;
}
//设置 数据实体。
public function set Sender(value : Object) : void
{
this._sender = value;
}
//获取 方法名称。
public function get CurrentTargetName() : String
{
return this._currentTargetName;
}
//设置 方法名称。
public function set CurrentTargetName(value : String) :void
{
this._currentTargetName = value;
}
}
}
{
import flash.events.Event;
//从Event继承一个类。
//为什么as3中仅仅能够定义一个构造器,郁闷。
public class CUEvent extends Event
{
//数据实体。
private var _sender : Object = null;
//方法名。
private var _currentTargetName: String = "";
//构造器(为什么as3中仅仅能够定义一个构造器,郁闷)。
public function CUEvent(type : String,bubbles : Boolean = false,cancelable : Boolean = false)
{
super(type,bubbles,cancelable);
}
//获取 数据实体。
public function get Sender():Object
{
return this._sender;
}
//设置 数据实体。
public function set Sender(value : Object) : void
{
this._sender = value;
}
//获取 方法名称。
public function get CurrentTargetName() : String
{
return this._currentTargetName;
}
//设置 方法名称。
public function set CurrentTargetName(value : String) :void
{
this._currentTargetName = value;
}
}
}
2).frServicesSimple.as,编程访问远程服务器。
package com.demo.fr
{
import flash.events.EventDispatcher;
import flash.net.NetConnection;
import flash.net.Responder;
//用代码调用flash Remoting。
public class frServicesSimple
{
//Remoting服务器对象完整名称。
private var name_ServerClass : String = "Hxw.Demo.FlashRemoting.Hellow";
//初始化一个事件广播对象。
private var eventDispatcher : EventDispatcher = new EventDispatcher();
//事件关键字定义:Event_KEY_Success_DisplayHellow。
public static var Event_KEY_Success_DisplayHellow : String = "Event_KEY_Success_DisplayHellow";
//事件关键字定义:Event_KEY_Fault。
public static var Event_KEY_Fault : String = "Event_KEY_Fault";
//Remoting连接对象。
private var conn : NetConnection = null;
//Flash Remoting方法返回值获取对象。
private var rp :Responder = null;
//构造器。
public function frServices()
{
}
//开始调用远程服务方法。
public function preCall(result : Function):void
{
//初始化Remoting连接对象。
this.conn = new NetConnection();
//调用connect( )方法,传递进Flash Remoting网关的URL。
this.conn.connect("http://localhost:5678/WebFR/Gateway.aspx");
this.rp = new Responder(result,onError);
}
//调用远程服务方法。
public function call_DisplayHellow():void
{
this.preCall(onResult_DisplayHellow);
//对象的call( )方法调用Flash Remoting方法,call( )方法需要两个参数,
//第一个参数指定方法名称和路径,第二个参数指定响应处理函数,如果不需要处理函数,可直接设为null
//处理FlashRemoting响应。
this.conn.call(this.name_ServerClass + ".DisplayHellow",this.rp);
}
//调用服务成功。
private function onResult_DisplayHellow(result : Object) : void
{
this.resultHandler(result,"DisplayHellow",frServicesSimple.Event_KEY_Success_DisplayHellow);
}
//调用服务成功的处理。
private function resultHandler(result : Object,targetName : String ,eventKey : String) : void
{
var ce : CUEvent = new CUEvent(eventKey);
ce.Sender = result;
ce.CurrentTargetName = targetName;
this.eventDispatcher.dispatchEvent(ce);
}
//调用服务失败。
private function onError(error : Object):void
{
var ce : CUEvent = new CUEvent(Event_KEY_Fault);
ce.Sender = error;
this.eventDispatcher.dispatchEvent(ce);
}
//创建一个供外部调用的附加事件侦听的方法。
public function addEventListener(type : String , listener : Function):void
{
this.eventDispatcher.addEventListener(type,listener);
}
}
}
{
import flash.events.EventDispatcher;
import flash.net.NetConnection;
import flash.net.Responder;
//用代码调用flash Remoting。
public class frServicesSimple
{
//Remoting服务器对象完整名称。
private var name_ServerClass : String = "Hxw.Demo.FlashRemoting.Hellow";
//初始化一个事件广播对象。
private var eventDispatcher : EventDispatcher = new EventDispatcher();
//事件关键字定义:Event_KEY_Success_DisplayHellow。
public static var Event_KEY_Success_DisplayHellow : String = "Event_KEY_Success_DisplayHellow";
//事件关键字定义:Event_KEY_Fault。
public static var Event_KEY_Fault : String = "Event_KEY_Fault";
//Remoting连接对象。
private var conn : NetConnection = null;
//Flash Remoting方法返回值获取对象。
private var rp :Responder = null;
//构造器。
public function frServices()
{
}
//开始调用远程服务方法。
public function preCall(result : Function):void
{
//初始化Remoting连接对象。
this.conn = new NetConnection();
//调用connect( )方法,传递进Flash Remoting网关的URL。
this.conn.connect("http://localhost:5678/WebFR/Gateway.aspx");
this.rp = new Responder(result,onError);
}
//调用远程服务方法。
public function call_DisplayHellow():void
{
this.preCall(onResult_DisplayHellow);
//对象的call( )方法调用Flash Remoting方法,call( )方法需要两个参数,
//第一个参数指定方法名称和路径,第二个参数指定响应处理函数,如果不需要处理函数,可直接设为null
//处理FlashRemoting响应。
this.conn.call(this.name_ServerClass + ".DisplayHellow",this.rp);
}
//调用服务成功。
private function onResult_DisplayHellow(result : Object) : void
{
this.resultHandler(result,"DisplayHellow",frServicesSimple.Event_KEY_Success_DisplayHellow);
}
//调用服务成功的处理。
private function resultHandler(result : Object,targetName : String ,eventKey : String) : void
{
var ce : CUEvent = new CUEvent(eventKey);
ce.Sender = result;
ce.CurrentTargetName = targetName;
this.eventDispatcher.dispatchEvent(ce);
}
//调用服务失败。
private function onError(error : Object):void
{
var ce : CUEvent = new CUEvent(Event_KEY_Fault);
ce.Sender = error;
this.eventDispatcher.dispatchEvent(ce);
}
//创建一个供外部调用的附加事件侦听的方法。
public function addEventListener(type : String , listener : Function):void
{
this.eventDispatcher.addEventListener(type,listener);
}
}
}
3).MXLM Application中的代码。
import com.demo.fr.CUEvent;
import flash.net.navigateToURL;
import mx.collections.ArrayCollection;
import mx.rpc.events.ResultEvent;
import mx.rpc.events.FaultEvent;
import mx.controls.Alert;
import com.demo.fr.frServicesSimple;
private function simpleTest():void
{
var fr : frServicesSimple = new frServicesSimple();
fr.addEventListener(frServicesSimple.Event_KEY_Success_DisplayHellow,stSuccessHandler);
fr.addEventListener(frServicesSimple.Event_KEY_Fault,stFaultHandler);
fr.call_DisplayHellow();
}
private function stSuccessHandler(event : CUEvent):void
{
Alert.show("xx:" + event.Sender.toString(),"DisplayHellow");
}
private function stFaultHandler(event :CUEvent):void
{
Alert.show(event.Sender.toString(),"Remoting调用出错");
}
import flash.net.navigateToURL;
import mx.collections.ArrayCollection;
import mx.rpc.events.ResultEvent;
import mx.rpc.events.FaultEvent;
import mx.controls.Alert;
import com.demo.fr.frServicesSimple;
private function simpleTest():void
{
var fr : frServicesSimple = new frServicesSimple();
fr.addEventListener(frServicesSimple.Event_KEY_Success_DisplayHellow,stSuccessHandler);
fr.addEventListener(frServicesSimple.Event_KEY_Fault,stFaultHandler);
fr.call_DisplayHellow();
}
private function stSuccessHandler(event : CUEvent):void
{
Alert.show("xx:" + event.Sender.toString(),"DisplayHellow");
}
private function stFaultHandler(event :CUEvent):void
{
Alert.show(event.Sender.toString(),"Remoting调用出错");
}
4. 运行工程。
5. 如果Flash Remtoing调用远程服务出错,请注意以下方面:
. 请注意在Flex运行工程之前,请先运行.net服务器端程序。
. Flex的工程相关配置是否正确,详见本系列文章第一篇“flex 3 + .net开发flash Remoting一 --- 开发环境”。
. 如果要修改Flex工程配置,请在Flex工程上点击右键,Properties --> Flex Server进行修改。
以上仅以DisplayHellow方法为例,分别以可视化组件方式和编程方式访问远程服务器,完整代码见下篇。