需要在WebContent→WEB-INF→flex目录下找到一个叫remoting-config.xml的文件,文件当前的内容如下:
encoding="UTF-8"?>
class="flex.messaging.services.RemotingService">
id="java-object"
class="flex.messaging.services.remoting.adapters.JavaAdapter"
default="true"/>
这是默认的设置。其中的段表明了这是一个远程调用服务,段定义了一个“适配器”,读者可以将其理解为与对象或服务直接交互的服务器端代码,这可能比较难理解,其实读者可以理解为:Java写的东西,Flex是看不懂的,有了这个适配器,可以在Java和Flex中建立一种转换机制,能够使Flex和Java顺利通信,就像USB鼠标可以用一个串口适配器接到串口上当成普通鼠标使用一样。在我们稍后定义的“目标”中,会引用这个适配器。段定义了默认的“频道”,频道是指一种传输的协议,Flex客户端(Flash
Player)需要某种“协议”才能与数据服务进行通信。在Flex中,有3种基本的“频道”:HTTP、AMF和RTMP。形象点说,你调到某个频道,就能收看那个频道的电视(能接收其信号),这是同一个道理。
现在在段后面加上我们的“目标”定义:
flex.userinfosys.db.user.UserService
这里定义了一个元素,可以理解为“目标”,其中的子元素中定义了我们要引用的UserService类。目标按Flex官方的技术资料解释为“endpoint”(端点),我们的调用到达UserService之前实际上是在网络上传输的,需要编码和解码,所以这个端点可以理解成负责编码和解码的一个中间服务。
现在,我们修改UserInfoSys.mxml,调用UserService来获取我们的用户数据:
encoding="utf-8"?>
xmlns:mx="http://www.adobe.com/2006/mxml"
creationComplete="srv.getUsers()">
destination="user"/>
dataProvider="{srv.getUsers.lastResult}"
width="100%" height="100%"/>
click="srv.getUsers()"/>
编译项目并部署,启动服务器。打开浏览器,输入以下地址:
。
调用UserService返回所有用户信息
首先,我们要建立一个ActionScript类User,用于存放客户端的用户信息,相当于一个Value
Object(涉及模式中的数据传输对象)。
单击Finish按钮,这样Eclipse会为我们建立一个AcitonScript类的框架,自动生成如下代码(User.as):
package
{
public
class User
{
public function User()
{
}
}
}
我们在其中添加用户的相关属性字段,并加上元数据标签[Managed]和[RemoteClass]如下(User.as):
package
{
[Managed]
[RemoteClass(alias="flex.userinfosys.db.user.UserProfile")]
public class User
{
public function User()
{
}
public var userId:int;
public var name:String;
public var title:String;
public var image:String;
public var imagebref:String;
public var description:String;
}
}
ActionScript定义的对象有两种类型,一种是其所有属性都是原始类型,如int、String等;还有一种是某些属性是对象类型,这种对象称为“层次类型”的对象。
我们使用UserService对象来管理User对象的持久化,如果User对象有对象类型的属性的话,需要相应的Java对象来管理相应属性的持久化。加上Managed元数据标签表明,如果有对象类型的属性,那么这些属性拥有自己的“目标”定义,这些“目标”负责管理这些属性的状态。我们前面已经定义了一个目标,它与UserService关联,如果User对象有对象类型属性如Address,那么还会为Address单独定义目标,负责Address的增删改查操作。
RemoteClass元数据标签建立了一个User类(ActionScript类)到我们先前建立的UserProfile类(Java类)之间的一个映射。
当我们将数据封装在User类中并发送到服务器端,调用Java类上的方法时,先前定义的“目标”和“适配器”会自动为我们完成这种转化,将User类对象转化为Java的UserProfile对象。
在此请注意两点:一是这里的字段名一定要和Java对应类中的完全一致,例如UserProfile中有userId属性,那么这里的userId就不能写成user_id或其他形式,否则在更新数据的时候会出错;二是UserProfile一定要有默认的构造函数,否则不能实例化UserProfile类。