Flex这边要有一个实体类和Java的实体类对应,用来存放Java传回的数据和把数据传给Java处理.在这里我们创建了一个Java的User的实体类,所以在Flex这边也要有这样一个User实体类..这个类的代码如下:
package cn.otis.flex.model { [Bindable] [RemoteClass(alias="cn.otis.spring.model.User")] public class User { public var id:int; public var userName:String; public var password:String; //public var note:String; public var note:String; } }
[RemoteClass(alias="cn.otis.spring.model.User")] 这句的意思是说这个类对应Java的cn.otis.spring.model.User类.
[Bindable] 这句的意思是说这个as 3类是可以绑定的..
只是用这个类来传送数据,所以public 也可以了.. 不用都写成geter ,seter.
有了这个类之后,就可以写Mxml了..
我们要实现的UI如下图:
一开始让他获取所有用户. 然后左边是添加用户.
我贴出所有的mxml代码:
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" verticalAlign="middle" horizontalAlign="center" width="100%" height="100%" initialize="init()">
<mx:Script> <![CDATA[ import mx.controls.*; import mx.rpc.events.*; import cn.otis.flex.model.*; import mx.collections.ArrayCollection; [Bindable] private var users:ArrayCollection; [Bindable] private var u:User = new User(); private function init():void{ this.getUsers(); } private function addUser():void{ u.userName = tb_userName.text; u.password = tb_password.text; u.note = tb_note.text; ro_userService.addUser(u); ro_userService.removeEventListener(ResultEvent.RESULT,resultHandler); ro_userService.removeEventListener(FaultEvent.FAULT,faultHandler); ro_userService.addEventListener(ResultEvent.RESULT,addUserEventOK); ro_userService.addEventListener(FaultEvent.FAULT,addUserEventFail); } private function addUserEventOK(event:ResultEvent):void{ this.getUsers(); } private function addUserEventFail(event:FaultEvent):void{ Alert.show("调用失败!" + event.message); } private function getUsers():void{ ro_userService.getUsers(); ro_userService.removeEventListener(ResultEvent.RESULT,addUserEventOK); ro_userService.removeEventListener(FaultEvent.FAULT,addUserEventFail); ro_userService.addEventListener(ResultEvent.RESULT,resultHandler); ro_userService.addEventListener(FaultEvent.FAULT,faultHandler); } private function resultHandler(event:ResultEvent):void { users = event.result as ArrayCollection; } private function faultHandler(event:FaultEvent):void { Alert.show(event.fault.faultString); } ]]> </mx:Script>
<mx:RemoteObject id="ro_userService" showBusyCursor="true" destination="ser_UsersService"/> <mx:Panel width="1000" height="430" layout="absolute" id="addUserPanel" title="增加用户" cornerRadius="8"> <mx:Text text="新增加用户" fontWeight="bold" x="191" y="60"/> <mx:Label text="用户名:" x="179" y="86"/> <mx:Label text="简介:" x="179" y="143"/> <mx:Label text="密码:" x="179" y="113"/> <mx:TextInput x="224" y="84" id="tb_userName"/> <mx:TextInput x="224" y="111" id="tb_password" displayAsPassword="true"/> <mx:TextArea height="111" id="tb_note" x="224" y="142"/> <mx:Button x="267" y="261" label="增加" click="addUser()" id="btn_add"/> <mx:DataGrid id="dg" dataProvider="{users}" width="388" height="243" x="425" y="40"/> <mx:Button label="Get Data" click="getUsers()" x="580" y="291"/> </mx:Panel> </mx:Application>
<mx:RemoteObject id="ro_userService" showBusyCursor="true" destination="ser_UsersService"/> 新建一个remoteObject对象, 设定他的ID.然后要注意思的是destination这个属性,这个是跟另外一个文件相关联的.. 这个文件就是 remoting-config.xml . 这个文件在WebRoot>WEB-INF>flex下.这个文件要加入以下一些配置, 这里我是贴上了该文件的完整内容.
<?xml version="1.0" encoding="UTF-8"?> <service id="remoting-service" class="flex.messaging.services.RemotingService"> <adapters> <adapter-definition id="java-object" class="flex.messaging.services.remoting.adapters.JavaAdapter" default="true" /> </adapters> <default-channels> <channel ref="my-amf" /> </default-channels> <destination id="ser_UsersService"> <properties> <source>cn.otis.spring.service.UsersService</source> </properties> </destination> </service>
destination 这里是跟flex的RemotingObject的destination 属性对应的.
所以要: <mx:RemoteObject id="ro_userService" showBusyCursor="true" destination="ser_UsersService"/> 这样设置, 然后,ro_userService就可以调用cn.otis.spring.service.UsersService类的任何public方法了.
private function getUsers():void{ ro_userService.getUsers(); //调用cn.otis.spring.service.UsersService类的getUsers方法 ro_userService.removeEventListener(ResultEvent.RESULT,addUserEventOK); ro_userService.removeEventListener(FaultEvent.FAULT,addUserEventFail); ro_userService.addEventListener(ResultEvent.RESULT,resultHandler); ro_userService.addEventListener(FaultEvent.FAULT,faultHandler); } private function resultHandler(event:ResultEvent):void { users = event.result as ArrayCollection; } private function faultHandler(event:FaultEvent):void { Alert.show(event.fault.faultString); }
这里.
ro_userService.removeEventListener(ResultEvent.RESULT,addUserEventOK); ro_userService.removeEventListener(FaultEvent.FAULT,addUserEventFail); ro_userService.addEventListener(ResultEvent.RESULT,resultHandler); ro_userService.addEventListener(FaultEvent.FAULT,faultHandler);
其实不应该这样写的.只要创建两个RemotingObject对象就可..
一开始以为建一个RemotingObject就好了.所以就写成这样了..
这个小例子算是完成了..之后会做另外的例子.. 使用MS sql server 2005的Northwind数据库来做例子.. 因为我坚信,学习技术的最好方式和最有挑战性的方式是在做项目中学习. 呵.
下面测试一下..
添加用户.
^_^.