易语言教程_易语言源码_易语言写挂_易语言论坛_看流星社区

 找回密码
 注册
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
赞助广告位 请点击这里联系站长 QQ20209081
赞助广告位 请点击这里联系站长 QQ20209081
赞助广告位 请点击这里联系站长 QQ20209081
查看: 953|回复: 0

amfphp 与 Flex 通讯的两种方式

[复制链接]
发表于 2013-7-30 21:26:11 | 显示全部楼层 |阅读模式
amfphp是由adobe公司开发的一个开源的项目,用于php与flex通讯的工具类。

amfphp的使用比较简单,只要在官网下载后,解压即可使用,具体的使用方法就不在这里赘述了,要了解的朋友可以上官网或是下载视频了解(个人推荐 "郑岩峰"关于flex的视频,讲解的比较细).

这里主要是要讲一下amfphp与php的通讯的两种方法:

1. NetConnection + Responder

2. Remoting Object


一、NetConnection + Responder 的连接方式

1.先定义一个NetConnection变量

2.连接NetConnection

3.调用连接的call方法,以调用服务器上的类及方法。方法是:conn.call("服务器的类.类中的方法",new Responder(处理成功的方法,处理失败的方法,参数1, 参数2,...));

如下:

private var conn:NetConnection =  new NetConnection();

conn.connect("http://localhost/amfphp/gateway.php");

conn.call("HelloWorld.sayHello",new Responder(success,fault),var1,var2....);

然后定义成功与失败的方法

public funciton success(result:Object):void {

      //TODo   //这里的result由于是一个对象,所以可以转换为任意格式,不过也要根据远程服务传回的内容相对应

}



public function fault(result:Object):void {
     //TODO
}

第一种方法就是那么简单。


二、远程对象 Remoting Object



用这个Remoting Object 就比较复杂一些了,不过确是推荐的方法,因为php自4.0以来就支持面向对象的编程了,所以



用远程对象的方法会使传输的数据内容更加丰富,对以后的维护也更加的方便 。



1. 先写一个service-config.xml 文件,如果不会写这个文件,在browse下有相应的例子,如下:



service-config.xml



<?xml version="1.0" encoding="UTF-8"?>

<services-config>

    <services>

        <service id="sabreamf-flashremoting-service"

                 class="flex.messaging.services.RemotingService"

                 messageTypes="flex.messaging.messages.RemotingMessage">

            <destination id="amfphp">

                <channels>

                    <channel ref="my-amfphp"/>

                </channels>

                <properties>

                    <source>*</source>

                </properties>

            </destination>

        </service>

    </services>



    <channels>

        <channel-definition id="my-amfphp" class="mx.messaging.channels.AMFChannel">

            <endpoint uri="http://flashservices/gateway.php" class="flex.messaging.endpoints.AMFEndpoint"/>

        </channel-definition>

    </channels>

</services-config>



这里最主要是的定义channel,由于一般来说,都是使用一个gateway.php的,所以一般定义一个channel就行了,当然了,如果有多个服务器的话,可以写多个channel。



这个文件主要要修改的地方就是那个 endpoint 下的 uri 地址,其他的基本不用改变。



这里我们要将这个uri 定义成我们服务器中使用的gateway的地址



http://localhost/amfphp/gateway.php



这样service-config.xml 就写好了。



要将这个文件放置在调用远程服务的mxml同一个目录下。



2. 定义我们的mxml 文件



在mxml中定义一个RemoteObject如下:



<mx:RemoteObject id="service" fault="onFault(event)" source="HelloWorld" destination="amfphp">

        <mx:method name="sayHello"  result="onResult(event)"/>

    </mx:RemoteObject>



在这里定义一个RemoteObject 定义id 为service ,一会使用服务的时候,就要用到这个id.



fault 是指当失败时,要调用什么方法,这里的方法要传入一个事件。



source 是指远程的服务的类名



destination 是指我们在 service-config.xml 中定义的关于channel的destination



然后在RemoteObject 中定义方法



name 是指远程服务的类下的方法,像我们这里定义 的是HelloWorld 类,这个类下有一个叫sayHello的方法.



result 是指当成功时,要调用哪个方法,这个方法也要传入一个事件



如果这个类下有多个方法时,我们可以将所有的方法都写在这里面。



然后要我们就可以定义一个按钮去触发这个连接了,如下:



<mx:TextArea id="amfphptest"  width="200" height="107"/>



<mx:Button label="call amfphp" click="service.getOperation('sayHello').send(amfphptest.text)" />



在这里我们定义了一个文本框 ,用于传入参数及显示服务器中返回的结果。



在Button中,当click时,调用我们定义的 RemoteObject的id 即 service



service.getOperation('sayHello').send(amfphptest.text)



是指调用 RemoteObject 中的sayHello方法,send是指传送参数,如果有多个参数则用逗号分隔



如果RemoteObject中有多个方法时,可以再定义几个按扭以触发这些方法。



