Flex中用RemoteObject与java后台通信

本文介绍如何利用BlazeDS实现Java与Flex之间的远程调用,并通过具体示例展示了如何配置remoting-service及使用RemoteObject组件进行跨域数据交换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

感谢:flex的RemoteObject的用法

BlazeDS是一个基于服务器的Java远程调用(remoting)和Web消息传递(messaging)技术,使得后台的Java应用程序和运行在浏览器上的Flex应用程序能够相互通信。
如果你想通过使用RPC Services提供一些企业级功能,如不同域之间数据交换的代理功能、客户端认证、服务器端日志、本地化支持、RPC Services服务集中化管理等功能时,BlazeDS通过使用RemoteObject控件可以轻松实现,而不需要配置他们像SOAP-compliant网络服务。
当客户端RPC控件调用远程服务时,该控件就会把服务端返回的数据保存在一个ActionScript对象中,这样,在程序中就能够很轻松的获取想要的数据,而这些客户端控件包括HTTPService、WebService、RemoteObject控件。

一、在Eclipse中新建javaweb项目

1.下载BlazeDS, http://sourceforge.net/adobe/blazeds/wiki/download%20blazeds%204/

2.在Eclipse中建立的web工程。

3.将blazeds.war解压,把META-INF和WEB-INF两个文件夹复制到web项目的WebContent(或WebRoot)文件夹,覆盖掉WebContent文件夹内原来的两个文件夹:即META-INF和WEB-INF,至此,BlazeDS搭建完毕。

二、使用FlashBuilder新建Flex项目,服务器设置如下


三、代码示例

1.编写远程服务类

package com.lxz;
//调用方法为public
public class SayHello {
	public String getInfo(String info){
		System.out.println("调用SayHello方法");
		return "Hello,"+info;
	}
	public String getInfo2(String info){
		System.out.println("SayHello2方法不可以访问");
		return "Hello,"+info;
	}
	public String getInfo3(String name,int age){
		System.out.println("调用SayHello3方法");
		return "Hello,"+ name + ",and your age is " + age;
	}
}

2.配置remoting-config.xml

Java服务类写好后,还需要配置,BlazeDSRemote Service是在服务器端对应了一个配置文件:remoting-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- 指定服务的ID和对应的类 -->
<service id="remoting-service" class="flex.messaging.services.RemotingService">
	<!-- 设置适配器(adapters)的ID和对应的类 -->
	<adapters>
		<adapter-definition id="java-object"
			class="flex.messaging.services.remoting.adapters.JavaAdapter"
			default="true" />
	</adapters>
	
	<!-- 指定默认的通道(channels)及其参照,该通道是在 services-config.xml中定义的。 
	适配器和通道可以设置多个,采用第一个优先的原则 -->
	<default-channels>
		<channel ref="my-amf" />
	</default-channels>
	
	<!-- 设置服务终端(destination),该属性必须和RemoteObject组件的服务终端属性一致。
	按照服务的种类,服务终端又可以分为代理服务终端、远程服务终端和消息服务终端。代理服务终端,
	需要指定该终端的url,远程服务终端,需要指定该目标的source和scope -->
	<destination id="SayHello">
		<properties>
			<!-- source属性说明了远程对象服务的目标,也就是远程Java对象。
			在设定source属性时,必须使用全路径java类名称 -->
			<source>com.lxz.SayHello</source>
			
			<!-- desitnation节点的scrop属性的可选值为 application、session和request,指定了远程对象实例作用域。
			如果作用域为request,那么服务器会为每一次请求都创建一个 远程Java对象实例,request是默认的作用域。
			如 果作用域是session,服务器则为每一个会话创建一个共享的 远程Java对象实例。通常来说,连接服务器的
			每一个浏览器实例构成了一个会话。例如,如果我们启动Firefox来访问连接Remote Service的Flex应用,启动的Firefox就是一个浏览器实例。
			在该Firefox浏览器中,如果打开其他标签页也访问同一Flex应用,那么 这些应用就处于同一会话中,共享同一远程对象实例。
			如果作用域是application,那么服务器则为每一个 Flex应用创建一个远程的Java对象实例。 -->
			<scope>session</scope>
			
			<!-- 限制远程Java对象可访问方法 -->
			<!-- 有 些时候,远程Java对象定义了许多公共方法,但是我们也许并不 希望这些方法都开放给Flex应用。
			在这种情况下,可以通过include-methods属性定义允许访问的方法列表,如果Flex应用试图访问该列表 外的方法就会导致异常,在客户端会调用fault事件。
			include- methods属性位于destination节 点的<properties></properties>内。-->
			 <include-methods>
                <method name="getInfo"/>
            </include-methods>
            <!-- 如 果只想限制对某几个公共方法的远程访问,使 用<exclude-methods></exclude-methods>属性会更加方便。
            
           	下面的配置设定了Flex客户端可以访问SayHello类中除了getInfo2方法之外的其他公共方法。-->
            <exclude-methods>
                <method name="getInfo2"/>
            </exclude-methods>
		</properties>
	</destination>
