一、 簡介
Macromedia公司的Flash如今被廣泛應用於互聯網上以實現增強Web網站的內容描述。 Macromedia最近發行的Flash(Flash 6和Flash MX)版本已經明確表示,Macromedia正在十分認真地考慮把Flash作為Web應用程式開發的介面選擇。對於一個介面來說,Flash可能是個偉大的選擇;然而,這個選擇不是用它來替換商業邏輯,查詢管理和安全。對於一個網頁開發者來說,要實現真正強壯的性能和企業級能力,你需要.NET,Flash以及豐富的描述層支持,並聯合微軟的.NET技術。
Flash包含ActionScript-一種腳本語言,用來為動畫添加互動性。從Flash 5開始引入ActionScript腳本以來,Macromedia不斷地改進它,從一個簡單的腳本語言到相當牢固但仍存在許多限制的程式設計特性。在Flash MX 2004中,Macromedia引入了ActionScript 2.0-它支援新的功能和新的方法來建立程式碼。為了更容易理解本文,你應該先閱讀一些關於用ActionScript來建立Flash網站的基本知識。
Macromedia已經介紹了方法來實現容易地整合外部的資料到Flash應用程式中以允許更複雜和強壯的資料驅動應用程式。 Flash和.NET都把它們自己推薦為跨平台的解決方案並且,由此而成為自然的搭擋。仍然,聯結這兩項技術不是簡單的任務。這篇文章將與你們一起討論把Flash和.NET應用程式整合到一起的幾種方法。
二、整合式Flash和ASP.NET
把Flash動畫嵌入到ASP.NET頁面
Macromedia Flash動畫透過聯合使用OBJECT和EMBED標籤放置在.aspx頁面中。 EMBED標籤最初是Netscape公司為了實現與Netscape 2.0或更高級的版本一起工作而開發的。以後,這個標籤被微軟的Internet Explorer(MSIE)所採用。為了實現瀏覽器相容性,可以共同使用MSIE特定的OBJECT標籤和EMBED標籤。下面的HTML程式碼展示了用OBJECT標籤和EMBED標籤來嵌入一個Flash動畫(*.swf檔)的情形:
三、 把Flash連接到外部的資料
有三種方法可以把Flash動畫與外部資料整合在一起:FlashVars,LoadVars以及新的FlashRemoting技術。其中最簡單的一種方法是,透過使用FlashVars來傳遞程式碼的HTML部分中的變量,實作把外部資料從一個.aspx頁面傳遞到一個嵌入在Web頁面中的一個Flash動畫。使用FlashVars設定的這些變數值可以在Flash動畫的根層次上進行存取。為能在所有的瀏覽器環境下運行,此FlashVars屬性必須在OBJECT和EMBED標籤中進行賦值。
下面是和一個物件標籤一起的FlashVars:
<PARAM Name="FlashVars" Value="init=yes&check=true">
下面是和EMBED標籤一起使用的FlashVars:
<EMBED src="test.swf" FlashVars="init =yes&check=true"></EMBED>
四、 為什麼使用FlashVars
不借用FlashVars,也可以把變數放在HTML標籤中-透過一個查詢串形式把它加到.SWF檔的URL後面,進而傳遞到一個Flash動畫。這個方法可能存在一個問題-如果這個變數在.SWF檔案載入時就需要的話,因為一個.SWF檔案應該在從伺服器發出請求資料之前就被下載和運行。變數值也可能是透過"Load Variables"方法和JavaScript在Flash中設定的。每個這些方法都有惰慢響應的缺點;這就是為什麼開發者應該使用FlashVars來把資料從ASP.NET傳遞到Flash動畫的原因。下圖顯示出以一個查詢串方式傳遞變數的程式碼:
任何使用FlashVars傳遞的變數都能被在Flash動畫的根層次(_level0)上存取。為了檢索一個Flash動畫內部的這些值,可以建立一個動態變數。下列ActionScript程式碼實作在Flash中為"initvalue"賦值:
_level0.initvalue = init;
五、 Flash與資料庫的通訊
一個Flash動畫不能直接存取一個資料庫。然而,Flash能夠經由任何象ASP或ASP.NET等的伺服器端技術與資料庫進行通訊。有完成這項任務的若干方法。在本文中,我們將解釋LoadVariables方法和sendAndLoad方法。
(一) 在動畫片段中使用loadVariables方法
動畫片段的loadVariables方法讀取來自一外部的檔案或URL的資料並且為該動畫片段的變數設定值。一旦該動畫片段被實例化,在片段事件事件處理器中的動畫片段的裝載行動被初始化。在動畫片段被初始化時,loadVariables方法可以被呼叫來載入變數。 loadVariables方法是異步的呼叫並且Flash不會等待該呼叫的結果。當在一個loadVariables()行為中收到資料時,在片段事件事件處理器中的動畫片段的資料行為被初始化。
為了展示這個方法的用法,這個範例根據從Flash動畫中選擇的ID從一個資料庫檢索使用者的姓名和年齡。在下面的圖中,動畫的loadVariables方法被用來裝載資料到來自一個.aspx頁面getUserData.aspx的動畫片段。在這裡,ActionScript傳遞使用者的id-他的名字和年齡將以一個到.aspx頁面查詢串的形式顯示於Flash動畫中。
這個getUserData.aspx頁面從顯示於下面的查詢字串中檢索id值:
現在,ASP.NET能把這個值的id傳遞到.NET商業元件中。這個範例檢索使用者的姓名和年齡:
如同在本節中前面所提及的,動畫片段的onClipEvent事件處理器的資料行為被初始化,當資料被在一個loadVariables()行為中收到時。在Flash動畫中宣告下列動態的變數:flashName和flashAge。下列圖顯示出ActionScript程式碼-它被用於Flash動畫的onClipEvent處理器中以檢索從.aspx頁面傳回的值。
注意:它是很重要的-與從.aspx頁面中設定的變數是相同的。在此展示的範例中,在Flash動畫中所訪問的變數為"name"-它從.aspx頁面設定的變數是相同的(Response.Write("name="&User.name))。
這些值現在可以被使用於Flash動畫內部。
(二) 從動畫片段中使用sendAndLoad方法
在現今的網路上,XML作為一種具有甚至能允許不同類型的應用程式之間順利交換資料潛力的通用傳輸格式,以一個文件系統的形式佔有重要地位。 XML為應用程式之間的通訊-甚至在大範圍的不同系統上的應用程式-提供一道網關機制。只要應用程式能夠共享資料(透過HTTP,檔案共享或另外的機制),並且有一個XML分析器,它們就能共享十分易於處理的結構化資訊。
Flash MX支援XML資料傳輸並且有若干種象ASP和ASP.NET的伺服器技術方法來實作交換XML。 Flash MX能夠透過使用XML類別-load,send和sendAndLoad或Flash MX的新的XMLConnector來傳送和接收XML封包。其中,最後一個可以被用來透過HTTP發送和接收包並且把它們綁定到Flash層的UI部件上。
下面我們討論一下FlashXML物件的sendAndLoad方法,這是在實作以架構為導向的XML資料通訊,在異常處理及效能方面比較受歡迎的方法。我們使用這個簡單範例:從一個Flash客戶端把一用戶的得分的詳細資料插入到資料庫並且回送一條成功或失敗的訊息給該Flash客戶端。
(三) 在Flash中建立一個XML包
一個XML封包能容易被建立在Flash中,如下所示:
var sendXML:XML = new XML("<userid>123456</userid>");
發送一個XML包到一個伺服器端頁面-它使用ASP/ASP.NET並且處理傳回XML資料包。
用法如下:
xmlObject.sendAndLoad (URL: String, targetXMLObject: XML): Void
這個'xmlObject'是XML物件實例-它封裝必須被傳送到.aspx頁面的XML;這個'URL'是指定XML物件的目的URL; 'targetXMLObject'是該XML物件-它將接收從伺服器端傳回的訊息。
sendAndLoad方法把一個XML包發送到一個伺服器端模板並且收到一個XML包作為響應-這不同於XML類的send方法-它只發送一個XML包而並不期盼任何類型的響應。這其中每個方法以其自身方式發揮作用,但是有一重要的區別:XML類別的send方法以一個目標作為參數-它允許你打開一新的瀏覽器視窗或替換當前瀏覽器視窗中的內容,而sendAndLoad方法以一個XML套件作為參數-它不會啟動一個新的瀏覽器視窗。因為send方法打開一個新的瀏覽器窗口,我們可以看到瀏覽器窗口本身的輸出-這可能對調試極為有用。
注意:如果發出sendAndLoad呼叫的Flash檔案在一個網頁瀏覽器中執行,那麼目標URL將與Flash動畫處理同一個網域中。如果你還需要與處於不同網域中的應用程式進行通訊,那麼可以參考
www.macromedia.com站上的"Cross Domain Data Loading"以了解更多的資訊。
下列圖形中的程式碼顯示出一個XML物件的sendAndLoad方法是怎樣被用來與一個.aspx頁面通訊以及是如何處理從伺服器傳回的XML的:
上面的程式碼做下列事情:
·裝載XML字串到一個XML物件"userscore_xml"。這個實例擁有XML-它被傳送到遠端伺服器端ASP.NET頁面。
·設定XML物件"ResponseXMLObj_xml"的ignoreWhite屬性。這個XML物件實例持有來自伺服器的XML包。
·設定XML物件"ResponseXMLObj_xml"的onLoad方法。 Flash收到來自伺服器端.aspx頁面的傳回的XML回應-它在XML物件的onLoad方法中被處理。
·然後,它分析收到的XML套件以在Flash客戶端顯示必要的訊息。
(四) 接收從ASPX頁面的Flash傳送的XML包
下列圖形顯示出完成此任務的程式碼:
上面的程式碼完成下列事情:
·收到從Flash客戶端發送的XML(xmlDoc.Load(Request.InputStream))。
·分析收到的XML並將它傳遞給商業組件以插入到資料庫中。
·形成XML訊息傳送回Flash客戶端。在商業層引發的成功或異常條件被相應地處理並轉換成各種XML訊息-這個訊息被傳送回Flash客戶端。該Flash客戶端收到這些XML訊息並相應地顯示它們。
六、 結論
Flash和.NET技術今天在市場上正逐漸流行開來並將很可能會在不斷增加的應用程式架構中一起成為成功的合作夥伴。這兩種技術處理一些相同的問題,但是實質上不同的。 Flash MX讓Web網站經歷互動性,而.NET幫助建立企業應用軟體。如同在這篇文章中所探索的,整合Flash和.NET應用軟體是完全有可能的。每一步都是在做出決定-如何連接這兩部分並在策略上進行正確的架構規劃。
儘管圍繞FlashRemoting的新一代架構正在此領域不斷獲取動力,然而本文所討論的方法也將在幾年後才能應用於大型領域。