Flash中的XML對象也有方法可以將XML數(shù)據(jù)向服務(wù)器發(fā)送。即send和sendAndLoad。send方法向某個 URL 傳遞 XML 對象,返回的信息都被發(fā)送到另外一個瀏覽器窗口;sendAndLoad 方法向某個 URL 發(fā)送一個 XML 對象。返回的信息都放在一個XML對象中。 在某種程度上, XML的send方法和sendAndLoad方法類似于loadVars對象的send方法和sendAndLoad方法。 以login系統(tǒng)為例。首先將Flash中需要傳送的信息(用戶名和密碼)轉(zhuǎn)換成一個 XML 對象,然后將數(shù)據(jù)作為 XML 文檔發(fā)送到服務(wù)器端腳本。在服務(wù)器端我們還是從數(shù)據(jù)庫中提取相應(yīng)的數(shù)據(jù),在服務(wù)器端腳本中對這兩種信息驗證。最后將驗證成功的信息也以XML格式傳送回Flash。圖1顯示了這種結(jié)構(gòu):
首先,看看數(shù)據(jù)庫的結(jié)構(gòu),很簡單,用Access做一個名為login.mdb(存儲到同swf,asp文件同同一目錄下)的數(shù)據(jù)庫文件,然后新建一個名為admin的表,第一個字段名稱是”id”,數(shù)據(jù)類型是自動編號;第二個字段名稱是username,數(shù)據(jù)類型是文本。字段大小改為16;第三個字段名稱為password,數(shù)據(jù)類型是文本,字段大小也改為16。表結(jié)構(gòu)如圖2所示:
接著,我們用Flash做一個登錄界面。為了使得這個界面在其他地方也能用到,可以將所有的元件都集中到一個名為login的MC里面。這個MC的基本結(jié)構(gòu)如下: bg層:用來放置登錄界面的背景。第二幀加關(guān)鍵幀; Title層:用來放置標(biāo)題MC,MC名字為title,因為只是一個標(biāo)題,就不列出這個MC的結(jié)構(gòu)了。第二幀加關(guān)鍵幀; Inputbg層:input文本的背景。 InputTXT層:兩個input文本,第一個的var為name,第二個的var為pass,類型為Password,我們要向服務(wù)器發(fā)送的變量就從這里獲得; Pushbt層:一個確定按鈕(名字為pushbt),用來發(fā)送一個XML變量,其action如下: Action for pushbt: on (release, keyPress "<Enter>") { //新建一個xml對象,節(jié)點明為LOGIN。在屬性 //中存放用戶名和密碼 loginXML = new XML(); loginElement = loginXML.createElement("LOGIN"); loginElement.attributes.name = this.name; loginElement.attributes.pass = this.pass; loginXML.appendChild(loginElement); //新建一個xml對象,用來存放從服務(wù)器返回的信息 loginReplyXML = new XML(); loginXML.sendAndLoad("http://localhost/chklogin.asp", loginReplyXML); Msg = "正在等待服務(wù)器驗證"; gotoAndStop(2); } 這一層有兩幀,第一幀的action為stop();第二幀上的action為 Action for frame2 stop(); function onLoginReply() { //提取從服務(wù)器返回的數(shù)據(jù)并判斷信息是否正確 var reply = this.firstChild; if (reply.nodeName == "LOGINREPLY" && reply.attributes.login == "1") { Msg = reply.attributes.msg; } } //返回服務(wù)器信息 loginReplyXML.onLoad = onLoginReply;
這個MC最后將如圖3所示:
↑ login MC的第一幀
↑ login MC的第二幀
這樣,如果你輸入的name為admin,pass為admin的話,按下確定按鈕,服務(wù)器的chklogin.asp頁面就會接受到以下XML: <LOGIN pass ="admin" name ="admin" /> 在服務(wù)器響應(yīng)并驗證了信息之后,需要發(fā)送回來以下形式的XML: <LOGINREPLY login=”1” Msg=someMessage />
最后看看asp怎么寫。 chklogin.asp: <%@ Language="JScript"%> <% //創(chuàng)建一個新的DomDocument對象,存入客戶端傳送過來的XML請求 var xmlReceive = new ActiveXObject("Msxml2.DomDocument"); xmlReceive.loadXML(Request.Form()); var reElement = xmlReceive.documentElement; //提取用戶名和密碼信息 password = reElement.attributes[0].nodeValue; username = reElement.attributes[1].nodeValue; //創(chuàng)建并打開一個新連接。 var conn = new ActiveXObject("ADODB.CONNECTION"); strconn = "DBQ="+Server.MapPath("login.mdb")+";DefaultDir=;Driver={Microsoft Access Driver (*.mdb)};"; conn.Open(strconn); //新建并打開一個查詢 var rs = new ActiveXObject("ADODB.RECORDSET"); sql = "select * from admin where id=1"; rs.open(sql,conn,1,1); //開始驗證 if (!(rs.BOF && rs.EOF)){ if (password == rs("password") && username == rs("username")){ Msg = "恭喜你," + username + "你已經(jīng)成功登陸!"; }else if(username != rs("username")){ Msg = "對不起,您填寫的用戶名不正確,請返回重新填寫"; }else if(password != rs("password")){ Msg = "對不起,您填寫的密碼不正確,請返回重新填寫"; } }else{ Msg = "登陸沒有成功,看上去服務(wù)器出了點問題。" } //創(chuàng)建一個新的DomDocument對象,向客戶端發(fā)送 var xmlRepley = new ActiveXObject("Msxml2.DomDocument"); xmlRepley.loadXML("<LOGINREPLY login='1' msg='"+Msg+"' />"); Response.Write(xmlRepley.xml); %>
我們知道,F(xiàn)lash中xml.sendAndLoad方法是以HTTP的POST方法發(fā)送到服務(wù)器頁面的,因此這個XML數(shù)據(jù)存在于Request對象中。在DOM中可以直接象在第5行中使用的方法那樣以loadXML的方法加載。 雖然可以使用DOM的其他方法來創(chuàng)建xmlRepley 這個XML文檔(例如createNode),但是那樣對初學(xué)者來說是很難控制的。因此簡單的以字串的形式加載到xmlRepley中更為直觀。如果你有了一定的經(jīng)驗后,需要利用ADO從數(shù)據(jù)庫中提取數(shù)據(jù)并封裝為XML文檔,那么就會發(fā)現(xiàn)使用createNode方法會有效率一些。
出處:藍(lán)色理想
責(zé)任編輯:handmade
上一頁 二、使用LoadVars 下一頁
◎進(jìn)入論壇Flash專欄版塊參加討論
|