您好,欢迎来到吉趣旅游网。
搜索
您的当前位置:首页flex-java集成通信

flex-java集成通信

来源:吉趣旅游网
Flex-java 集成开发配置

一、引言 Flex访问远程服务都是通过AbstractService来实现的,其通常有3中具体的实现形式:HttpService、WebService和RemoteObject,应该来说RemoteObject是用起来最方便的一个。Flex提供的数据管理功能就是包装RemoteObject与后台服务进行数据交互的。

根据官方资料,RemoteObject在性 能和开发效率方面表现比较好。基于XML文本协议的数据封装方式如WebService/HTTPService在大用户并发情况及负载过重的情况下, RemoteObject采用的AMF(Actice Message Format,目前版本是AMF3)效率更高。AMF协议是一种给予HTTP的二进制协议,把中间层的业务对象(主要是商业数据对象)由Java序列化再反序列化为ActionScript对象。 二、RemoteObject使用过程有几个问题也比较麻烦。

1.编译、配置过程烦琐,例如常见的unknown destination问题就是由于编译或配置过程有误造成的。

2. 编写与Java对象对应的ActionScript对象也是一个比较烦琐的过程。可以归为重复性而且意义不大的工作。可以考虑由工具完成此项任务。想象一 下,对于一个面临需求变化且规模较大的项目,要维护ActionScript与对应Java对象的映射,确实不是件令人愉快的事情。 遇到的几个问题: 1.unknown destination

出错原因可能是flex编译器未制定service参数。

解决方法:在Flex Builder或安装FlexBuilder2插件的Eclipse环境中设置编译器参数,选中Flex项目右键,选中properties,再选择Flex Complier,在附加参数中增加相应参数及值。例如下面两个,黑体是修改前,红体字是修改后。 -locale en_US

-locale en_US -context-root=/flex -services=\"C:\\Program Files\\Apache Software Foundation\\Tomcat

5.0\\webapps\\flex\\WEB-INF\\flex\\services-config.xml\"

2.could't invoke XXX method(例如调用具体RO的GetQuote,误写成getQuote) 原因大概是由于具体RO的函数名写错了,由于MXML语言大量使用参数注释型的方式指定对象属性,导致在引号之内的标记无法被编译器识别,问题被延迟到Run-time时刻发现。

3.Send failed

原因是service-config.xml中的channels定义my-amf的{context.root}在Flex Builder编译器参数中未指定其context-root,导致编译的swf文件可能有误; 解决方法同1

4.Ljava.lang.NoSuchMethodError...

原 因是RO对应的Java代码中可能出现调用不存在的方法。例如某个RO对应Java类Ticker在其函数中GetQuote中new一个 StockQuote实例StockQuote x = new StockQuote(param1,param2),但StockQuote类只有一个空参数的构造函数,因此NoSuchMethodError错误 被传递到Flex调用RO的客户端。为什么会出现Ticker引用不存在的StockQuote构造函数,原因是没有及时同步代码。比如, StockQuote代码修改了,删除了带参数的构造函数,而依赖此类的Ticker没有及时修正。

5.ReferenceError: Error #1056: 无法为 a 创建属性 b

这是一个奇怪的问题,所有同步Java对象类的ActionScript类,即通过

metadata关键字RemoteClass指定的类。对应Java类的属性名称不能以大写字母开头。

三、RemoteObject使用方法

1、定义RemoteObject 的集中方法(采用极端发讲述) (1)概要配置

客户端(flex):

通过ActionScript带代码创建RemoteObject对象 Var remoteObj:RemoteObject=new RemoteObject(); remoteObj.destination=”beanName”; //获取指定类对象beanName

public var oper:Operation=remoteObj.getOperation(“methodName”); //获取方法对象methodName

oper.addEventListener(ResultEvent.RESULT,result);

//正常结果处理result

oper.addEventListener(FaultEvent.FAULT, fault); //异常处理fault oper.send();//调用方法

服务端(java):

remote-config.xml配置

