使用BlazeDS和AMF構建Web和桌面應用

作者 James Ward and Shashank Tiwari 譯者 沙曉蘭 發佈於 2008年7月22日 下午1時8分

原文地址:http://www.infoq.com/cn/articles/blazeds-intro

 

無 論是採用Adobe AIR技術的桌面應用程序 ,還是結合Flash Player使用瀏覽器的應用,在需要加載或處理數據的時候往往都需要連接到服務器。在採用Adobe Flex或Flash CS3來開發應用程序的過程中,應用程序與服務器間交互的實現方式有很多選擇。服務器本身除了可以運行Java、ColdFusion、.Net、 PHP、Ruby等某種服務器端技術之外,還必須具備網絡通信的能力,這爲Flash Player中運行的應用或Adobe AIR應用的客戶端與服務器端間的交互奠定了基礎。通常,兩者間的通信採用的是HTTP協議-- 也就是web瀏覽器加載web頁面和應用時所採用的協議。但是,HTTP協議下采用不同的數據傳輸方式會帶來應用性能和開發效率的天壤之別。

很多在Abode AIR或Flash Player中運行的應用都採用XML-over-HTTP技術(比如SOAP、REST等)在客戶端和服務器之間傳輸數據。這個方法很簡單,也很容易搭 建。無論是哪種服務器端技術都很容易應用XML,因爲XML完全是一個基於文本的協議。在必須實現透明協議的時候,XML是完美的選擇。比 如,Flickr的web服務在HTTP傳輸之上採用的就是REST風格的XML。這樣一來,無論是誰採用哪種技術都可以簡單地通過向Flickr發送簡 單的基於文本的請求來與Flickr交互。Flickr的回覆是簡單的XML,開發者可以輕鬆地解析這個XML回覆,使用其中的數據。像XML這樣基於文 本的協議的缺點是額外的數據抽象層的編寫與維護工作相對很沉重。此外,如果數據需要序列化和反序列化,那麼這個數據抽象層在客戶端和服務器端都會佔用很多 資源(參見圖1)。

圖1. AMF減少封送處理的數據層

Flash Player可以支持另外一種傳輸協議,這個協議能夠緩解由基於文本的協議導致的傳輸瓶頸問題,能夠幫助開發者以更簡單的方式與服務器交互。這就是 AMF(Action Message Format)。它是一個二進制格式的協議,能夠替代用於傳輸XML的基於文本的協議而在HTTP協議之上交換數據。採用AMF的應用中,數據抽象層完全 可以省去,客戶與服務器間的通訊效率比傳統的應用基於文本的協議傳輸要高得多。Census RIA Benchmark應用程序 可以證明AMF帶來的性能優勢。

過去幾年裏,大量旨在提供AMF實現的開源項目蜂擁而至,這些項目與Macromedia之前一個叫做Flash Remoting的產品很相似。由於這些開源項目,無論是PHP、Java還是其它技術的開發人員都得以能夠在他們的應用中採用AMF。Flex 1.0版本發佈的時候,就涵蓋了AMF相關功能。Flex發佈版本2的時候同時包含了XML和AMF的相關功能,但服務器端的AMF相關功能卻特別轉移到 Flex Data Services這個新產品中。Flex Data Services在集成到Live Cycle產品系列中的時候又被重新命名爲LiveCycle Data Services。針對單個CPU服務器的LiveCycle Data Services ES Express是免費的,但針對擁有多個CPU服務器的產品則收費很高,這使得一些開發者在選擇AMF的時候望而卻步,其中一些人也因此乾脆轉而選擇一些 非標準的AMF實現。

2007年十二月,Adobe做出了兩個巨大的決策,讓所有人都能夠使用AMF。第一個決定是公開AMF規範。規範公佈以後,所有項目都能按照規範 來實現 AMF,而不用再對協議做反向工程。無論back-end採用的是Java、ColdFusion、PHP、.Net、Ruby還是其它技術,AMF的實 現都只需要遵守規範即可。另一個決策是以BlazeDS項目的方式開源LiveCycle Data Services ES中的部分技術。

BlazeDS中包含了AMF的Java實現,可以用來與服務器端的Java對象遠程交互,也可以用來在客戶端之間傳遞消息。開發人員可以藉助 BlazeDS的遠程技術簡單地調用POJO、Spring服務或EJB方法。開發人員可以通過其消息系統從客戶端向服務器端發送消息,當然也可應從服務 器端向客戶端發送消息。BlazeDS也可以與其他一些消息系統結合使用,比如JMS、ActiveMQ。由於其遠程技術與消息系統採用的方式是在 HTTP協議上傳輸AMF數據,BlazeDS因此在性能上擁有很大優勢,同時也避免了額外的數據抽象層的處理工作。BlazeDS在很多基於Java的 應用服務器環境下都能正常工作,這些服務器包括Tomcat、WebSphere、WebLogic、JBoss以及ColdFusion。此外,無論是 web(在Flash Player中運行)還是桌面(在Adobe AIR下運行)的Flex應用程序中,BlazeDS的使用都很簡單。

