处理外部数据ActionScript 3.0 包含用于从外部源加载数据的机制。这些源可以是静态内容(如文本文件),也可以是动态内容(如从数据库检索数据的 Web 脚本)。可以使用多种不同的方法来设置数据的格式,并且 ActionScript 提供了用于解码和访问数据的功能。也可以在检索数据的过程中将数据发送到外部服务器。 子主题使用 URLLoader 类和 URLVariables 类ActionScript 3.0 使用 URLLoader 和 URLVariables 类来加载外部数据。URLLoader 类以文本、二进制数据或 URL 编码变量的形式从 URL 下载数据。URLLoader 类用于下载文本文件、XML 或其它要用于数据驱动的动态 ActionScript 应用程序中的信息。URLLoader 类使用 ActionScript 3.0 高级事件处理模型,使用该模型可以侦听诸如 与早期版本 ActionScript 中的 XML 和 LoadVars 类非常相似,URLLoader URL 的数据在下载完成之前不可用。尽管如果文件加载速度太快,可能不会调度
例如,要将 XML 数据包上载到服务器端脚本,您可以使用下面的 ActionScript 3.0 代码: var secondsUTC:Number = new Date().time; var dataXML:XML = <login> <time>{secondsUTC}</time> <username>Ernie</username> <password>guru</password> </login>; var request:URLRequest = new URLRequest("http://www./login.cfm"); request.contentType = "text/xml"; request.data = dataXML.toXMLString(); request.method = URLRequestMethod.POST; var loader:URLLoader = new URLLoader(); try { loader.load(request); } catch (error:ArgumentError) { trace("An ArgumentError has occurred."); } catch (error:SecurityError) { trace("A SecurityError has occurred."); } 上面的代码片段创建了一个名为 可以使用三种方式指定要在 URL 请求中传递的参数:
当定义 URLVariables 构造函数或 从外部文档加载数据当使用 ActionScript 3.0 生成动态应用程序时,最好从外部文件或服务器端脚本加载数据。这样,您不必编辑或重新编译 ActionScript 文件,即可生成动态应用程序。例如,如果生成“每日提示”应用程序,您可以编写一个服务器端脚本,该脚本每天从数据库检索一次随机提示并将其保存到文本文件。然后,ActionScript 应用程序可以加载静态文本文件的内容,而不必每次查询数据库。 下面的片断创建 URLRequest 和 URLLoader 对象,用于加载外部文本文件 params.txt 的内容: var request:URLRequest = new URLRequest("params.txt"); var loader:URLLoader = new URLLoader(); loader.load(request); 可以将上面的片断简化如下: var loader:URLLoader = new URLLoader(new URLRequest("params.txt")); 默认情况下,如果您未定义请求方法,Flash Player 将使用 HTTP var request:URLRequest = new URLRequest("sendfeedback.cfm"); request.method = URLRequestMethod.POST; 在运行时加载的外部文档 params.txt 包含以下数据: monthNames=January,February,March,April,May,June,July,August,September,October,November,December&dayNames=Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday 该文件包含两个参数,即
加载数据后,将调度 private function completeHandler(event:Event):void { var loader2:URLLoader = URLLoader(event.target); trace(loader2.data); } 如果远程文档包含名称-值对,您可以通过传入加载文件的内容,使用 URLVariables 类来分析数据,如下所示: private function completeHandler(event:Event):void { var loader2:URLLoader = URLLoader(event.target); var variables:URLVariables = new URLVariables(loader2.data); trace(variables.dayNames); } 外部文件中的每个名称-值对都创建为 URLVariables 对象中的一个属性。在上面的代码范例中,变量对象中的每个属性都被视为字符串。如果名称-值对是一个项目列表,您可以通过调用 var dayNameArray:Array = variables.dayNames.split(",");
无需将远程文件的内容作为字符串加载和新建 URLVariables 对象,您可以将
下面的代码说明了通过将 package { import flash.display.Sprite; import flash.events.*; import flash.net.URLLoader; import flash.net.URLLoaderDataFormat; import flash.net.URLRequest; public class URLLoaderDataFormatExample extends Sprite { public function URLLoaderDataFormatExample() { var request:URLRequest = new URLRequest("http://www.[yourdomain].com/params.txt"); var variables:URLLoader = new URLLoader(); variables.dataFormat = URLLoaderDataFormat.VARIABLES; variables.addEventListener(Event.COMPLETE, completeHandler); try { variables.load(request); } catch (error:Error) { trace("Unable to load URL: " + error); } } private function completeHandler(event:Event):void { var loader:URLLoader = URLLoader(event.target); trace(loader.data.dayNames); } } }
如下面的实例所示,从外部文件加载 XML 与加载 URLVariables 相同。可以创建 URLRequest 和 URLLoader 实例,然后使用它们下载远程 XML 文档。文件完全下载后,调度 package { import flash.display.Sprite; import flash.errors.*; import flash.events.*; import flash.net.URLLoader; import flash.net.URLRequest; public class ExternalDocs extends Sprite { public function ExternalDocs() { var request:URLRequest = new URLRequest("http://www.[yourdomain].com/data.xml"); var loader:URLLoader = new URLLoader(); loader.addEventListener(Event.COMPLETE, completeHandler); try { loader.load(request); } catch (error:ArgumentError) { trace("An ArgumentError has occurred."); } catch (error:SecurityError) { trace("A SecurityError has occurred."); } } private function completeHandler(event:Event):void { var dataXML:XML = XML(event.target.data); trace(dataXML.toXMLString()); } } } 与外部脚本进行通信除了加载外部数据文件,还可以使用 URLVariables 类将变量发送到服务器端脚本并处理服务器的响应。这是非常有用的,例如,如果您正在编写游戏,想要将用户的得分发送到服务器以计算是否应添加到高分列表中,也可以将用户的登录信息发送到服务器以进行验证。服务器端脚本可以处理用户名和密码,向数据库验证用户名和密码,然后返回用户提供的凭据是否有效的确认。 下面的片断创建一个名为 var variables:URLVariables = new URLVariables("name=Franklin"); var request:URLRequest = new URLRequest(); request.url = "http://www.[yourdomain].com/greeting.cfm"; request.method = URLRequestMethod.POST; request.data = variables; var loader:URLLoader = new URLLoader(); loader.dataFormat = URLLoaderDataFormat.VARIABLES; loader.addEventListener(Event.COMPLETE, completeHandler); try { loader.load(request); } catch (error:Error) { trace("Unable to load URL"); } function completeHandler(event:Event):void { trace(event.target.data.welcomeMessage); } 下面的代码包含上面的示例中使用的 Adobe ColdFusion? greeting.cfm 文档的内容: <cfif NOT IsDefined("Form.name") OR Len(Trim(Form.Name)) EQ 0> <cfset Form.Name = "Stranger" /> </cfif> <cfoutput>welcomeMessage=#UrlEncodedFormat("Welcome, " & Form.name)# </cfoutput> |
|