[原创]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>

    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;
        }


    }

}

        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);    
        }


    }

}

        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调用出错");
            }

    4. 运行工程。
    5. 如果Flash Remtoing调用远程服务出错,请注意以下方面:
        . 请注意在Flex运行工程之前,请先运行.net服务器端程序。
        . Flex的工程相关配置是否正确,详见本系列文章第一篇“flex 3 + .net开发flash Remoting一 --- 开发环境”。
        . 如果要修改Flex工程配置,请在Flex工程上点击右键,Properties --> Flex Server进行修改。

    以上仅以DisplayHellow方法为例,分别以可视化组件方式和编程方式访问远程服务器,完整代码见下篇。
posted @ 2008-03-15 14:06 有容乃大 阅读(...) 评论(...) 编辑 收藏