本文列述了13個Java程式員應當學習Flex和BlazeDS的理由,討論了為什麼Flex結合BlazeDS是開發RIA的最佳組合之一。無論是高度互動的網站還是以Java為後端的公司專屬應用程式,這項組合都是最佳選擇之一。更重要的是,這項組合能同時為開發員和企業帶來高回報(ROI)。
在闡述Java程式員應當學習BlazeDS的13條理由時,我以一個假想的蘇打指派系統來展示如何讓已有的Java程式轉變為RIA應用。通過這個例子,我同時還會講解到BlazeDS在已有Java應用或建立Java應用中的多種不同用法。
理由一:開源
Flex軟體開發工具箱(SDK)的核心是個開源架構,專門用來開發、維護那些在不同瀏覽器、不同作業系統下介面都相同的RIA應用。Flex發布採用的是Mozilla公用許可證(Mozilla Public License)。編譯後的Flex應用在Adobe Flash平台下運行。
BlazeDS是串連Flex和Java的索橋,是項針對遠程調用和訊息傳遞的開源技術。在Java應用伺服器上,它以servlet的形式存在,因此可以在任何標準Java網路應用中運用它。BlazeDS以LGPL(Lesser GNU Public License)公用許可認證發布。在發布BlazeDS的同時,Adobe還公布了AMF(ActionScript Message Format)規格說明,BlazeDS、Java和Flex用戶端間以這種簡潔的二進位格式實現通訊。
理由二:完善的社區支援
Flex社區非常活躍,社區貢獻了大量項目。Flex.org,這個配以社區新聞的Adobe網站幾乎每天都有新的社區貢獻;Yahoo!上的Flex使用者組的成員也已經超過了11000。
再比如Google Code上的Flexlib項目,已經提交了大量的開源UI組件。Swiz和Mate項目貢獻了最佳化事件處理的架構;還有Gorilla Logic貢獻了自動化UI測試的Flex Monkeym項目。
理由三:帶來廣闊的就業前景
據Adobe的Flex“傳道士”——James Ward看來,Flex進階開發員的市場需求非常大,學習Flex能讓你擁有極具市場競爭力的開發技能。
理由四:更高的業務效益回報
總體上,開發企業web應用不是個輕鬆的活,這基本上是眾所周知的事實。Flex和BlazeDS提供的不僅僅是功能強大的開發工具,而且開發技術本身相對也非常簡單。開發效率可以得到大幅度的提升,產品因此可以很快推向市場。Flex和Flash帶來的使用者體驗也相對更有魅力,對增加流量、提高使用者轉化率(conversion rate)很有協助。
很經典的一個例子是Borders連鎖書店。他們最近發布了帶有“魔法書架”的新網站,這個網站採用Flash介面來類比書籍借閱的過程。Borders 發現這一類比借閱非常明顯地提到了使用者轉換率:“藉助這個Flash驅動的介面,使用者可以瀏覽書籍、DVD和CD的封面,使用者轉換率比其他沒有此項功能的網站高出62%”。
理由五:Flex是第一個專門為建立UI而設計的語言
大部分語言都不是在第一時間設計其對UI的支援。Java中Swing包的實現剛好是個很好的證明。也就是這個原因,很多像捆綁資料這樣的簡單動作在Swing當中的實現就非常痛苦。用 Swing最大的問題在於,要想提高開發效率就必須要對其API了如指掌。
Flex剛好相反,它是專門為建立web UI而設計的。正如Bruce Eckel所說,Flex是第一個針對UI開發的領特定領域語言(DSL)。用Flex構建UI比其它諸如JSP、JSF、Swing等技術簡便得多。語言本身糅合了資料繫結、事件處理、控制項布局以及其它一些UI常用開發技巧,就算對語言沒有深刻的理解也不會影響開發效率。
理由六:編程風格近似於Java
你可以繼續使用現有的Java開發工具來開發Flex應用。當然也可以採用SDK中攜帶的免費命令列工具,Adobe Flex Builder(一個Eclipse外掛程式),或最近的IntelliJ IDEA 8。
Flex提供的是一個有狀態環境,在這個環境中,資料從用戶端載入。這種編程模式更像是開發案頭用戶端而非HTML編程,這種風格對於用過Java Swing編程的開發員來說應該是相當熟悉。
Flex是MXML(類似XML的UI標記語言)和Adobe ActionScript(物件導向的解析語言)的結合體。鑒於這種結合方式,Flex編程與Java非常相似,因為兩者用的都是熟知的物件導向的概念。
最理想的開發環境是把Flex應用建立在web部署檔案夾下。這樣一來,每次更新應用之後都不需要重新部署,只要在瀏覽器下重新整理一下就可以了。用Flex和BlazeDS開發後,開發效率絕對比之前有很大的提升。
理由七:BlazeDS可以在任何Java應用伺服器上運行
BlazeDS目前發行了多個版本,其中的turnkey版本還包含了為BlazeDS配置的Apache Tomcat。本文中,我用的是二進位發布版本,其中含有一個WAR用來展示如何把應用部署到各種應用伺服器上去。不用這個WAR的話,你也可以從中提取 JAR檔案放到自己的項目中去。關於安裝BlazeDS的各種選項內容,可以參見BlazeDS的wiki。
這裡舉一個簡單的例子,比方說要在已有的一個簡單的蘇打調配系統中應用BlazeDS。你只要把JAR檔案放到專案檔夾下,然後就可以在應用裡直接用BlazeDS,可以部署到能夠部署應用的任何地方。
在項目中添加BlazeDS,只需要完成下面兩個步驟:
- 解壓縮BlazeDS WAR檔案的內容:jar xvf blazeds.war。
- 把JAR檔案都拷貝到項目的lib檔案夾下:cp -R WEB-INF/lib /sodaSample。
理由八:可以在已有Java應用中運用
比方說這個簡單的蘇打調配系統,假設你想要擴充這個已開發好的服務,讓其它Flex應用可以遠程調用。在現成的應用中配置BlazeDS的基本步驟有:
- 修改
WEB-INF/flex
檔案夾下的BlazeDS設定檔
- 在該應用對應的web.xml檔案裡定義
MessageBrokerServlet
和session監聽器
配置好BlazeDS之後,再把蘇打調配服務添加到BlazeDS遠程設定檔裡,Flex客戶就能遠程調用了。這個過程通過在設定檔裡定義一個目的地(destination)、一個或多個通道(channel)來傳輸資料。基本的AMF通道定義在services.xml檔案裡。下面這段配置在 remoting-config.xml裡定義了目的地(destination):
<destination id="sodaService" channels="my-amf"><properties> <source>com.gorillalogic.sodaSample.SodaService</source></properties></destination>
通過在遠程調用設定檔裡定義端點(endpoint),Flex用戶端就可以調用任何一個基本的Java服務。
要是想把Java資料模型也傳送到Flex用戶端的話,只要在ActionScript類中定義好兩者間的映射:
[Bindable][RemoteClass(alias="com.gorillalogic.sodaSample.SodaModel")]
這段代碼告訴Flex,在遠程調用的服務返回SodaModel
的時候,把它映射到Flex的SodaModel
。本例中的Flex用戶端顯示的就是如何調用這個Java服務。調用返回一個已經填寫好預定資訊的SodaModel
:
public function callSodaService():void {var sodaType:String = type.text;var sodaCount:int = parseInt(cnt.text);var flag:Boolean = preOpen.selected;remoteObject.getSoda(sodaType, sodaCount, flag);}private function resultHandler(event:ResultEvent):void { var sodaModel:SodaModel = event.result as SodaModel;}
Flex返回的結果是通用的result變數,可以直接映射到你的SodaModel
。這裡我就不深入討論怎麼實現映射了,但其中值得提到的是要在編譯配置裡聲明services-config.xml
路徑,像這樣:
-locale en_US -services=/nsource/sodaSample/web/WEB-INF/flex/services-config.xml -context-root /
如果不添加這個路徑的話,你的Flex用戶端就沒發找到Java服務。同樣的方式,你還能把一個對象從用戶端傳遞迴伺服器端。比如,你可以把一個空的soda model發回伺服器(審校註:原文這裡寫的是用戶端,根據上下文判斷這裡應該是伺服器端)。
理由九:可以通過Java來擴充和修改BlazeDS
假如你想添加特殊的日誌來記錄蘇打調配服務被調用的情況,那麼你可以擴充標準的Java適配器來添加日誌功能。
首先,添加一個繼承了JavaAdapter
的Java類:
import flex.messaging.services.remoting.adapters.JavaAdapter.public class TimingJavaAdapter extends JavaAdapter {
其次,重載invoke()方法:
public Object invoke(Message message) {<br /> RemotingMessage remotingMessage = (RemotingMessage) message;<br /> String operation = remotingMessage.getOperation();<br /> String destination = remotingMessage.getDestination();</p><p>Logger.info("calling " + operation + " on destination " + destination);<br />Object data = super.invoke(message);<br />return data;<br />}<br /> 這個方法中,你可以看到調用之後的操作和調用的目的地(destination)。這種方法也能用來處理其它一些問題,比如記錄向伺服器發送調用需要多長時間。
理由十:HTML和JSP也能調用BlazeDS
從HTML和JSP也能調用BlazeDS,這種調用有幾種不同的實現方式,比如通過Browser Manager或fflashVars
f來實現。Flex應用能夠讀取由HTML版面設定的fflashVars
f。
比方說你想要通過HTML頁面來發送你的使用者名稱和準備預定的蘇打類型,你可以在HTML頁面這樣設定flashVars
:
<object id='SodaSample' classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000' codebase='http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab' height='100%' width='100%'> <param name='src' value='SodaSample.swf'/> <param name='flashVars' value='username=ryan&type=coke'/> <embed name='mySwf' src='SodaSample.swf' pluginspage='http://www.adobe.com/go/getflashplayer' height='100%' width='100%' flashVars='username=ryan&type=coke'/></object>
然後,在Flex應用中,你可以通過讀取應用參數來擷取這些變數:
var username:String;if (Application.application.parameters.hasOwnProperty("username")) {username = Application.application.parameters.username;}
理由十一:Flex和BlazeDS的資料轉送效能遠勝於其它Ajax解決方案
目前使用的遠端程序呼叫(RPC)都預設選擇AMF二進位協議。AMF是個開放的標準,而且相當快。James Ward曾舉例比較過多種遠程調用解決方案。儘管其它Ajax技術——比如Dojo——已經能夠快速處理幾百行的資料,但是用Flex和BlazeDS的話可以輕鬆搞定成千上萬行。(請參考James Ward's census,可以瞭解下各種不同的RIA資料載入技術的測評。)
理由十二:Java用戶端能夠直接調用BlazeDS
最新發行的BlazeDS當中含有一個Java的AMF類,通過這個類,你可以在Java用戶端直接調用BlazeDS伺服器。對於單元測試和載入測試來說,BlazeDS的這種調用方式非常實用。
理由十三:Spring下也能用
Adobe和Spring互相聯手,嘗試將雙方項目整合起來。他們發布的第一個Spring–BlazeDS整合版本就向大家展示了他們的良苦用心。Spring Bean能夠以遠程服務的方式被調用,因此可以清除很多重複的設定檔。更多這方面的相關資訊,可以參考該項目的首頁。
結論
開源的BlazeDS建立在Java基礎上,無論是對新的還是已有的Java伺服器項目來說都是個很好的選擇。Flex、BlazeDS技術能夠提供高效能的遠程通訊,支援Flex和Java間的對象映射,因此是RIA開發的理想選擇。Flex和BlazeDS的開發新手,如果曾經是Java開發員的話,會發現整個開發過程效率非常高,而且很容易掌握。
Flex加BlazeDS還是開發大型Java公司專屬應用程式的理想選擇。我們組開發的上個項目中,應用涉及到50多個不同的介面,而且伺服器和用戶端之間需要規律性地互傳幾千行的代碼。這類應用幾乎沒法通過傳統的Ajax技術來實現。但是在引入了Flex和BlazeDS之後,我們在年內就發布了第一個版本。看,這就是這對動態組合為你的應用開發項目帶來的過人之處。