BlazeDS如何生成文件

时间:2012-02-09 17:44:20

标签: flash blazeds

我一直在提供一个应用程序,它使用后端的Java EE应用程序,前端的Flash,以及连接两者的BlazeDS。我从未使用过Flash或BlazeDS,并试图了解BlazeDS的工作原理。

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

当您选择Java ExampleService时,BlazeDS将创建_Super_ExampleService.asExampleService.as并将其放入“服务包”位置。 ExampleService.as为空,但扩展为_Super_ExampleService.as(基本上是一个可用于调用Java服务中的方法的Flash服务)。如果您需要添加额外的方法,可以将它们添加到ExampleService.as。 (希望这一切都是正确的,如果我错了,请纠正我)

我的问题是我无法弄清楚BlazeDS对值对象的作用。

当您在FlashBuilder中选择ExampleService时(让我们假设它是Example实体的服务),BlazeDS会创建哪些值对象?我希望Example.as_SuperExample.as。但是,_ExampleEntityMetadata.as也会出现。

我的问题基本上是:

  1. BlazeDS如何确定要创建的值对象?它是否扫描数据库,扫描项目以获取@Entity注释,扫描一些配置文件,扫描服务以确定它使用的对象等?
  2. 这三个课程的目的是什么?看起来与服务的设置相同(如果需要,更改非“_超级”),但现在有第3个文件。
  3. 我注意到值对象并不总是直接对应于Java实体(具有其他属性,缺少属性等)。这是为什么?
  4. 如何将价值对象与服务结合使用?
  5. 我也有一些一般性问题:

    1. 当您连接到FlashBuilder中的服务时,您实际在做什么?我第一次想象BlazeDS会提供必要的服务和价值对象。但是,如果他们已经在那里(比如你已经连接,或者你第一次拔下代码并连接)怎么办?连接是否仅在您的FlashBuilder副本中提供服务?
    2. 是否保证BlazeDS将始终以相同的方式生成服务和值对象?喜欢直线?

2 个答案:

答案 0 :(得分:3)

这里很少有混淆。 Blaze的作用如下:

  1. 实现AMF格式(这是用于序列化Flash对象的本机Flash格式)。因此它知道如何编写和读取Flash对象。

  2. 实现Flex框架所需的一些扩展功能(这实际上是一件坏事,因为它编写得很糟糕,你永远不需要它,但那是一个完全独立的故事)。例如,它提供了一系列类来模仿他们在Java中的Flex类似物,在Flex方面它模仿地图,树等等(甚至从未尝试使用它)。

  3. 创建一个特殊的处理程序,它将由您的Web服务器(Tomcat,JBoss等)加载并处理来自Flash的传入连接。每个会话实例化此处理程序 - 无论在您的上下文中是什么意思。此处理程序也称为FlexHandler(这通常出现在配置文件中)。

  4. Blaze不会做什么:

    1. 它不会生成源文件(不会生成任何值对象源 - 您必须自己完成)。但是它有一些常用的类型 - 所有数字类型,字符串,布尔值,一些集合等。

    2. 它没有反映现有代码,也没有集成到Flash Builder中。执行它的程序称为Fiber,它由Adobe(同一来源)提供,但它是完全不同的东西,它是一个专有产品,它追求其他目标(例如,它可以生成除Java以外的语言的代码)。

    3. Fiber主要是一种实验性产品,它是在Flash Builder 4中引入的(大约一年前),它目前非常原始。基本上它只是用作插图或概念证明,但它还没有在现场进行测试(并且很难找到志愿者:)。

      remoting-config.xml不是任何类型的特殊名称,但是,通过许多复制的示例,该名称可被识别为services-config.xml的一部分(名称,再次,没有特殊意义,可以改变,但是,这个名称通常都是指这个名称)。这些文件有双重用途。编译Flex应用程序时,Flex编译器可以使用这些文件为RemoteObject创建一些默认设置(您可能不希望这样做,除非您对您正在做的事情非常有信心,但是即便如此,你也不会想那样做......)。另一方面,FlexHandler(如上所述)使用这些设置以了解Flash客户端应该在何处连接。后者是一个特别困难的主题,因为无法以理智的方式调试Blaze代码,并且很难发现究竟什么是基本URL等等。幸运的是,你可以替换这个abracadabra :<endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/amf"有一些更有意识的事情,比如<endpoint url="http://server-name/gateway"(即无需搜索server.nameserver.port的值 - 确实很难找到隐藏的位置。

      从长远来看,Fiber(EntityMetadata,_SuperXxx等)生成的类是有害的。它试图反思Java代码并将一些类似的逻辑灌输到AS3代码中。唉,写这篇文章的人不知道AS3是如何工作的 - 所以那里发生的是纯粹的疯狂。

      将Java值对象转换为Flash的方法有一些规则:

      1. 在任何一方,您都可以添加更多不存在于另一方的属性。 Blaze不会填充它们(显然),但是这些属性将存在并将可用。缺点是 - 你会在双方得到一堆rutnime错误(被压制)。为了避免这种情况,在AS3端,您可以将不需要的属性标记为[Transient]。但是,在你这样做之前要三思而后行 - 这是设计糟糕的表现。理想情况下,你不应该这样做。我不知道Transient的Java模拟是什么。

      2. 您不能拥有同名但属性不同的属性 - 不会抑制此类错误。

      3. 传统上,布尔类型的Java属性名为isSomething - 对于Blaze,您必须提出异常,或者如果您坚持要将它们命名为(get|set)IsSomething ......

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

        当您在Flash Builder中连接到服务时 - 请不要这样做。没有人真正知道你究竟在做什么。代码是专有的,并且没有关于功能冻结等的承诺。截至今天,对于那些可以通过鼠标点击之外的方式编程实际编写程序代码而不是逐步向导方式进行编程的人来说要容易得多。

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

答案 1 :(得分:0)

我最后只是购买Kindle book on Amazon并阅读了一些章节(特别是第26章)。这基本上就是我学到的东西:

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

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

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

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

//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变为Java List / Map。并且Java List / Map变成了Flash ArrayCollection / Object。因此,您可以使用“值对象”设计模式。基本上,您创建一个Flash对象,该对象镜像您的服务处理的Java对象。因此,如果您有一个Example Java类,则可能会创建一个ExampleVO Flash类。您需要使用[RemoveClass(alias="my.package.Example")]等注释Flash类

为了让生活更轻松,您可以自动生成这些文件。 BlazeDS通过“远程开发服务”(RDS)协议与Flash Builder进行通信。在web.xml文件中,您可以启用RDSDispatchServlet。启用RDS后,您可以在Flash Builder中建立数据连接(数据&gt;连接到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.