齊兵輝 李清秀
摘 要:ActionScript3中的網絡通信方式和之前的語言徹底不同,它的實現機制也有了根本的改變。在ActionScript2中,加載數據的方法零零碎碎分散在全局函數、LoadVars、XML等許多地方,調用的方式也是五花八門,難學、難記、難用。在ActionScript3中,將所有與外部數據交互的功能都集中到了flash.net.*包中,由專門的類來管理,實現的流程標準、統一,ActionScript3網絡通信API的使用變得前所未有的簡單,另外還內嵌了多種事件支持,對通信過程的控制也比以前更加精確。
關鍵詞:Actionscript3;網絡通信
中圖分類號:TP393.0 文獻標識碼:A 文章編號:1006-8937(2014)24-0095-02
稍復雜的ActionScript3網絡應用程序,一般都會涉及到加載外部數據或與服務器端腳本相互通信。
ActionScript3對網絡通信的支持空前強大,目前主流的網絡數據交互方式幾乎全部支持。粗略的說,ActionScript3把一個成功的網絡通信抽象成以下過程:
①構建通信請求對象(URLRequest)。
②使用通信請求對象,構建URLLoader對象,并發出數據請求。
③數據收到之后,發出完成事件,調用“讀取完成”事件的偵聽器處理返回的數據。
這里有一個要點:提交的數據放在URLRequest對象中,讀取到的數據放在URLloader對象中。
這3個過程是相互獨立的,耦合度較低。通信請求對象只負責構建請求的內容,它建立時并不知道何時會被URLLoader對象接納并開始發送請求;而URLLoader對象只管發送請求和事件,并不知道自己發送的請求對象內容是什么,也不知道數據返回之后會有什么樣的操作;“加載完成”事件偵聽器函數中只知道完成后要干什么,不知道自己什么時候才會偵聽到事件。3個重要部分的分離,給編程帶來了安全性和靈活性。ActionScr-
ipt3的架構設計經常能給我們以貼心和驚喜。
要建立一個成功的通信請求,通信請求對象必須含有足夠的信息,必須知道要向誰請求、通過什么方式、有沒有要提交的數據。因此,這些信息包括:
請求的URL地址:對應于URLRequest對象的url屬性。
請求的方式:對應于method屬性,默認是GET方式。
有兩種方式可選GET和POST,使用URLRequestMethod.GET和URLRequestMethod.POST常量賦值。有沒有要提交的數據:數據對應于data屬性,數據的格式對應于contentType屬性。如果是純粹的加載,那么不需要data屬性。如果要提交一部分數據,那么就要放在data屬性中,比如XML文本等。
不論是純粹的讀取外部數據,還是要提交一些數據并讀取返回信息,都要先發出數據請求。
發出數據請求,其實就是按照數據請求對象攜帶的信息,向指定地址發出請求。這部分由URLLoader對象來完成。
我們可以選擇直接將URLRequest對象傳入URLLoader對象構造函數,這樣URLLoader對象一旦建立,就可以立刻發送請求。
如果有數據返回,那么將會放在這個URLLoader對象的data屬性中。可以通過URLLoader對象的dataFormat屬性來判斷data屬性中存儲的數據格式是文本型的、二進制型的,還是變量名值對型的。
URLLoader對象會發出如下6種事件,可以讓我們監聽,并更好地控制加載流程:
Load()一調用,就發出Event.OPEN事件。
加載過程中,發出ProgressEvent.PROGRESS事件,包含下載字節數信息。
加載完成,發出Event.COMPLETE。
加載完成或者失敗之前,會發出HTTP狀態事件HTTPSta-
tusEvent.HTTP_STATUS。
加載失敗,發出IOErrorEvent.IO_ERROR事件。
發現加載內容不合安全規則,發出SecurityErrorEvent.SEC-
URITY_ERROR。
偵聽器函數就是標準的DOM3事件偵聽器函數,沒有什么特別。一般會根據具體的編程需要,選擇上面的6種事件的部分或全部進行監聽。
URLLoader把讀取到的外部數據劃分為3種格式:文本、值對、二進制。其中,普通文本、XML等以普通UTF-8字符組成的字符串文本都屬于文本格式。值對格式,就是一個URLVariabl-
es對象。二進制格式數據是最強大和靈活的一種數據格式,使用ByteArray對象表示。
什么是二進制格式數據?什么是二進制文件?從本質上說,不同文件格式的差別就是信息的編碼不同,而編碼總是二進制的。因此,所有文件從本質上說都是二進制的。但是,這里所講的二進制文件是為了強調和文本格式文件區分開,也就是說非文本格式文件就是這兒所說的二進制文件。所有的圖像、SWF文件都可以以二進制數據格式載入,以ByteArray對象表示。
在網絡應用中,XML已經毫無疑問地占據了霸主地位。我們在網絡編程中,與XML型數據的交互將是最頻繁的。XML類型是文本格式數據的一種,URLLoader默認的數據格式就是文本,即dataFormat=URLLoaderDataFormat.TEXT。
如果服務器端腳本是值對形式的數據,且是URL編碼形式,那么就是URLVariables類型的數據,本書中為了和以前老版本中的術語一致,仍然稱呼其為值對形式數據。
ActionScript3增加了對二進制格式數據的支持,實在是一大福音。本節講述如何讀取二進制格式數據。讀取二進制格式數據后,二進制格式數據以ByteArray對象存儲在URLLoader對象的data中。
監控加載進度很簡單,只需要增加一個偵聽器,偵聽URL-
Loader對象發出的ProgressEvent.PROGRESS事件。事件對象是flash.events.ProgressEvent類的實例,有兩個屬性:bytedLoaded屬性用來記錄當前下載的字節數;bytesTotal屬性記錄總共要下載的字節數。
在ActionScript2以及以前在Flash中打開任何網址,只需要調用全局函數getURL()即可。在ActionScript3中,已經取消了getURL()這個全局函數,取而代之的是flash.net包中的函數navi-
gateToURL()。
使用navigateToURL()之前,必須導入flash.net包。API格式如下:
Public function navigateToURL(request:URLRequest,window:String=null):void
Request對象包含要跳轉的網址,window字符串表示要顯示request指定網址的瀏覽器窗口或者html框架。如果不傳入Window參數,那么就是默認在新窗口打開。
Window的常用字符串有4種:“_self”表示在當前框架當前窗口打開網址;“_blank”表示在新窗口中打開網址;“_parent”表示在當前框架的父框架上打開網址;”_top”表示在當前窗口的頂級框架中打開網址。
參考文獻:
[1] 趙冠偉,夏斌,聶云峰.富互聯網應用程序研究初探[J].微型機與應用,2005,(12).
[2] 戴侃,楊小虎.基于J2EE 和FLEX 技術構建RIA系統的探索與實現[J].微電子學與計算機,2003,(5).
[3] 張蓓,周強,李莉,等.Flex技術及其在畢業生贈書系統中的應用[J].現代圖書情報技術,2008,(5).
[4] 楊占坡,楊銘,翁穎.Flex3 RIA開發詳解與精深實踐[M].北京:清華大學出版社,2009.
[5] 胡潔.Flex完全自學手冊[M].北京:機械工業出版社,2009.