zoukankan      html  css  js  c++  java
  • Flex远程调用机制RemoteObject应用技巧

    转自:http://zerozone.javaeye.com/blog/60846
    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 FilesApache Software FoundationTomcat 5.0webappsflexWEB-INFflexservices-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.   
    4.     public StockQuote(){}  
    5.   
    6.     public String getCompany(){  
    7.         return Company;  
    8.      }  
    9.   
    10.     public void setCompany(String company){  
    11.         this.Company = company;  
    12.      }  
    13.   
    14.     public double getPrice(){  
    15.         return price;  
    16.      }  
    17.   
    18.     public void setPrice(double price){  
    19.         this.price = price;  
    20.      }  
    21.   
    22.     private String Company;  
    23.     private double price;  
    24. }  


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

    java 代码

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


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

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

  • 相关阅读:
    mysql代码实现hive中的rank()排序方法,获得top3中的最小值
    MySQL--Hive中字段数据类型对比
    使用shell脚本连接mysql shell脚本执行mysql语句
    WPS中查看超链接后返回超链接位置
    shell脚本中常用的命令
    Lamda一行代码实现"36选7"随机自动选号
    创建Visual studio项目模板 vstemplate关键点纪要
    网络传输及数据解析
    动画
    触摸事件与手势识别
  • 原文地址:https://www.cnblogs.com/yaowen/p/4141686.html
Copyright © 2011-2022 走看看