flex中使用RemoteObject与java通信(使用AS实现)

来源:互联网 发布:淘宝店铺怎么卖话费 编辑:程序博客网 时间:2024/05/18 01:34

flex中页面采集上来的数据与后端service的交互,中间的桥梁是前端Java了,也就是EJB Client。一般使用RemoteObject来实现比较方便,这里我写一下AS文件中的简单实现。

1.编写一个java类MyManager.java

这只是一个简单的Java类,让页面能够调用Java类的一个方法,传值进去然后,处理完以后在返回给页面。

package com.pzr.remote;public class MyManager {public MyManager(){}public String test(String str){return str+",我进过前端Java";}}


2.注册Java类

Java类有了,如何让Flex能够识别这个类,我们就需要在配置文件中给他一个名分。在Flex的remoting-config-system.xml这个配置文件中注册这个类。

<?xml version="1.0" encoding="UTF-8"?><service id="remoting-service-system" 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="MyManager"><properties><source>com.pzr.remote.MyManager</source></properties></destination></service>

需要注意的是services-config.xml这个文件中有对remoting-config-system.xml这个文件注册管理。

    <services>                <service-include file-path="proxy-config.xml" />        <service-include file-path="messaging-config.xml" />          <service-include file-path="remoting-config-system.xml" />    </services>

3.页面使用RemoteObject调用Java

这里有两种方法,一种是使用mxml标签引入,一种是使用as引入,其实mxml引入最后也是要被编译成as的,不过具体是什么样子不知道,这里我就说一下如何使用as引入。

<?xml version="1.0" encoding="utf-8"?><!-- Simple example to demonstrate the Halo DataGrid control. --><s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"   xmlns:s="library://ns.adobe.com/flex/spark"   xmlns:mx="library://ns.adobe.com/flex/mx"   creationComplete="init()"   ><fx:Script><![CDATA[import mx.collections.ArrayCollection;import mx.controls.Alert;import mx.rpc.events.FaultEvent;import mx.rpc.events.ResultEvent;import mx.rpc.remoting.RemoteObject;public function init():void{//新建一个RemoteObject对象var myManagerRemote:RemoteObject = new RemoteObject;//这里的desitination对应配置文件中的某一个myManagerRemote.destination = "MyManager";//添加有返回值的监听myManagerRemote.addEventListener(ResultEvent.RESULT,initHandler);//添加失败的监听myManagerRemote.addEventListener(FaultEvent.FAULT,faultHandler);//调用Java中的方法,这里是点不出来的,要写得与Java中的一致myManagerRemote.test("aaaaaa");}//调用成功的回调,修改Label的text属性public function initHandler(event:ResultEvent):void{myLabel.text = event.result as String;}//调用失败的回调,打印错误信息public function faultHandler(event:FaultEvent):void{Alert.show("----"+event.message);}]]></fx:Script><s:VGroup width="400" height="200" verticalAlign="middle" horizontalAlign="center"><s:Label id="myLabel" /></s:VGroup></s:Application>

4.看效果图

"aaaaa”是我页面传过去的值,"我进过前端Java"是在方法中添加在后面的然后在传回来,在页面显示。

以上我们只是对RemoteObject进行了事件监听,如果想使用一个RemoteObject对多个方法进行监听,类似于MXML标签的实现方法,这我们该怎么实现呢?

首先看一下MXML文件该怎么写

<fx:Declarations>  <!-- 将非可视元素(例如服务、值对象)放在此处 -->  <s:RemoteObject id="MyManager" destination="MyManager">  <s:method name="test" result="initHandler(event)"/>  </s:RemoteObject>  </fx:Declarations>  

这样效果就和as一样了,但有时候我们的method不止一个,那怎么处理呢,我们可以这样想,如果我们把监听注册到RemoteObject对象的方法上,这样是不是就可以解决为难题了呢。

5.解决as监听多个方法的实现

a.将RemoteObject对象的方法勾出来

b.注册监听,执行不同的回调方法

//新建一个RemoteObject对象var myManagerRemote:RemoteObject = new RemoteObject;//这里的desitination对应配置文件中的某一个myManagerRemote.destination = "MyManager";myManagerRemote.getOperation("test").addEventListener(ResultEvent.RESULT,initHandler);myManagerRemote.getOperation("test").addEventListener(FaultEvent.FAULT,faultHandler);//调用Java中的方法,这里是点不出来的,要写得与Java中的一致myManagerRemote.test("bbbbbb");

这样,是不是感觉就和页面上写的效果是一样了呢。

 

原创粉丝点击