<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, java.lang.String |
String | java.lang.String, java.lang.Boolean boolean, java.lang.Character, char, java.lang.Number |
Date XML Object | java.util.Date org.w 3c.dom.Document |
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 char[] | 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 类。可见两种方法都需要额外的工作,根据不同情况来选择就好。