• 【设为首页】
  • 【收藏闪客居】
当前位置:主页>Flah Ria>文章内容
  • 使用XML实现Flash与服务器通信
  • 来源: 作者: 2007-05-22 【


这是一篇讲解如何使用XML实现Flash与通信的入门级实例教程。通过本例的学习,我们将了解使用XML开发Flash RIAs的基本流程。

从Flash Player 5开始,就可以使用XML对象来实现Flash与后台通信。Flash浏览器与XML数据之间的直接进行数据交换 ,并且同LoadVars函数一样,都是以字符串形式传递的。后台语言作为XML数据和数据库的中介,负责将数据库的数据动态生成XML,将XML变动的数据更新回数据库。如下图所示:

XML对象可比LoadVars对象高级多了,它处理的是XML元素,XML元素本身有意义而且格式良好,利用我们和电脑识别, 它早已成为数据交换格式的标准。而LoadVars用来处理变量,LoadVars中的变量很少有什么实际意义,如果用来读取数据库中的数据,变量会 很多。而XML对象就简单多了,与XML相关的技术很多,比如DOM、SOM、SMLT、SAX2等。即使你对这些技术不了解,你也可以用后台语言输出数 据的方式来实现。

使用XML对象来实现Flash与后台通信,主要是通过XML对象的sendAndLoad方法。该方法和LoadVars的sendAndLoad方法 类似,它把指定的XML对象编码为XML文档,使用POST方法将其发送到指定的URL,下载服务器的响应,并将其加载到参数中指定的 resultXMLobject 中。服务器响应加载的方式与 XML.load方法使用的方式相同。

下面是一个简单的ASP+XML+Flash查询实例。XML.sendAndLoad方法传输一个包含学生姓名的XML包,并使用onLoad方法来处理来自服务器的响应。

import mx.controls.Alert;
//新建用来响应的XML对象
var response_xml= new XML();
//响应时忽略XML空白
response_xml.ignoreWhite = true;
function showResult() {
	//清除所有项目
	student_dg.removeAll();
	response_xml.onLoad = function() {
		var nodes = this.firstChild.childNodes;
		var len = nodes.length;
		if (len<1) {
			Alert.show("没有搜索到相应的记录!", "提示信息");
		} else {
			//将XML对象解析成项目对象
			for (i=0; i<len; i++) {
				student_dg.addItem({学号:nodes[i].attributes.id,
				姓名:nodes[i].attributes.name, 
				班级:nodes[i].attributes.cname});
			}
		}
	}
}
//新建用来发送请求的XML对象
var request_xml = new XML();
//创建一个新的 元素search
element = request_xml.createElement("student");
function click() {
	//将输入的学生姓名赋值给search元素name属性
	element.attributes.name = name_ti.text;
	//将search元素追加到 对象中
	request_xml.appendChild(element);
	//传输一个包含学生姓名的XML包
	request_xml.sendAndLoad("http://localhost/student/search.asp",response_xml);
	showResult();
}
search_btn.addEventListener("click", this);

后台以ASP为例,ASP要能读取SWF文件请求的XML元素,得用XML DOMDocument,这就要求服务器必须安装有MSXML2.DOMDocument组件。至于ASP怎样输出动态XML文件,可以用ASP的Response.Write方法,当然同样也可以用XML DOMDocument对象来实现。不过,理论上前者的速度会快些。

<%@LANGUAGE="JAVASCRIPT" CODEPAGE="65001"%>
<%
// 建立XML DOM对象
var doc = new ActiveXObject("MSXML2.DOMDocument");
doc.async =false;
var requestXml=Request.Form();
// 判断是否接收到SWF文件传过来的XML包
if(requestXml.Count >0){
	// 加载XML包
	doc.loadXML(requestXml);
	// 取得根元素
	var rootNode = doc.documentElement;
	// 取得根元素的name属性值
	var name = rootNode.attributes[0].nodeValue;
	// 设定为XML文件
	Response.ContentType="text/xml";
	// 输出XML文件声明
	Response.Write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
	var conn = new ActiveXObject("ADODB.CONNECTION");
	strconn = "DBQ="+Server.MapPath("Exam.mdb")+";Driver={Microsoft Access Driver (*.mdb)};";
	conn.Open(strconn);
	var rs = new ActiveXObject("ADODB.RECORDSET");
	var sql = "Select StudentID,Name,ClassName FROM Student Where Name LIKE '"+name+"%'";
	rs.Open(sql,conn,1,1);
	var i=0;
	// 输出根标记
	Response.Write("<item>");
	while(!rs.EOF){
		// 输出子元素及其属性
		Response.Write("<student id=\""+rs("StudentID")+"\" name=\""+
		rs("Name")+"\" cname=\""+rs("ClassName")+"\"/>");
		i++;
		rs.MoveNext();   
	}
	Response.Write("</item>");
	rs.Close();
	conn.Close();
}
%>

注意:

  • 测试PHP版时,由于使用了$GLOBALS["HTTP_RAW_POST_DATA"]全局变量,请打开php.ini,将always_populate_raw_post_data = On前的;去掉;这是一种不得以的方法,如果有哪位找到好方法,请告诉我一下。
  • 对于CF版,因为在交换数据的过程中,CF解析XML时不接受汉字。因此,我们需要在Flash中将要传送传送的参数进行URL 编码,请将name_ti.text修改为escape(name_ti.text)

其实,我个人并不主张用XML来实现Flash与服务器端的通信,我宁愿用LoadVars和Flash Remoting。




上一篇:v1.2 ActiveSWF,SWF动态生成技术   下一篇:flash AS3 的XML删除节点
  • 用户名:新注册) 密码: 匿名评论
  • 评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规)

Copyright © 2006-2008 flashas.net All Rights Reserved.
网站内容咨询: admin#flashas.net (#为@) 联系QQ:40777822 浙ICP备06033001号
(本网站最佳浏览解析度为1024*768, 建议使用IE 6.0或以上版本浏览器。)