下面是成功与失败的方法:



private function onResult (evt:ResultEvent):void {



        amfphptest.text = evt.result.toString();



}



private funciton onFault(evt:FaultEvent):void {



        amfphptest.text = evt.result.toString();



}



可以看来事件的result方法是返回的内容。



至些mxml 的内容就是那么多。



这里必须要特别注意的一点,必须要确保以下两个步骤正确才能正常运行这个实例



(1). Flex的项目的 Flex Build Path 即是 库中必须引进一个 rpc.swc 包



(2). 在 Flex 项目属性的 Flex Compiler 即是编译选项中的 Additional compiler argments 中加入



      -locale en_US -service "service-config.xml"  ,即是将我们的destination加入到编译中去。



上面的实例中,只是返回了字符串,但是我们用的是Remoting Object 即是远程对象,这明显不能



证明Remoting Object的功能的强大,下面我们就定义对象来传递内容的例子做一个说明:



3. RemotingObject 复杂一点的例子



   (1) 先我们要定义一个as 类



   package bean {



         [RemoteClass(alias="bean.Person")]



         [Bindable]



         public class Person {



                public var firstName:String;



                public var lastName:String;



                public var phone:String;



                public var email:String;



         }



}



   这里定义了一个类,就是一个实例类,定义为可绑定



   同时,指定别名,即是远程服务器中的service下也有一个bean文件夹,下面也有一个Person类,



   即是表示当前类与服务器中的哪一个类相对应。



  (2)创建一个服务端的Person类,我们要在service下的 bean下创建



    class Person {



         var firstName:String;



         var lastName:String;



         var phone:String;



         var email:String;



         //explicit actionscript package



         var $_explicitType = "bean.Person";



   }



    这里定义的php的Person 类



    可以看到这里除了正常的属性外,还有一个叫$_explicitType属性,



    这里就是指定该类与Flex中的哪个类相对应



    上面两步说明了一点,就是要将两个类进行挂钩。



    这样,就将两个对象对应起来了,所以就可以将这两个对象进行互传,到时将会由amfphp对其进行自动转换。



    (3)定义一个 提供服务的类 PersonService,将其与Person放在同一个目录下

Php代码

<?php  

include("erson.php");  

  

class PersonService {  

      

       /**

       * get a list of perple

       * @return an array of person

       */  

      function getList() {  

          $person = array (  

                 array("Huang","wenzhou","13512312","123@qq.com");  

                 array("Yang","Yi","2342234","1233@qq.com");  

          )  

           

          $p = array();  

            

           for($a=0;$a<count($person);$a++) {  

                 

                   $person = new Person();  

                   $person->firstName = $person[$a][0];  

                   $person->lastName = $person[$a][1];  

                   $person->phone = $person[$a][2];  

                   $person->email = $person[$a][3];  

  

                    $p[]=$person;  

          }  

           

           return $p;  

  

     }  

  

   

}  

?>  

  

  

(4) 定义我们的 mxml 文件   

  

    定义RemoteObject  

      

    如下  

    <mx:RemoteObject id="myservice" source="bean.PersonService"   

            destination="amfphp" fault="faultHandler(event)" showBusyCursor="true">  

        <mx:method name="getList" result="getListHandler(event)" fault="faultHandler(event)" />  

    </mx:RemoteObject>  

  

     可以看到这里有些许的不同了:  

     source = bean.PersonService   即是我们的服务层是在bean下的PersonService  

     destination = amfphp 还是我们之前定义的destination  

     showBusyCursor = true 是指当我们调用服务时,页面上是否显示正忙的提示。  

        

     方法与前面的也差不多。  

  

      

    定义显示数据的DataGrid  

  

   <mxataGrid x="10" y="10" width="345" id="people_list" dataProvider="{dp}" change="changeHandler(event)">  

        <mx:columns>  

            <mxataGridColumn headerText="Last name" dataField="lastName"/>  

            <mxataGridColumn headerText="First name" dataField="firstName"/>  

            <mxataGridColumn headerText="Telephone" dataField="phone"/>  

            <mxataGridColumn headerText="Email" dataField="email"/>  

        </mx:columns>  

    </mxataGrid>  

  

   这里要先定义一个 dp,是一个ArrayCollection,这里是要放即一个个的Person  

    由于之前我们已经将Person.as 与 Person.php 两个对象已经挂钩了,所以这里amfphp会自动将其进行转换。  


   这里的DataGrid 会有一个change事件, 当用户点击时,将选中的结果显示出来。  

   这里最后我们看一下我们的成功及失败的方法如何定义。  
   private function getListHandler(evt:ResultEvent):void {  
          dp = new ArrayCollection(ArrayUtil.toArray(evt.result));        
   }  

   我们再定义我们的 button   
   <mx:Button x="290" y="357" label="get list" click="myservice.getOperation('getList').send();"/>  
    复杂的RemoteObject 就完成了。
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2019-3-23 15:30

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表