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