18.4.使用AMFPHP 1.9中的FlexRemoting

此节来自:http://hi.baidu.com/gdutpxz/blog/item/f2108e4556762323cefca3dd.html

18.4.1. 问题
我想使用Flex remoting 与安装了AMFPHP 的服务器进行通信。
18.4.2. 解决办法
安装AMFPHP 并进行连接数据源的配置,使用RemoteObject 访问AMFPHP 服务,调用上面的方法。
18.4.3. 讨论
为了演示如何使用AMFPHP 和Oracle Database Express Edition (XE),这个例子使用remoting组件显示来自Oracle 数据库的employee 表数据。以下是EMPLOYEES 表结构:

下面是PHP 中对应的Employee 类:
+展开
-HTML
<?php
class Employee
{
var $EMPLOYEE_ID;
var $FIRST_NAME;
var $LAST_NAME;
var $EMAIL;
var $PHONE_NUMBER;
var $HIRE_DATE;
var $JOB_ID;
var $SALARY;
var $COMMISSION_PCT;
var $MANAGER_ID;
var $DEPARTMENT_ID;
var $_explicitType = "project.Employee";
}
?>

这里的$_explictType 变量是假设你有一个与PHP 类Employee 对应的ActionScript 类。

本例使用开源的AMFPHP 框架进行序列化,调用AMFPHP 提供的服务可返回AMF 格式的数据。本例中我们使用了个名为EmployeeService 的服务来返回Employee 的信息。service文件要放在AMFPHP 安装目录的services 目录下
+展开
-HTML
<?php
require_once('./Employee.php');
class EmployeeService {
var $myconnection=null;
var $statement=null;
function getEmployees(){
$myconnection = oci_connect('hr','hr'"//localhost/xe");
# Check Oracle connection"
if (!myconnection) {
# Dont use die (Fatal Error), return useful info to the client
trigger_error("
AMFPHP Remoting 'EmployeeService' class could not connect: " . oci_error());
}
$query="
SELECT * FROM EMPLOYEES";
# Return a list of all the employees
$statement=oci_parse($myconnection,$query);
if (!$statement) {
oci_close($myconnection);
trigger_error("
AMFPHP Remoting 'EmployeeService' class database SELECT query error: " . oci_error());
}
oci_execute($statement);
while ($row = oci_fetch_array($statement,OCI_RETURN_NULLS)) {
$data_array[] = $row;
}
return($data_array);
}
}
?>

你可以通过AMFPHP 提供的Service Browser 检查你的服务( 译注: 以这个网址http://localhost/amfphp 安装目录/browser/)

在Flex 里使用Remoting 需要service-config.xml 文件(译注:这个同样是可选的,完全可以动态配置。)以下是service-config.xml 文件的内容,除了url 地址和端口外,其它地方不要改动。
+展开
-XML
<services-config>
<services>
<service id="amfphp-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-amfphpclass="mx.messaging.channels.AMFChannel">
<endpoint uri="http://localhost:9999/amfphp2/amfphp/gateway.php"
class="flex.messaging.endpoints.AMFEndpoint"/>

</channel-definition>
</channels>
</services-config>

加载service-config.xml 文件需要改变flex 的编译参数:
1,菜单Project->Properties
2,选择Flex Complier 块在" locale en_US "后面添加-services service-config.xml 。
3,确定。

现在开始创建actionscript 类保存remote object。
+展开
-ActionScript
package project
{
[RemoteClass(alias="project.Employee")]
public class Employee
{
public var EMPLOYEE_ID:Number;
public var FIRST_NAME:String;
public var LAST_NAME:String;
public var EMAIL:String;
public var PHONE_NUMBER:Number;
public var HIRE_DATE:Date;
public var JOB_ID:Number;
public var SALARY:Number;
public var COMMISSION_PCT:Number;
public var MANAGER_ID:Number;
public var DEPARTMENT_ID:Number;
}
}

现在创建调用remoting 服务并显示其它返回内容的MXML 文件:
+展开
-XML
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxmllayout="absolute">
Here the RemoteObject that will call the Employee service has its destination, source, and event handler methods set:
<mx:RemoteObject id="myservicesource="Project.EmployeeServicedestination="amfphpfault="faultHandler(event)showBusyCursor="true">
<mx:method name="getEmployeesresult="resultHandler(event)fault="faultHandler(event)">
</mx:method>
</mx:RemoteObject>
<mx:Script>
<![CDATA[
import Project.Employee;
import mx.utils.ArrayUtil;
import mx.collections.ArrayCollection;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.controls.Alert;
//当数据返回里dp:ArrayCollection被设为服务端返回的ResultEvent的result属性的内容:
[Bindable]
private var dp:ArrayCollection;
private function faultHandler(event:FaultEvent):void {
Alert.show(event.fault.faultString,
event.fault.faultCode.toString());
}
private function resultHandler(event:ResultEvent):void {
dp=new ArrayCollection(ArrayUtil.toArray(event.result));
}

]]>
</mx:Script>
<mx:Canvas x="0y="0width="100%height="100%">
<mx:Button x="10y="10label="Get dataclick="myservice.getOperation('getEmployees').send()"/>
<!--每一列都与服务端返回相关联-->
<mx:DataGrid x="10y="40width="100%height="100%dataProvider="{dp}">
<mx:columns>
<mx:DataGridColumn headerText="EMPLOYEE_IDdataField="EMPLOYEE_ID"/>
<mx:DataGridColumn headerText="FIRST_NAMEdataField="FIRST_NAME"/>
<mx:DataGridColumn headerText="LAST_NAMEdataField="LAST_NAME"/>
<mx:DataGridColumn headerText="EMAILdataField="EMAIL"/>
<mx:DataGridColumn headerText="PHONE_NUMBERdataField="PHONE_NUMBER"/>
<mx:DataGridColumn headerText="HIRE_DATEdataField="HIRE_DATE"/>
<mx:DataGridColumn headerText="JOB_IDdataField="JOB_ID"/>
<mx:DataGridColumn headerText="SALARYdataField="SALARY"/>
<mx:DataGridColumn headerText="COMMISSION_PCTdataField="COMMISSION_PCT"/>
<mx:DataGridColumn headerText="MANAGER_IDdataField="MANAGER_ID"/>
<mx:DataGridColumn headerText="DEPARTMENT_IDdataField="DEPARTMENT_ID"/>
</mx:columns>
</mx:DataGrid>
</mx:Canvas>
</mx:Application>

当用户点击Get Data 按钮时,远程请求就会被触发,然后获取结果并显示到datagrid 里。

加支付宝好友偷能量挖...


评论(0)网络
阅读(95)喜欢(0)flash/flex/fcs/AIR