開發人員現在可以從Adobe Labs 站點上下載預發佈版本 , 將blazeds-samples.war文件部署到任何一個servlet容器中,就開始你使用BlazeDS開發的旅程了。這個web應用包中提供了 很多預配置的示範應用,所有這些應用都可以通過http://localhost:8080/blazeds-samples/ (端口號由你所使用的應用服務器和服務器配置所決定)來訪問。

你可以遵循下面的步驟嚮應用程序中引入BlazeDS遠程服務:

  1. 創建一個新的POJO Java類,這個類中需要包含你想要從Flex應用訪問的方法
  2. 在remoting-config.xml文件中配置BlazeDS的遠程終端
  3. 創建一個使用RemoteObject類的Flex應用

若要使用BlazeDS消息服務,則需要下列步驟:

  1. 在messaging-config.xml文件中創建消息服務的終端
  2. 創建一個使用Producer和Consumer類來接收消息的Flex應用
  3. 通過註冊Consumer的消息feed來監聽消息。

這下就可以使用BlazeDS高效地向back-end的Java類發送遠程請求了,也可以應用BlazeDS的消息系統了。接下來,我們將在Eclipse和Flex Builder環境下詳細討論上面提及的步驟。在開始之前,你需要安裝幾個軟件:

創建一個簡單的遠程應用:

  1. 從BlazeDS中將blazeds.war解壓到應用服務器的部署目錄下。比如,在JBoss下,解壓到/server/default/deploy/blazeds.war
  2. 啓動Eclipse和Flex Builder
  3. 創建一個新的Java項目來配置BlazeDS,向web應用中添加Java類。
    1. 將項目命名爲“blazeds_server”
    2. 從現有資源中創建該項目,使用先前部署的BlazeDS WAR的WEB_INF文件夾路徑,比如:/server/default/deploy/blazeds.war/WEB-INF/
    3. 在build路徑下添加src目錄
    4. 將WEB-INF/classes目錄作爲輸出目錄
  4. 創建一個名爲HelloWorld.java的新Java類,類的定義爲:
public class HelloWorld {
 	public String sayHello(String name) {
 		return "hello, " + name;
 	}
 }
修改BlazeDS配置,使它支持向HelloWorld遠程發送請求。這需要在WEB-INF/flex文件夾下的config.xml文件中添加消息終端的配置,具體配置可參照如下代碼:
<destination id="HelloWorld">
       <properties>
         <source>HelloWorld</source>
       </properties>
 </destination>
啓動應用服務器,確定web應用可以通過下面這個地址訪問(端口號由應用服務器配置決定):http://localhost:8080/blazeds/
(假如服務器配置並未允許顯示目錄下的內容的話,你會得到404錯誤,但這沒什麼關係) 創建一個新Flex項目
  1. 將項目命名爲“testHelloWorld”,應用服務器類型則選擇“J2EE”
  2. 選擇“Use remote object access service”和LiveCycle Data Services
  3. 將WAR文件部署的位置聲明爲根目錄
  4. 將根ULR聲明爲:http://localhost:8080/blazeds(端口號由應用服務器配置決定)
  5. 將上下文根目錄聲明爲:/blazeds
  6. 確定配置並點擊“完成”
創建Flex應用,將下列代碼替代testHelloWorld.mxml中的內容:
<?xml version="1.0" encoding="utf-8"?>
 <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
   <mx:RemoteObject id="ro" destination="HelloWorld"/>
   <mx:TextInput id="n" change="ro.sayHello(n.text)"/>
   <mx:Label text="{ro.sayHello.lastResult}"/>
 </mx:Application>
運行該應用,在文本框中輸入你的名字,文本框的正下方你可以看到“hello, <你的名字>”,如下圖所示:

註釋:該Flex應用使用了RemoteObject類庫來與支持BlazedDS的服務器通信。當用戶在文本框中輸入內容的時候,文本框的 change事件促使RemoteObject向服務器發出請求。於是,服務器緊接着向定義了的遠程終端Java類發送請求,這個時候也有可能調用 Spring服務或者EJB session bean,但本例調用的是POJO。本例中,POJO的返回值僅僅是在向它發送的值之前添加了“Hello,”的字符串。在對象返回值的時候,這個返回值 會系列化到AMF中,進而返回給Flex應用。然後,RemoteObject類庫將該值賦值給ro..lastResult屬性(本例中,則是ro.sayHello.lastResult )。最後的結果也可以通過RemoteObject上的result事件獲得。數據綁定的過程中,文本框的標籤就相應顯示爲POJO返回的字符串。BlazeDS同時也支持Java對象類的傳遞。

