在上一講中我們介紹了在電子地圖的調試環境下編輯地名標註的方法(請參閱《用trace函數實現互動地圖後台快速標註地名》)。由於電子互動地圖的資訊量太大,完全可以通過用戶端的廣大操作者一同完成海量的標註工作,這樣就必須實現線上標註的功能。而這樣的功能單獨依靠Flash本身是無法實現的。我們可以通過ASP、ASP.net、PHP等協助實現。在本例中,我們使用ASP來共同實現線上標註功能。
1、基本的通訊過程
圖1展示的是本例中的通訊過程示意。在 Flash 和資料庫之間傳遞資訊的伺服器端指令碼以 XML 格式讀寫資料。
可用 ActionScript 將 SWF 檔案中收集到的資訊轉換成一個 XML 對象,然後將資料作為 XML 文檔發送到伺服器端指令碼。您還可以使用ActionScript 將伺服器返回的 XML 文檔載入到 XML 對象中,以在 SWF 檔案中使用該文檔。其中在本例中,儲存相關的XML資料是由伺服器的指令碼程式來完成的,這也是本例的重點學習內容。
2、flash與ASP間的通訊方法
flash與ASP通訊之間可以使用多種通訊方法,本例中使用了LoadVars對象。
LoadVars可以通過使用POST方法提供了一種向伺服器輸送變數。
3、伺服器指令碼
伺服器指令碼可以由多種程式編寫,本例中以ASP為例編寫相關的指令碼。
Microsoft Active Server Pages (ASP) 是伺服器端指令碼編寫環境,使用它可以建立和運行動態、互動的 Web伺服器應用程式。
編寫指令碼程式要使用相關的指令碼語言;指令碼語言是介於 HTML 和 Java、C++ 和 Visual Basic 之類的程式設計語言 之間的語言。HTML 通常用于格式化文本和連結網頁。程式設計語言通常用於向電腦發送一系列複雜指令。指令碼語言也可用來向電腦發送指令,但它們的文法和規則沒有可編譯的程式設計語言那樣嚴格和複雜。指令碼語言主要用于格式化文本和使用以程式設計語言編寫的已編譯好的組件。
ASP使 Web 開發商用多種指令碼語言編寫完整的過程成為可能。事實上,在單個 .asp 檔案內部就可以使用多種指令碼語言。
我們可以使用任意一種其相應的指令碼引擎已安裝在 Web 服務器上的指令碼語言。通常使用VBScript和JavaScript這兩種語言;其中,ASP預設的指令碼語言為VBScript。本例就用VBScript編寫指令碼。
下面我們看看具體的執行個體製作。
執行個體製作:
1、Flash端
首先建立如下介面,捕捉標註點的代碼在上一講中已經提到,本例只是除了地名名稱之外,再增加一些基本的資訊,方法雷同,這裡就不再重複;最終將需要儲存的代碼賦給字串變數SendData_srt。
以一個名為Link的變數來接受來自伺服器的訊息。如果其值為1,表明與伺服器端的通訊串連成功。使用
LoadVars,再使用sendAndLoad方法將一個LoadVars的實體下的資料發送出去。
開啟時間軸的動作面板,輸入以下ActionScript代碼:
function SendData():Void { //定義發送資料的函數 var SendData = new LoadVars(); //構造一個新的LoadVars對象 SendData.Check = 1; //設定Check的動作,用於伺服器驗證 SendData.data = SendData_srt; //將待發送的資料變數SendData_srt賦給data output_txt.text = "請稍候……"; //狀態文本顯示為"請稍候……" SendData.onLoad = function(success) { //驗證和伺服器串連的函數 if (success) { //如果和伺服器成功串連 if (this.Link== "1") { //如果驗證動作成功 output_txt.text = "成功標註!審核後即可生效。"; //狀態文本顯示為成功 } } else { output_txt.text = "伺服器忙,請稍後再試!"; //如果和伺服器串連不成功則返回失敗消 } }; SendData.sendAndLoad("http://www.wanggesz.com/XMLData/Save.asp", SendData, "post"); //以post方式發送待儲存資料 } |
2、編寫伺服器指令碼(ASP)
建立一個ASP檔案,其內容如下:
<%@Language="VBScript"%> <% Dim Check '定義Check變數,用來驗證來自SWF檔案的資料 Dim Link '定義Link變數,用來返回給SWF檔案,表明通訊成功 Dim data '定義data變數,用來接收來自SWF檔案的待儲存資料 set data = Request.Form("data") '接收來自SWF檔案的待儲存資料 set Check = Request.Form("Check") '驗證來自SWF檔案的資料 if Check = 1 Then '如果SWF檔案身份正確 Link = 1 '將Link值設為1,表明通訊成功 End if '結束if語句 Set xml=Server.CreateObject("Microsoft.XMLDOM") '建立一個對象用以操作XML檔案 xml.Async=False xml.ValidateOnParse=False xml.Load(server.mapPath("http://www.wanggesz.com/XMLData/data.xml")) '載入xml檔案 set newNode=mxml.createNode ("element", "data", "") '建立新節點newNode,並命為為data root.appendChild(newNode) '在上面得到的載入進來的XML檔案的根節點後追加一個建立的節點newNode, Set objname = mxml.createAttribute("data") '為建立的節點建立屬性項objname.Text = data '為建立屬性項添加屬性值 xml.save(server.mapPath("http://www.wanggesz.com/XMLData/data.xml")) '在指定的路徑儲存XML檔案, Response.write"Link"&Link '將Link=1返回給SWF檔案 %> |
這樣我們依次完成了對地圖的操作、地名的標註等功能;而在地圖的使用過程中,用地名名稱進行查詢及定位是也一個必不可少的常用功能。