flex4.5+php5.2+amfphp通过RemoteObject交互

偶尔写写PHP感觉心情还是蛮舒畅的(Java里的Struts+Hibernate+Spring写久了),写写PHP才知道,这种被解放的感觉真好。不得不说,PHP是一种服务器端比较精辟的语言,难怪崇拜者这么多。就来整整flex基于PHP的交互,看好了,这里要介绍的不是通过flex里面的HttpService组件与PHP交互,而是借助AMFPHP通过RemoteObject方式来交互。
关于amfPHP环境的搭建,请参考本人写的amfPHP环境搭建教程,当然里面写的比较粗略,有不清粗的可以联系我。
先来看看PHP代码
ProductServices.PHP

<?PHP
class ProductServices{
    /**
    *query product list
    */
    function getProductList(){
        $link=@MysqL_connect("localhost","root","") or die("Could not connect");
        MysqL_select_db("compass",$link);
        MysqL_query("set names utf8",$link);
        $result = MysqL_query("SELECT * FROM product",$link);
        $array=array();
        while ($row = MysqL_fetch_array($result,MysqL_ASSOC)) {
            array_push($array,$row);
        }
        MysqL_free_result($result);
        MysqL_close($link);
        return $array;
    }



    function findProductById($id){
        $link=@MysqL_connect("localhost",$link);
        $result = MysqL_query("SELECT * FROM product where id= ".$id,$row);
        }
        MysqL_free_result($result);
        MysqL_close($link);
        return $array;
    }

}
?>


在ProductServices.PHP文件中,定义了一个类ProductServices,里面封装了两个方法,getProductList(),findProductById($id)里面内容很简单,一个是全部查询商品,一个是根据Id查询商品

注意该文件存放的位置C:\inetpub\wwwroot\amfPHP\services\ 这样可以被amfPHP的资源管理器检索到




编写flex端代码

<?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="955" minHeight="600"
               creationComplete="ro.getoperation('getProductList').send()"
               >
    <!-- 
        ro.getoperation('getProductList').send() 
        ro为RemoteObject的Id
        ro.getoperation('getProductList')获取PHP文件中的方法名,及要调用服务器端的那个方法
        send()发送请求,在send中可传递参数,多个参数之间用逗号分隔,参数名要与服务器端的参数名一致
    -->
    <fx:Declarations>
        <!-- 将非可视元素(例如服务、值对象)放在此处 -->
        
        <s:RemoteObject id="ro" 
                        destination="amfPHP"  
                        source="ProductServices" 
                        fault="getProductList_faultHandler(event)" 
                        result="getProductList_resultHandler(event)"
                        endpoint="http://192.168.3.11/amfPHP/gateway.PHP">
        </s:RemoteObject>
        
        <!--
            RemoteObject中的destination需要与src目录下的services-config.xml中定义的destination的Id保持一致
            source="ProductServices"要调用服务器端的那个PHP类,如果存在包的话注意包名.类名
            fault 失败时响应的方法
            result 成功时的方法
            endpoint="http://192.168.3.11/amfPHP/gateway.PHP" 正确访问gateway.PHP的地址
        -->
        
    </fx:Declarations>
    
    <fx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;
            import mx.controls.Alert;
            import mx.rpc.events.FaultEvent;
            import mx.rpc.events.ResultEvent;
            import mx.utils.ArrayUtil;
            
            [Bindable]
            internal var dp:ArrayCollection;
            
            
            
            //amfPHP请求成功时调用方法
            protected function getProductList_resultHandler(event:ResultEvent):void
            {
                dp=new ArrayCollection(ArrayUtil.toArray(event.result));
            }
            //amfPHP请求失败时调用方法
            protected function getProductList_faultHandler(event:FaultEvent):void
            {
                Alert.show("失败了",event.fault.message);                
            }
            
        ]]>
    </fx:Script>
    
    
    <s:layout>
        <s:HorizontalLayout/>
    </s:layout>
    <s:DataGrid width="519" height="292" dataProvider="{dp}" requestedRowCount="4">
        <s:columns>
            <s:ArrayList>
                <s:GridColumn datafield="id" headerText="编号"></s:GridColumn>
                <s:GridColumn datafield="name" headerText="商品名称"></s:GridColumn>
                <s:GridColumn datafield="price" headerText="单价"></s:GridColumn>
                <s:GridColumn datafield="descption" headerText="描述"></s:GridColumn>
            </s:ArrayList>
        </s:columns>
    </s:DataGrid>
    
</s:Application>


必须在flex工程的src目录下存放一个名为services-config.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://192.168.3.11/amfPHP/gateway.PHP" class="flex.messaging.endpoints.AMFEndpoint"/>
        </channel-deFinition>
    </channels>
</services-config>


需要将该文件编译到环境中去


效果


点我下载代码

相关文章

一:display:flex布局display:flex是一种布局方式。它即可以...
1. flex设置元素垂直居中对齐在之前的一篇文章中记载过如何...
移动端开发知识点pc端软件和移动端apppc端软件是什么,有哪些...
最近挺忙的,准备考试,还有其他的事,没时间研究东西,快周...
display:flex;把容器设置为弹性盒模型(设置为弹性盒模型之后...
我在网页上运行了一个Flex应用程序,我想使用Command←组合键...