下一步,我們將創建一個使用BlazeDS消息系統的Flex應用。

  1. 首先,在WEB-INF/flex目錄下的messaging-config.xml文件中添加消息終端配置。添加下面這個終端:
    <destination id="chat"/>

    消息終端的配置使得消息系統能夠將消息轉發給正在監聽該終端消息的客戶。消息終端可以配置持久時間和網絡參數,同時也可以連接到其它的消息系統,比如JMS。
  2. 重新啓動應用服務器,這樣一來,BlazeDS會配置新的消息終端。
  3. 創建一個新Flex項目
    1. 將項目命名爲“testChat”
    2. 應用服務器類型選擇“J2EE”
    3. 選擇“Use remote object access service”和LiveCycle Data Services
    4. 將部署的WAR文件位置聲明爲Root目錄
    5. 將根URL聲明爲:http://localhost:8080/blazeds(端口號由應用服務器配置決定)
    6. 將上下文根目錄聲明爲:/blazeds
    7. 確定配置並點擊“完成”
  4. 創建一個簡單的使用消息系統的聊天應用程序,用下列代碼替代testChat.mxml中內容:
    <?xml version="1.0" encoding="utf-8"?>
     <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="cons.subscribe()">
    
       <mx:Script>
       import mx.messaging.messages.AsyncMessage;
       </mx:Script>
       <mx:Producer id="prod" destination="chat"/>
       <mx:Consumer id="cons" destination="chat" message="c.text += event.message.body.msg + '\n'"/>
    
       <mx:TextArea id="c" width="300" height="300"/>
       <mx:TextInput id="m"/>
       <mx:Button label="Send" click="prod.send(new AsyncMessage({msg: m.text}))"/>
    
     </mx:Application>
  5. 運行該應用。在頁面底部的文本框中輸入一條消息,點擊“Send”。確定所發送的消息正確顯示在第一個文本域中,同時確定在打開多個瀏覽窗口的前提下,消息也可以在這些窗口間傳遞。

註釋:Producer對象允許Flex應用向消息系統中發送消息。另外,還有一個Java API(本例中沒有用到)也可以用來向服務器上的消息系統發送消息。通過第三方適配器或服務器自帶的JMS適配器,你也可以將自身的消息系統連接到其它的 消息系統,但默認配置並不支持它與另外的消息系統的連接。用戶點擊“Send”的時候,某個匿名對象會創建一條新消息,並將消息體中的msg屬性值設置爲 文本框中輸入的內容。由於消息的類型是AsyncMessage,所以AsyncMessage類是必需引入的。Consumer對象使得Flex應用能 夠監聽消息。應用會在其初始化的時候在消息系統中進行註冊,之後,一旦收到消息,Consumer上的事件處理器則會將從消息體中取得聊天消息顯示在文本 域中。

BlazeDS和AMF的使用可以幫助減短開發週期,推動應用運行的速度。何不嘗試一下BlazeDS,我們很期待你的反饋。在Adobe Labs站點的BlazeDS頁面 上,你可以找到很多BlazeDS的相關內容以及AMF的公開規範說明。

關於作者

James Ward是Adobe的Flex技術傳道士,也是Adobe在JSR 286、299和301規範制定中的JCP代表。他喜歡登山,也喜歡編程,因爲兩者都能給他帶來無盡的發現、漂亮的解決方案、巔峯與峽谷。出於對登山冒險 的熱愛,他去過很多地方。同樣,技術也帶給他許許多多的冒險經驗,比如九十年代早期的Pascal和Assembly;Perl、HTML、九十年代中期 的JavaScript;之後就是九十年代後期的Java和相關的開發框架。如今,他主要在以基於Java的back-end的基礎上使用Flex來創建 華麗的前端應用。在加入Adobe之前,James爲Pillar Data Systems開發了市場和客戶服務的富客戶端portal應用。James Ward的博客是:http://www.jamesward.org

hashank Tiwari是Saven Technologies的主要技術開發員。Saven Technologies的總部位於芝加哥,主要爲銀行及金融服務機構提供由前沿技術開發的業務解決方案。Shashank是一個多產的技術開發員、作者 以及演講者,他在JCP的表現極爲積極,並且是JSR 274、283、299、301和312規範的專家組成員。他經常在使用的編程語言至少有一打,包括Java、ActionScript、Python、 Perl、PHP、C++、Groovy、JavaScript、Ruby和Matlab。他在O'Reilly Network的博客也很受歡迎。最近,他正忙於創建使用了Flex和Java的web 2.0應用。www.shanky.org 上有他更多的資料。

閱讀英文原文: Building Web and Desktop Applications with BlazeDS and AMF

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章