Flex 支持多种与服务器端的通讯方式,包括 remote 和 socket 等高级数据通讯方式。 remote 采用 amf ( action message format )协议。 amt 是一种二进制格式,专用于 as 和服务器端通讯,比 http 通讯要快很多,而且支持多种数据类型,如 java , .net,php 等。本文将介绍如何使用 Flex RemoteObject components 调用服务器端 java 对象的方法。
Flex 客户端使用 RemoteObject
在 mxml 中声明一个 id 为 ro 的 RemoteObject ,在 as 中可以通过 ro 引用 RemoteObject 对象, destination 是服务器端暴露的 java 服务对象, Method 的 name 是 java 服务对象中的方法, result 是访问服务器方法的回调函数。本例中是使用 RemoteObject 访问服务器端 HelloWorld 的 sayHello 方法。
testHelloWorld.mxml 代码
<?xml version=”1.0″ encoding=”utf-8″?>
<mx:Application xmlns:mx=”http://www.adobe.com/2006/mxml”>
<mx:Script>
<![CDATA[
import mx.controls.Alert;
import mx.rpc.events.ResultEvent;
[Bindable]
private var memberResult:Object;
private function say():void{
var user:User=new User();
user.setName(n.text);
user.setId(”testId”);
ro.sayHello(user);
}
public function handleResult(event:ResultEvent):void {
target.text=event.result as String;
}
]]>
</mx:Script>
<mx:RemoteObject id=”ro” destination=”HelloWorld”>
<mx:method name=” sayHello ” result=” handleResult (event)”/>
<mx:RemoteObject>
<mx:TextInput id=”n” change=”say()”/>
<mx:Label id=”target”/>
</mx:Application>
User.as 代码
package {
[RemoteClass(alias="cn.com. remote.test.User")]
public class User {
public var name:String;
public var id:String;
public function getName():String{
return name;
}
public function setName(name:String ):void {
this.name = name;
}
public function getId():String {
return id;
}
public function setId(id:String):void {
this.id = id;
}
}
}
定义服务器端 java 对象
HelloWorld.java 代码
package cn.com. remote.test;
public class HelloWorld {
public String sayHello(String name){
System.out.println(”**********sayHello(String name) in*************”);
System.out.println(”hello,”+name);
return “hello,”+name;
}
public User getUser(String name){
System.out.println(”**********getUser in*************”);
return new User(name,name+”Id”);
}
}
User.java 代码
package cn.com. remote.test;
public class User {
private String name;
private String id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
配置服务器端 destination
使用 RemoteObject 与服务器端通讯,需要用到 Flex Date Services ,本文使用的是 BlazeDS server , BlazeDS 的使用本文不做详细说明,可参看 http://opensource.adobe.com/wiki/display/blazeds/BlazeDS/ 。
在 remoting-config.xml 中配置 destination ,增加如下代码
< destination id = “ helloWorld “ >
< properties >
< source > cn.com. remote.test .helloWorld </ source >
< factory > springFactory </ factory >
</ properties >
</ destination >
As 对象与 java 对象的转换
在 as 中调用 ro.sayHello 时,传入一个 as 对象 user ,服务器端将会把 user 对象转换为 java 对象 user 。同样,如果服务器端方法 return 的是 java User 对象, as 接收到的将是 as 的 User 对象。 [RemoteClass(alias="cn.com. remote.test.User")] 声明了 As user 对象与 java User 对象的对应关系。下面是基础类型或常用类的对应关系图。
需要注意到问题
flex remote 传递 object 参数和接受返回的 dojo 对象,应注意以下问题:
1.as 对象属性必须为 public 的
2.remote 调用的 java 方法时,参数不能作为区别不同方法的依据,也就是说, java 方法不
能重名
3.dojo 对象,必须有无参构造函数
4.as 对象需加 [RemoteClass(alias="cn.com. remote.test.User")]