我给出了一个应用程序,它使用Java应用程序作为后端,使用Flash作为前端,使用BlazeDS连接这两个应用程序。我从来没有使用过闪存或BlazeDS,我正试图弄清楚BlazeDS是如何工作的。
到目前为止,我了解到,当您在FlashBuilder中连接到FlashBuilder时,将扫描remoting-config.xml文件,以确定Java上存在哪些服务。FlashBuilder询问要导入哪些服务,以及要使用什么“服务包”和“数据类型包”。
当您选择您的Java ExampleService时,BlazeDS将创建_Super_ExampleService.as和ExampleService.as,并将它们放在您的“服务包”位置。ExampleService.as是空的,但是扩展了_Super_ExampleService.as (基本上是一个_Super_ExampleService.as服务,您可以使用它来调用_Super_ExampleService.as服务中的方法)。如果需要添加额外的方法,可以将它们添加到ExampleService.as中。(希望这一切都是正确的,如果我错了,请纠正我)
我的问题是,我不知道BlazeDS对值对象做了什么。
当您在ExampleService中选择FlashBuilder (假设它是Example实体的服务)时,BlazeDS创建了哪些值对象?我希望Example.as和_SuperExample.as。然而,_ExampleEntityMetadata.as也出现了。
我的问题基本上是:
我也有一些一般性的问题:
发布于 2012-02-13 18:29:30
最后,我只是买了一个亚马逊上的Kindle书籍并阅读了其中的一些章节(特别是第26章)。以下是我学到的基本知识:
为了能够在Flash中调用Java方法,执行以下操作(注意:我假定了默认命名):
remoting-config.xml中,为服务添加一个目的地。您会注意到有一个名为my-amf的频道。如果您查看services-config.xml,您将看到相应的通道定义,它使用AMF并指向正在运行的应用程序(使用动态表达式)。remoting-config.xml中配置它并让您的remoting-config.xml项目知道您的webapp位置(这样它就可以知道在哪里查找Java对象)来允许Java通信。此时,您可以在MXML或ActionScript中手动调用服务,如下所示(假设Java中的ExampleService映射为remoting-config.xml中的exampleService )。
//MXML
<s:RemoteObject id="myExampleService" destination="exampleService" />
<s:Button label="Call a Method" click="myExampleService.myMethod()" />
//ActionScript
var myExampleService:RemoteObject = new RemoteObject("exampleService");
myExampelService.myMethod();*注:关于上述(和类似的事情)还有很多需要学习的地方,比如处理结果等等。但是我不想谈这个。
现在,为了连接到在Flash和Java之间传递数据,它变成了序列化。从Flash类型到Java类型的转换并不完美。例如,一个Flash Array会变成一个JavaList/Map。而一个Java List/Map变成了FlashArrayCollection/Object。因此,您可以使用"value object“设计模式。基本上,您创建了一个Flash对象,它反映了您的服务所处理的Java对象。因此,如果您有一个Example类,您可能会创建一个ExampleVO类。您需要用[RemoveClass(alias="my.package.Example")]对Flash进行注释,等等。
然而,为了使生活更容易,您可以自动生成这些文件。BlazeDS通过“远程开发服务”协议与Flash通信。在web.xml文件中,可以启用RDSDispatchServlet。启用RDS后,您可以在Flash (数据>连接到BlazeDS)中建立数据连接。
作为对这个问题的回答,这本书说:
By default, if a Java class's public method returns an instance of a strongly typed value object class, the connection wizard creates a matching ActionScript value object class. The conversion of the server-side data to ActionScript value object happens at runtime and is managed by the generated code.
发布于 2012-02-09 19:04:33
这里很少有混乱。烈火所做的事情如下:
火不起作用:
光纤主要是一个实验产品,它是在Flash 4中引入的(大约一年前),目前它是非常原始的。基本上,它只是作为一个例子,或概念的证明,但它还没有在实地测试(很难找到志愿者:)
remoting-config.xml不是任何类型的特殊名称,但是,通过一个大量复制的示例,名称可以识别为services-config.xml的一部分(同样,名称没有特殊的含义,可以更改,但是,这个名称通常由这个名称引用)。这些文件有双重用途。在编译Flex应用程序时,Flex编译器可以使用这些文件来为RemoteObject创建一些默认设置(您可能不想这样做,除非您对自己正在做的事情很有信心,但即使这样,您也可能不希望这样做……)。另一方面,这些设置被FlexHandler (上面提到)使用,以便知道应该在哪里连接Flash。后者是一个特别困难的主题,因为它不可能以一种正常的方式调试烈焰代码,而且很难发现基本的URL到底是什么等等。幸运的是,您可以将这个abracadabra:<endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/amf"替换为更有意识的东西,比如<endpoint url="http://server-name/gateway" (即不需要搜索server.name和server.port的值--实际上很难找到它们隐藏的位置)。
从长远来看,由光纤(EntityMetadata、_SuperXxx等)生成的类是有害的。这是一种对Java代码的反思,并将一些类似的逻辑注入到AS3代码中。唉,那些写文章的人根本不知道AS3是如何工作的,所以那里发生的一切都是纯粹的疯狂。
在如何将Java值对象转换为Flash时,有一些规则:
[Transient]。但是,在你这么做之前要三思--这是一个糟糕设计的迹象。理想情况下,你不应该需要这个。我不知道Java的瞬态模拟是什么。isSomething --对于Blaze,您必须做一个例外,或者如果您坚持要给它们命名为(get|set)IsSomething .当Java调用作为服务处理程序的Java函数时,值对象是由Java侧的Blaze创建的。显然,它们显示为处理程序的参数。值对象是由Flash本身在Flash上创建的--这会产生某些问题,例如--无法传递枚举器--无论如何它都会尝试调用AS3类上的构造函数。不允许使用非默认构造函数参数。
当您连接到中的服务时,请不要这样做。没有人真正知道你到底在做什么。该代码是专有的,没有关于特性冻结等方面的承诺。到今天为止,对于那些可以编程的人来说,通过鼠标点击其他方式编写程序代码要容易得多,而不是用一步一步的向导方式来编写。
Blaze只在运行时生成值对象--几乎可以肯定这一点。这是可以预测的,如果会发生重大变化,您肯定会得到通知:) Blaze不会生成源代码。
https://stackoverflow.com/questions/9215974
复制相似问题