2012-02-09 73 views
0

我一直在給一個應用程序來處理,它使用後端的Java EE應用程序,前端的Flash和BlazeDS來連接這兩個應用程序。我從來沒有使用Flash或BlazeDS,並且試圖讓我的頭腦知道BlazeDS是如何工作的。BlazeDS如何生成文件

到目前爲止,我瞭解到,當您在FlashBuilder中連接到BlazeDS時,將掃描remoting-config.xml文件以確定Java端存在哪些服務。 FlashBuilder詢問您想要導入哪些服務以及要使用的「服務包」和「數據類型包」。

當您選擇您的Java ExampleService時,BlazeDS將創建_Super_ExampleService.asExampleService.as並將它們放在您的「服務包」位置。 ExampleService.as爲空,但擴展爲_Super_ExampleService.as(它基本上是一個Flash服務,可用於調用Java服務中的方法)。如果您需要添加額外的方法,您可以將它們添加到ExampleService.as。 (希望這是完全正確的,請糾正我,如果我錯了)

我的問題是我無法弄清楚什麼BlazeDS的價值對象。

當您在FlashBuilder中選擇ExampleService(假設它是Example實體的服務)時,BlazeDS會創建什麼值對象?我期望Example.as_SuperExample.as。但是,也出現_ExampleEntityMetadata.as

我的問題基本上都是:

  1. 如何BlazeDS的確定要創建的值對象?它是否掃描數據庫,掃描項目的@Entity註釋,掃描一些配置文件,掃描服務以確定它使用什麼對象,等等?
  2. 這三個類的每一個都有什麼用途?它看起來像服務相同的設置(如果需要更改非 - 「超級」一個),但現在有第三個文件。
  3. 我注意到值對象並不總是直接對應於Java實體(具有附加屬性,缺少屬性等)。爲什麼是這樣?
  4. 如何將價值對象與服務結合使用?

我也有一些普遍問題:

  1. 當您連接到FlashBuilder服務,你實際上在做什麼?我第一次想象BlazeDS提供了必要的服務和價值對象。但是如果他們已經在那裏(說你已經連接,或者你拉下了代碼並且第一次連接)呢?連接是否僅在FlashBuilder副本中提供服務?
  2. 是否保證BlazeDS將始終以同樣的方式生成服務和值對象?像線一樣?

回答

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項目的Java通信知道你的web應用的位置(因此它可以知道在哪裏可以找到Java對象)。