</service>

3.flex端访问

<?xml version="1.0" encoding="utf-8"?>
<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"
					   minWidth="600" minHeight="400">
	<fx:Script>
		<![CDATA[
			import mx.controls.Alert;
			import mx.rpc.events.FaultEvent;
			import mx.rpc.events.ResultEvent;
			private function sendHandler(event:Event):void{
				ro.getInfo(userName.text);//远程调用java类方法,ro为RemoteObject的id值
			}
			private function resultHandler(event:ResultEvent):void{
				var name:String=event.result as String;              
				Alert.show(name); 
			}
			private function faultHandler(event:FaultEvent):void{
				
			}
			/*
			var remoteObj:RemoteObject = new RemoteObject();
			remoteObj.destination = "SayHello";
			或
			var remoteObj:RemoteObject = new RemoteObject("SayHello");
			*/
		]]>	
	</fx:Script>
	<fx:Declarations>
		<s:RemoteObject id="ro" destination="SayHello">
			<!--<s:method>中name属性列出的是在远程对象中方法的名称,result属性是声明一个回调函数来处理结果值,
			该结果值在参数event中有封装-->
			<s:method name="getInfo" result="resultHandler(event)"/>
		</s:RemoteObject>
		
		<!--destination属性值为remoting-config.xml文件中配置的<destination>标签中的对象名(id值)-->
		<!--<s:RemoteObject id="ro" destination="SayHello" fault="faultHandler(event)"
						result="resultHandler(event)">
		</s:RemoteObject>-->
	</fx:Declarations>
	<s:Panel x="78" y="66" width="316" height="148"  title="RemoteObject sample">
		<s:Label x="10" y="19" text="entry your name"/>
		<s:TextInput x="110" y="17" id="userName"/>
		<s:Button x="200" y="58" label="submit" click="sendHandler(event)"/>
	</s:Panel> 
</s:Application>

补充:

使用RemoteObject组件最终访问的是远程Java对象公 开的公共方法。调用远程Java对象方法的最简单方式即直接调用方法名:

remoteObj.methodName(parm1,parm2,…);

在 MXML标签中,我们可以在用户事件中直接使用这种方式调用远程 服务。例如:<mx:Button label="发送" click="remoteObj.getInfo(‘xiaoming"’)"/>

通常,远程Java对象应该避免使用保留的方法名。然而,如果由于不可避免的原因你不得不这样做,例如你的远程Java对象开发者是个“disconnect”方法名的偏执狂,那么使用RemoteObject类的getOperation方法可以解决这个问题。

public function getOperation(name:String):Operation{}

例如,远程Java对象开放了公共方法toString(),我们 可以通过如下代码创建Operation对象来调用该方法:

public var remoteObj:RemoteObject = new RemoteObject();

remoteObj.destination = "SayHello";

//创建代表toString方法的操作对象

public var oper:Operation = remoteObj.getOperation("toString");

//调用该方法

oper.send();

使用mx.rpc.remoting.Operation类

mx.rpc.remoting.Operation 类专门用于为 RemoteObject类指定远程对象的操作。Operation 是服务上的单个方法,可以通过在服务上调用同名函数,即RemoteObject.operationName()的方式,或者在服务上访问作为属性的 Operation 并调用 send() 方法来调用 Operation,比如RemoteObject.operation.send()。

使用<s:method>标签

我们也可以使用<s:method>标签为 RemoteObject组件定义多个方法。

<s:method> 标签必须内嵌 在<s:RemoteObject></s:RemoteObject>标签对内,通过name属性指定匹配的远程Java 对象方法名称。开发者可以为每个method标签注册result和fault事件侦听器方法,来分别处理远程Java对象不同方法的响应或调用异常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值