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 类:
这里的$_explictType 变量是假设你有一个与PHP 类Employee 对应的ActionScript 类。
本例使用开源的AMFPHP 框架进行序列化,调用AMFPHP 提供的服务可返回AMF 格式的数据。本例中我们使用了个名为EmployeeService 的服务来返回Employee 的信息。service文件要放在AMFPHP 安装目录的services 目录下
你可以通过AMFPHP 提供的Service Browser 检查你的服务( 译注: 以这个网址http://localhost/amfphp 安装目录/browser/)
在Flex 里使用Remoting 需要service-config.xml 文件(译注:这个同样是可选的,完全可以动态配置。)以下是service-config.xml 文件的内容,除了url 地址和端口外,其它地方不要改动。
加载service-config.xml 文件需要改变flex 的编译参数:
1,菜单Project->Properties
2,选择Flex Complier 块在" locale en_US "后面添加-services service-config.xml 。
3,确定。
现在开始创建actionscript 类保存remote object。
现在创建调用remoting 服务并显示其它返回内容的MXML 文件:
当用户点击Get Data 按钮时,远程请求就会被触发,然后获取结果并显示到datagrid 里。
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";
}
?>
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);
}
}
?>
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-amfphp" class="mx.messaging.channels.AMFChannel">
<endpoint uri="http://localhost:9999/amfphp2/amfphp/gateway.php"
class="flex.messaging.endpoints.AMFEndpoint"/>
</channel-definition>
</channels>
</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-amfphp" class="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;
}
}
{
[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/mxml" layout="absolute">
Here the RemoteObject that will call the Employee service has its destination, source, and event handler methods set:
<mx:RemoteObject id="myservice" source="Project.EmployeeService" destination="amfphp" fault="faultHandler(event)" showBusyCursor="true">
<mx:method name="getEmployees" result="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="0" y="0" width="100%" height="100%">
<mx:Button x="10" y="10" label="Get data" click="myservice.getOperation('getEmployees').send()"/>
<!--每一列都与服务端返回相关联-->
<mx:DataGrid x="10" y="40" width="100%" height="100%" dataProvider="{dp}">
<mx:columns>
<mx:DataGridColumn headerText="EMPLOYEE_ID" dataField="EMPLOYEE_ID"/>
<mx:DataGridColumn headerText="FIRST_NAME" dataField="FIRST_NAME"/>
<mx:DataGridColumn headerText="LAST_NAME" dataField="LAST_NAME"/>
<mx:DataGridColumn headerText="EMAIL" dataField="EMAIL"/>
<mx:DataGridColumn headerText="PHONE_NUMBER" dataField="PHONE_NUMBER"/>
<mx:DataGridColumn headerText="HIRE_DATE" dataField="HIRE_DATE"/>
<mx:DataGridColumn headerText="JOB_ID" dataField="JOB_ID"/>
<mx:DataGridColumn headerText="SALARY" dataField="SALARY"/>
<mx:DataGridColumn headerText="COMMISSION_PCT" dataField="COMMISSION_PCT"/>
<mx:DataGridColumn headerText="MANAGER_ID" dataField="MANAGER_ID"/>
<mx:DataGridColumn headerText="DEPARTMENT_ID" dataField="DEPARTMENT_ID"/>
</mx:columns>
</mx:DataGrid>
</mx:Canvas>
</mx:Application>
Here the RemoteObject that will call the Employee service has its destination, source, and event handler methods set:
<mx:RemoteObject id="myservice" source="Project.EmployeeService" destination="amfphp" fault="faultHandler(event)" showBusyCursor="true">
<mx:method name="getEmployees" result="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="0" y="0" width="100%" height="100%">
<mx:Button x="10" y="10" label="Get data" click="myservice.getOperation('getEmployees').send()"/>
<!--每一列都与服务端返回相关联-->
<mx:DataGrid x="10" y="40" width="100%" height="100%" dataProvider="{dp}">
<mx:columns>
<mx:DataGridColumn headerText="EMPLOYEE_ID" dataField="EMPLOYEE_ID"/>
<mx:DataGridColumn headerText="FIRST_NAME" dataField="FIRST_NAME"/>
<mx:DataGridColumn headerText="LAST_NAME" dataField="LAST_NAME"/>
<mx:DataGridColumn headerText="EMAIL" dataField="EMAIL"/>
<mx:DataGridColumn headerText="PHONE_NUMBER" dataField="PHONE_NUMBER"/>
<mx:DataGridColumn headerText="HIRE_DATE" dataField="HIRE_DATE"/>
<mx:DataGridColumn headerText="JOB_ID" dataField="JOB_ID"/>
<mx:DataGridColumn headerText="SALARY" dataField="SALARY"/>
<mx:DataGridColumn headerText="COMMISSION_PCT" dataField="COMMISSION_PCT"/>
<mx:DataGridColumn headerText="MANAGER_ID" dataField="MANAGER_ID"/>
<mx:DataGridColumn headerText="DEPARTMENT_ID" dataField="DEPARTMENT_ID"/>
</mx:columns>
</mx:DataGrid>
</mx:Canvas>
</mx:Application>
当用户点击Get Data 按钮时,远程请求就会被触发,然后获取结果并显示到datagrid 里。
加支付宝好友偷能量挖...