在這一點上,你可以手動調用你的服務在MXML或ActionScript,像下面(假設我們在Java中的ExampleServiceremoting-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變成Java List/Map。並且Java List/Map變成閃存ArrayCollection/Object。因此,您可以使用「值對象」設計模式。基本上,你創建一個Flash對象來鏡像你的服務處理的Java對象。所以如果你有一個Example Java類,你可能會創建一個Flash類。您需要使用[RemoveClass(alias="my.package.Example")]等註釋Flash類。

但是,爲了使生活更輕鬆,您可以自動生成這些文件。 BlazeDS通過「遠程開發服務」(RDS)協議與Flash Builder進行通信。在您的web.xml文件中,您可以啓用RDSDispatchServlet。一旦啓用了RDS,就可以在Flash Builder中建立數據連接(數據>連接到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

本視頻的開頭介紹瞭如何生成服務和值對象:http://tv.adobe.com/watch/flex-in-a-week-day-2/generating-value-objects - 使用閃光建設者數據服務/ – 2012-02-13 18:44:15

3

這裏很少有混淆。 Blaze做的如下:

  1. 實現AMF格式(這是用於序列化Flash對象的本機Flash格式)。以便它知道如何編寫和讀取Flash對象。

  2. 實現了Flex框架所需的一些擴展功能(這實際上是一件壞事,因爲它寫得不好,你從不需要它,但這是一個完全不同的故事)。例如,它提供了一系列的類來模仿他們在Java中的Flex類似物,在Flex方面它模仿了地圖,樹等(甚至從未嘗試過使用它)。

  3. 創建將通過您的Web服務器(Tomcat的,JBoss的等)被加載和處理來自閃存傳入連接特殊處理程序(一個或多個)。這個處理程序在每個會話中實例化 - 無論在您的上下文中如何。這個處理程序也被稱爲FlexHandler(這是它通常出現在配置文件中的方式)。

大火沒有做什麼:

  1. 它不會生成源文件(沒有價值的對象源生成 - 你必須做你自己)。但它有一些常用的類型 - 所有數字類型,字符串,布爾值,一些集合等。

  2. 它不反映現有代碼,也未集成到Flash Builder中。 ,做它的程序被稱爲纖維,它是由Adobe(同一個源)提供的,但它是完全不同的東西,它是一種專利產品,它追求其它目標(它可以生成例如用於其他語言的代碼,那麼Java)。

纖維大多是實驗性產品,它在Flash Builder 4(大約一年前)中引入,它目前非常原始。基本上,它只是作爲說明,或概念證明是有用的,但它並沒有在現場進行了測試(和它的很難找到志願者:)

的remoting-config.xml中不是任何一個特殊的名字樣,然而,憑藉從複製很多很多的例子,這個名字被識別爲服務-config.xml文件(名稱,再次,有沒有特殊的含義,可以改變的一部分,但是,它通常被稱爲以這個名字)。這些文件具有雙重目的。編譯Flex應用程序時,Flex編譯器可以使用這些文件爲RemoteObject創建一些默認設置(您可能不希望這樣做,除非您確實對自己的工作有信心,但即使如此,你可能不想這樣做......)。另一方面,這些設置被FlexHandler使用(上面提到),以便知道Flash客戶端應該在哪裏連接。後者是一個特別困難的問題,因爲這是不可能在一個健全的方式來調試火焰代碼,這是很難找到確切的基本URL是什麼等等。幸運的是,你可以替換此胡言亂語:更多的東西自覺像<endpoint url="http://server-name/gateway"<endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/amf" (即無需搜索的server.nameserver.port的價值觀 - 這是真的很難找到,他們都躲在

通過光纖(EntityMetadata,_SuperXxx等)生成的類是由從長遠來看,。 ,有害這是一個嘗試,以反映Java代碼,並灌輸一些類似的邏輯爲AS3代碼唉,誰寫的人說沒有任何線索AS3如何工作 - 所以會發生什麼有純粹的瘋狂

。 210

有你如何翻譯Java值對象到Flash一定的規則:

  1. 在任何一方,你可以添加不上對方有更多的屬性。 Blaze不會填充它們(顯然),但屬性將存在並且可用。缺點是 - 你會在雙方都得到一堆rutnime錯誤(壓制)。爲了避免這種情況,在AS3方面,您可以將不需要的屬性標記爲[Transient]。但是,在你這樣做之前三思,這是設計不好的一個標誌。理想情況下,你不應該需要這個。我不知道Transient的Java模擬是什麼。

  2. 不能具有相同名稱的屬性,但不同類型的 - 不是抑制這種錯誤。

  3. 傳統布爾類型的Java屬性被命名爲isSomething - 布拉爲你將不得不破例,或者他們的名字(get|set)IsSomething如果你堅持......

值對象是由火焰產生在Java方面,當它調用那些意味着成爲服務處理程序的Java函數時。顯然,他們似乎是處理者的論據。值對象是由Flash播放器本身在Flash一側創建的 - 這會產生某些問題,例如 - 無法傳遞枚舉器 - 它將嘗試在AS3類上調用構造函數。不允許使用非默認的構造函數參數。

當您連接在Flash Builder維修 - 請不要這麼做。沒有人真正知道你到底在做什麼。該代碼是專有的,沒有關於功能凍結等的承諾。到今天爲止,對於那些可以編程的人來說,通過其他方式點擊鼠標來實際編寫程序代碼,而不是通過一步一步的嚮導方式來執行。

火焰只能在運行時生成的值對象 - 你幾乎可以肯定這一點。它是可以預測的,如果會發生重大變化,你一定會得到通知:) Blaze不會生成源代碼。

+0

它是如何,光纖和BlazeDS互通?這個問題基本上是從我們的過程開始的(我不能改變):1)從存儲庫中取出代碼(在我們的例子中是Subversion),2)運行Ant腳本來編譯等等,3)連接到BlazeDS。在第3步中,Subversion認識到服務和值對象文件已更改。我想弄清楚他們爲什麼改變了。 – 2012-02-09 19:38:46

+0

僅供參考,很多我的(也許是誤導的)信息來自http://sujitreddyg.wordpress.com/category/flex-and-blazeds/,這似乎表明BlazeDS提供服務。所以也許纖維交織在一起,作者沒有說明。 – 2012-02-09 19:41:39

+0

是的,就像我之前提到的鏈接一樣,我們的'web.xml'設置了一個'RDSDispatchServlet'。 – 2012-02-09 21:50:05