id=”remoting-service” class=”flex.messaging.services.RemotingService”>

Class=”flex.messaging.services.remoting.adapters.JavaAdapter” Default=”true” />

2、详细配置

客户端(flex): Import mx.rpc.events.FaultEvent; Import mx.rpc.events.ResultEvent;

//RemoteObject对象result事件方法

Private function RespondHandler(event:ResultEvent):void{ //处理远程服务响应 }

//RemoteObject对象fault事件侦听器方法

Private function roErrorHandler(event:FaultEvent):void{ //处理远程调试异常 } ]]>

RemoteObject调用异步方式调用远程Java对象。在调用操作后,Flex应用并不停止执行其他操作来等待响应,而是允许用户继续交互,执行其他操作。当响应返回时,或者抛出异常时,系统调度result事件或者fault事件来通知应用,以执行事件侦听器方法.也就是说,我们通过侦听RemoteObject组件的result和fault事件处理响应和异常。这种方式与处理远程http服务和web服务响应的方式如出一辙。

当RemoteObject调用远程方法成功时,系统会调度result事件。开发者可以使用result事件生成的mx.rpc.events.ResultEvent对象访问服务响应数据。

Id属性指定了RemoteObject组件实例名称,在接下来调用该服务对象及处理远程服务响应时使用。Destination属性指定了要连接的远程服务的目标。请求时该值必须与服务器remote-config.xml文件中配置的目标id属性相匹配。

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

标签对中,可以嵌入标签指定传递给远程方法的参数。

标签对中,可以嵌入标签指定传

递给远程方法的参数。Flex不要求使用与远程Java对象方法参数名称完全相同的名字来定义标签。但是,当调用多参的远程方法时,必须保证标签指定的参数顺序与远程方法中的参数顺序相匹配。

服务端(java)配置:

id=”remoting-service” class=”flex.messaging.services.RemotingService”>

Class=”flex.messaging.services.remoting.adapters.JavaAdapter” Default=”true” />

Destination节点的source属性说明了远程对象服务的目标,也就是远程Java对象。在设定source属性时,必须使用全路径java类名称来指向部署在LiveCycle Data Service类路径中的java类。

Desitination节点的scope属性的可选值为application、session和request,指定了远程对象实例作用域。

如果作用域为request,那么服务器会为每一次请求都创建一个远程Java对象实例,request是默认的作用域。

如果作用域是session,服务器则为每一个回话创建一个共享的远程Java对象实例。通常来说,连接服务器的每一个浏览器实例构成了一个会话。例如,如果我们启动Firefox来访问连接LiveCycle Data Service 的Flex应用,启动的firefox就是一个浏览器实例。在该firefox浏览器中,如果打开其他标签页也会访问同一Flex应用,那么这些应用就处于同一会话中,共享同一远程对象实例。

如果作用域是application,那么服务器则为每一个Flex应用创建一个远程的java对象实例。

有些时候,远程Java对象定义了许多公共方法,但是我们也许并不 希望这些方法都开放给Flex应用。在这种情况下,可以通过include-methods属性定义允许访问的方法列表,如果Flex应用试图访问该列表 外的方法就会导致异常,在客户端会调用fault事件。

include-methods属性位于destination节 点的内。

exclude-methods和include-methods作用相反。

100

2

true

class=\"flex.messaging.services.http.HTTPProxyAdapter\" default=\"true\"/>

id=\"http-proxy\"

flexFactory flexService application

url=\"http://{server.name}:{server.port}/{context.root}/messagebroker/amf\" class=\"flex.messaging.endpoints.AMFEndpoint\"/>

[BlazeDS]

false false false

false

Endpoint.* Service.* Configuration

false

Web.xml 添加

flex.messaging.HttpFlexSession

添加servlet过滤请求:

messageBroker

flex.messaging.MessageBrokerServlet

services.configuration.file

/WEB-INF/flex/services-config.xml

0

messageBroker /messagebroker/*

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- jqkq.cn 版权所有 赣ICP备2024042794号-4

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务