一、引言 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配置
2、详细配置
客户端(flex): //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对象访问服务响应数据。
mx:method> mx:RemoteObject> Id属性指定了RemoteObject组件实例名称,在接下来调用该服务对象及处理远程服务响应时使用。Destination属性指定了要连接的远程服务的目标。请求时该值必须与服务器remote-config.xml文件中配置的目标id属性相匹配。 我们也可以使用 在 在 递给远程方法的参数。Flex不要求使用与远程Java对象方法参数名称完全相同的名字来定义 服务端(java)配置: 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作用相反。 id=\"http-proxy\" Web.xml 添加 添加servlet过滤请求: 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- jqkq.cn 版权所有 赣ICP备2024042794号-4
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务