首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BlazeDS如何生成文件

BlazeDS如何生成文件
EN

Stack Overflow用户
提问于 2012-02-09 17:44:19
回答 2查看 664关注 0票数 0

我给出了一个应用程序,它使用Java应用程序作为后端,使用Flash作为前端,使用BlazeDS连接这两个应用程序。我从来没有使用过闪存或BlazeDS,我正试图弄清楚BlazeDS是如何工作的。

到目前为止,我了解到,当您在FlashBuilder中连接到FlashBuilder时,将扫描remoting-config.xml文件,以确定Java上存在哪些服务。FlashBuilder询问要导入哪些服务,以及要使用什么“服务包”和“数据类型包”。

当您选择您的Java ExampleService时,BlazeDS将创建_Super_ExampleService.asExampleService.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也出现了。

我的问题基本上是:

  1. BlazeDS如何确定要创建哪些值对象?它是否扫描DB、扫描项目中的@实体注释、扫描某些配置文件、扫描服务以确定它使用的对象等等?
  2. 这三个班中的每一个都有什么用途?它看起来与服务的设置相同(如果需要,可以更改非“_Super”文件),但是现在有了第三个文件。
  3. 我注意到值对象并不总是直接对应于Java实体(有其他属性、缺少属性等等)。为什么会这样呢?
  4. 如何将值对象与服务结合使用?

我也有一些一般性的问题:

  1. 当您连接到FlashBuilder中的服务时,您实际上在做什么?第一次,我想象BlazeDS制造了必要的服务和值对象。但是,如果它们已经存在(假设您已经连接了,或者您第一次删除了代码并连接)呢?连接只会使FlashBuilder副本中的服务可用吗?
  2. 是否保证BlazeDS总是以相同的方式生成服务和值对象?就像一条条线?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-13 18:29:30

最后,我只是买了一个亚马逊上的Kindle书籍并阅读了其中的一些章节(特别是第26章)。以下是我学到的基本知识:

  • 随着时间的推移,Adobe产品不断发展和分离,直到建立了"LifeCycle数据服务“(LCDS)。该技术位于服务器上,提供各种功能。
  • Adobe发布了"BlazeDS“作为LCDS的免费版本(功能更少)。
  • 我使用的BlazeDS特性是“远程处理服务”(还有“消息服务”和“代理服务”)。远程处理服务允许您从Flash前端调用Java服务方法。数据通过名为“”(AMF)的二进制格式在Flash和Java之间传递。
  • 摘要 BlazeDS位于服务器上,允许Flash和BlazeDS通过AMF进行通信。

为了能够在Flash中调用Java方法,执行以下操作(注意:我假定了默认命名):

  • 创建一个普通的Java (一些限制:需要一个默认的构造函数,方法必须是公共的,等等)。
  • remoting-config.xml中,为服务添加一个目的地。您会注意到有一个名为my-amf的频道。如果您查看services-config.xml,您将看到相应的通道定义,它使用AMF并指向正在运行的应用程序(使用动态表达式)。
  • 在配置Flash项目时,可以提供web应用程序的位置,以便它知道应该将请求发送到哪里。
  • 摘要您可以通过创建Java服务、在remoting-config.xml中配置它并让您的remoting-config.xml项目知道您的webapp位置(这样它就可以知道在哪里查找Java对象)来允许Java通信。

此时,您可以在MXML或ActionScript中手动调用服务,如下所示(假设Java中的ExampleService映射为remoting-config.xml中的exampleService )。

代码语言:javascript
复制
//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.

票数 0
EN

Stack Overflow用户

发布于 2012-02-09 19:04:33

这里很少有混乱。烈火所做的事情如下:

  1. 实现AMF格式(这是用于序列化Flash对象的本机Flash格式)。这样它就知道如何写和读取Flash对象了。
  2. 实现Flex框架所需的扩展功能(这实际上是一件坏事,因为它编写得很糟糕,而且您永远不需要它,但这是一个完全不同的故事)。例如,它提供了一系列类来在Java中模拟它们的Flex类似物,而在Flex方面,它模拟映射、树等(甚至从未尝试使用它)。
  3. 创建一个特殊的处理程序,由您的web服务器(Tomcat、JBoss等)加载并处理来自Flash的传入连接。每个会话都实例化这个处理程序--不管这在您的上下文中意味着什么。这个处理程序也称为FlexHandler (这是它通常出现在配置文件中的方式)。

火不起作用:

  1. 它不生成源文件(不生成值对象源--您必须自己完成)。然而,它有一些常用的类型--所有数字类型、字符串、布尔值、一些集合等等。
  2. 它不考虑现有代码,也没有集成到Flash中。这样做的程序叫做光纤,它是由Adobe (相同的源代码)提供的,但是它是完全不同的东西,它是一种专有产品,它追求其他目标(它可以为其他语言生成代码,例如Java )。

光纤主要是一个实验产品,它是在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.nameserver.port的值--实际上很难找到它们隐藏的位置)。

从长远来看,由光纤(EntityMetadata、_SuperXxx等)生成的类是有害的。这是一种对Java代码的反思,并将一些类似的逻辑注入到AS3代码中。唉,那些写文章的人根本不知道AS3是如何工作的,所以那里发生的一切都是纯粹的疯狂。

在如何将Java值对象转换为Flash时,有一些规则:

  1. 在任何一方,您都可以添加更多不存在于另一边的属性。Blaze不会填充它们(很明显),但是这些属性将会存在,并且是可用的。缺点是-你会得到一堆规则的错误(抑制)在双方。为了避免这种情况,在AS3端您可以将不需要的属性标记为[Transient]。但是,在你这么做之前要三思--这是一个糟糕设计的迹象。理想情况下,你不应该需要这个。我不知道Java的瞬态模拟是什么。
  2. 您不能拥有相同名称的属性,但类型不同--这类错误不会被抑制。
  3. 传统上,对于Java来说,布尔类型的属性被命名为isSomething --对于Blaze,您必须做一个例外,或者如果您坚持要给它们命名为(get|set)IsSomething .

当Java调用作为服务处理程序的Java函数时,值对象是由Java侧的Blaze创建的。显然,它们显示为处理程序的参数。值对象是由Flash本身在Flash上创建的--这会产生某些问题,例如--无法传递枚举器--无论如何它都会尝试调用AS3类上的构造函数。不允许使用非默认构造函数参数。

当您连接到中的服务时,请不要这样做。没有人真正知道你到底在做什么。该代码是专有的,没有关于特性冻结等方面的承诺。到今天为止,对于那些可以编程的人来说,通过鼠标点击其他方式编写程序代码要容易得多,而不是用一步一步的向导方式来编写。

Blaze只在运行时生成值对象--几乎可以肯定这一点。这是可以预测的,如果会发生重大变化,您肯定会得到通知:) Blaze不会生成源代码。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9215974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档