打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Flex远程调用机制RemoteObject应用技巧

本文主要讨论Flex在客户端与J2EE中间层数据交互的过程。

Flex是构建RIA应用的客户端技术。它的优势在于提供了丰富的客户 端表现能力(例如增强UI组件、缓存、拖放、收缩/展开等),避免了基于HTML技术的缺陷;同时无缝地结合了J2EE技术在中间层(业务逻辑层)的强大优势。

尽 管MacroMedia提出的"体验经济"有宣传策略的成分,但RIA、Ajax的流行还是说明富客户端技术有市场需求。正如J2EE平台架构一样,任何 技术都不是完美的。每个新技术的出现都是为了解决特定的问题。J2EE构建Web应用已经很成熟,已经有很多好的实践,不过受J2EE自身的限制,它在展 现富客户端方面能力有限(JSF的出现也许会解决这个问题)。

基 于RPC的HTTPService、WebService和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类的属性名称不能以大写字母开头。

例如,StockQuote类在java
java 代码
  1. package com.stockquote;
  2. public class StockQuote {
  3. public StockQuote(){}
  4. public String getCompany(){
  5. return Company;
  6. }
  7. public void setCompany(String company){
  8. this.Company = company;
  9. }
  10. public double getPrice(){
  11. return price;
  12. }
  13. public void setPrice(double price){
  14. this.price = price;
  15. }
  16. private String Company;
  17. private double price;
  18. }


在ActionScrpit中,Company和price必须以小写开头,否则会出错,即无法在Flex调用端反序列该字段。

java 代码
  1. package com.stockquote{
  2. [Bindable]
  3. [RemoteClass(alias="com.stockquote.StockQuote")]
  4. public class StockQuote{
  5. function StockQuote () {
  6. // Constructor code if needed
  7. trace(this);
  8. }
  9. public function getCompany():String{
  10. return Company;
  11. }
  12. public function setCompany(company:String ):void{
  13. this.Company = company;
  14. }
  15. public function getPrice():Number{
  16. return price;
  17. }
  18. public function setPrice(price:Number):void{
  19. this.price = price;
  20. }
  21. public var Company:String;
  22. public var price:Number;
  23. }
  24. }

如上代码,会导致以下错误。

ReferenceError: Error #1056: 无法为 com.stockquote.StockQuote 创建属性 company。

Flex开发中最重要的内容之一,就是与服务器和数据库的通信。而这样的通信方式我所知道的大概有七种,其中Blazeds与LCDS可以归结成一种。如果要实现Flex与客户端应用程序之间的通信,我想主要用到的方法为:Socket通信。而在Web方面,Flex提供了3个类实现与服务器端的通信:HTTPService,ReObject和WebService。另外,我们还可以根据外部中间插件来让Flex与服务器端进行通信,我所了解的有Blazeds(Lcds),Red5(FMS)流媒体服务器,PHPRPC。



◆HTTPService类用于超文本传输协议(HTTP)实现与服务器的通信。Flex应用程序用GET或POST请求将数据发送到服务端,并处理该请求所返回的XML或字符串。使用这个HTTPService类,可以与PHP页,ColdFusion页,JSP页,Javaservlet,RubyonRails,以及MicrosoftASP页进行通信。



◆RemoteObject类可以与服务器之间通过ActionScriptMessageFormat(AMF)对象进行通信。通常来说,我们也可以把Blazeds与Lcds归于这一类。RemoteObject也可以与java或coldFusion远程网关进行通信,或者通过开源项目(例如AMFPHP.SabreAMF或WebORB)与.NET和PHP进行通信。



◆WebService类与web服务进行通信,使用基于SOAP的XML或XML,web服务通过web服务描述语言(WSDL)定义其接口。



◆Socket类可以实现直接与应用程序进行通信,而不必在Web的基础上,通信的方法与JAVA或.NET之间进行Socket的方法大致上是一样的,具体的,将在下面的章节中介绍。

关于Red5与FMS这两个流媒体服务器,应该说它们本身的优势在于多多媒体上,而实现Flex与服务器端相连,也是它们最基本的功能之一。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
flex与java通过RemoteObject通信例子_Java_Blog.knowsky...
InfoQ: 使用BlazeDS和AMF构建Web和桌面应用
Flex RemoteObject 简单应用Demo
InfoQ: Spring BlazeDS Integration简介与入门
Flex 如何使用JAVA对象连接SQLServer数据库
flex与java间用json传输数据
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服