<mx:RemoteObject id="RO" source="org.sjtu.se.Applex" fault="alert(fault.faultString, 'Error');">
<mx:method name="listPerson"/>
</mx:RemoteObject>
<mx:Model id="myModel">
{RO.listPerson.result}
</mx:Model>
<mx:DataGrid id="DG" with="100%" height="100%" dataProvider="{myModel}">
<mx:columns>
<mx:array>
<mx:DataGridColumn headerText="Name" columnName="name"/>
<mx:DataGridColumn headerText="Age" columnName="age"/>
</mx:array
</mx:columns>
</mx:DataGrid>
public class Person
{
String name;
int age;
//getters and setters here.
//getters and setters are must for Flex to access the data in object of
//this class
}
public List listPerson()
{
List list = new ArrayList();
Person p1 = new Person("seafront", 22);
Person p2 = new Person("frontsea", 20);
list.add(p1); list.add(p2);
return list;
}
是flex 与java 交互主要还是要关心这两者之间的数据交互类型的转换。ActionScript 与java 的类型互换不是对称的,见下面的表:
ActionScript to Java | |
ActionScript Type | Java Type |
null | null |
Number | java.lang.Number |
Boolean | java.lang.Number, booean, |
String | java.lang.String, java.lang.Boolean |
Date | java.util.Date |
Java to ActionScript | |
Java Type | ActionScript Type |
null | null |
java.lang.Number(class or primitive) | Number |
java.lang.Boolean, boolean | Boolean |
java.lang.String, java.lang.Character | String |
java.util.Collection, java.lang.reflect.Array | Array |
java.util.Map, java.util.Dictionary | Object |
org.w 3c .dom.Document | XML Object |
Other classes | Object(typed) |
由上面两表可以看到,一般的数据类型都可以很好的装换,但是对于用户自定义的类型的话,那么要不就是在ActionScritp中定义相关的数据类型,进行类型注册,但是这样两者就太紧耦合了,觉得不是很好。另外的话可以看到,java 可以返回Collection 类型的集合类给ActionScript ,而AS 使用是一数组来处理,就像前面例子里的一样,虽然Person是自定义类,但是里面的成员都是基本AS 可自动转换的类型的,而把Person 对象放在List里返回,然后AS 通过数组 的[] 操作符来访问,直接操作name 和 age 成员变量。
所以如果用flex 作表现曾的话,那么对于model 中的类,就可能要考虑这一点,有时候需要专门为flex 编写与其兼容的model 类。可见两种方法都需要额外的工作,根据不同情况来选择就好。
还有如果从Flex 中提交一个Array 到Java 方法中,java方法以 Collection来接受,如果Array不是常规数组,就是说数组元素不是用index来访问,那么里面每个元素是一个Map(HashMap), key是这个数组访问变量,比要把上面datagrid的 dataProvider 提交大java 方法中,那么Map 的key 就是name 和age,使用Map.get()从而取出里面的数据。