AS3与后台交互

 

AS3 中使用URLRequest 和URLLoader 与服务器交互

AS3 中使用 URLLoader 与 URLRequest 取代了先前版本 LoadVars 方法. 初学者可能又会迷糊了.
在现在帮助系统没有完善的情况下 (Flash 9 没有帮助, Flex Builder 2 的只有英文), 这里写篇简单的教程, 方便大家往 AS3 过渡.

在 AS3 中, 有关于网络操作的内置类全部在 flash.net 里. 下面是本教程要用到的类的清单 :

URLLoader : 用于从网络或者本地读取文件, 可以通过设置他的 dataFormat 属性改变收到的文本类型.
与 AS2 的 LoadVars 不同的是, 他的默认值 URLLoaderDataFormat.TEXT 即纯文本格式, 所以在读取外部文本变量的时候得修改一下他的 dataFormat 为URLLoaderDataFormat.VARIABLES. 不过在 AS2 中没有该属性, 取代的是contentType 属性.

URLRequest : 用于传递变量到服务器, 以及 URLLoader 要 load 的目标路径. 可以通过设置他的 contentType 属性改变发送到服务器的变量类型, 默认是 application/x-form-urlencoding, 也就是 URLEncode 编码.

URLVariables : 用于配置传递到服务器变量的键 / 值集合, 如user1=Kakera&user2=Eigo.

URLLoaderDataFormat : 用于设置 URLLoader 读取文件的类型, 有 TEXT (纯文本), VARIABLES (URLEncoding 的键 / 值集合), BINARY (2 进制格式), URLLoader 会根据相应的类型进行解码操作, 如解码 URLEncode

同时还有其他不常用的 :
URLRequestMethod : 决定使用哪种方式传递数据到服务器, POST 或者 GET.
URLReqeustHeader : 用于配置传递到服务端的 HTTP 标头.

值得一提的是, URLLoader 还有相当完整的事件让我们来获取读取数据的状态, 下面是有关 URLLoader 事件的清单.

complete : 使用 URLLoader.load() 方法后, 数据完全加载完毕时触发, 通常如果能够触发这个事件的话, 说明你的程序没有问题.

httpStatus : 使用 URLLoader.load() 方法后, 获取 HTTP 状态代码时触发, 通过判断他的 state 属性我们可以获得远程文件的加载状态. 成功 (200), 没有权限 (403), 找不到文件 (404), 服务器内部错误 (500) 等等. 这个事件总是在 compelete 之前被触发.

ioError : 使用 URLLoader.load() 方法时, 发生致命错误时触发, 我还没碰到过..

open : 使用 URLLoader.load() 方法后, 开始从服务器下载数据时触发一次, 此时的 URLLoader.bytesLoaded 一定是 0.

progress : 使用 URLLoader.load() 方法后, 在从服务器下载数据的过程中持续触发, 通过侦听他的变化我们可以很方便的为 URLLoader 做加载状态的显示.

securityError : FlashPlayer 的安全错误, 比如跨域加载, 从硬盘 (文件系统) 发送 / 读取服务器上的数据.

关于注册侦听器的建议

flashplayer 内置类的所有事件都有相关事件类常量来表示, 推荐使用他们来注册事件侦听器. 而所有的内置类的事件类 (Event) 全部在 flash.events 包中,如使用:

import flash.events.Event;
urlLoaderInstance.addEventListener(Event.COMPLETE, completeHandler);

来代替

urlLoaderInstance.addEventListener("complete", completeHandler);

下面是 URLLoader 支持的事件所对应类的清单, 他们可以在 Flex Builder 2 的文档中找到:

complete : Event.COMPLETE
httpStatus : HTTPStatusEvent.HTTP_STATUS
ioError : IOErrorEvent.IO_ERROR
open : Event.OPEN
progress : ProgressEvent.PROGRESS
securityError : SecurityErrorEvent.SECURITY_ERROR

然后下面是使用 URLLoader 的一些简单的例子

1. 单纯的读取服务器或者硬盘上同目录下叫 Variables.txt 文本文件, 文本的内容是:

user1=Kakera&user2=Eigo&user3=Keirago

LoadVariablesOnly.fla

import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.net.URLLoaderDataFormat;
import flash.net.URLVariables;
import flash.events.Event;
import flash.events.HTTPStatusEvent;
import flash.events.IOErrorEvent;
import flash.events.ProgressEvent;
import flash.events.SecurityErrorEvent;


//
// 配置 URLRequest, 设置目标路径等
//

var request:URLRequest = new URLRequest("Variables.txt");


//
// 配置 URLLoader, 注册侦听器等
//

var loader:URLLoader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.VARIABLES;
loader.addEventListener(Event.COMPLETE, loader_complete);
loader.addEventListener(Event.OPEN, loader_open);
loader.addEventListener(HTTPStatusEvent.HTTP_STATUS, loader_httpStatus);
loader.addEventListener(ProgressEvent.PROGRESS, loader_progress);
loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, loader_security);
loader.addEventListener(IOErrorEvent.IO_ERROR, loader_ioError);
loader.load(request);

function loader_complete (e:Event):void {
trace("Event.COMPLETE");
trace("目标文件的原始数据 (纯文本) : " + loader.data);


//
// 使用 URLVariables 处理原始数据并进行遍历同时输出数据
//

var variables:URLVariables = new URLVariables(loader.data);
for (var i in variables) {
trace(i + " : " + variables[i]);
}

}
function loader_open (e:Event):void {
trace("Event.OPEN");
trace("读取了的字节 : " + loader.bytesLoaded);
}
function loader_httpStatus (e:HTTPStatusEvent):void {
trace("HTTPStatusEvent.HTTP_STATUS");
trace("HTTP 状态代码 : " + e.state);
}
function loader_progress (e:ProgressEvent):void {
trace("ProgressEvent.PROGRESS");
trace("读取了的字节 : " + loader.bytesLoaded);
trace("文件总字节 : " + loader.bytesTotal);
}
function loader_security (e:SecurityErrorEvent):void {
trace("SecurityErrorEvent.SECURITY_ERROR");
}
function loader_ioError (e:IOErrorEvent):void {
trace("IOErrorEvent.IO_ERROR");
}

2. 提交数据到 ServerSide.asp, 并输出服务器的返回值

ServerSide.asp

<%@LANGUAGE="JSCRIPT" CODEPAGE="65001"%>
<%

//
// 全局 Header, 设置编码, 以及缓存
//

with (Response) {
Charset = "utf-8";
Buffer = true;
Expires = -10;
ContentType = "text/plain";
}

var buffer = "列出所有服务端接收到的变量 : /n";
var i;
var e = new Enumerator(Request.Form);


//
// 遍历集合
//

for (; !e.atEnd(); e.moveNext()) {
i = e.item();
buffer += String(i) + " : " + String(Request.Form(i)) + "/n";
}

Response.Write(buffer);
%>

SendAndLoadVariables.fla

import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.net.URLLoaderDataFormat;
import flash.net.URLVariables;
import flash.events.Event;
import flash.events.HTTPStatusEvent;
import flash.events.IOErrorEvent;
import flash.events.ProgressEvent;
import flash.events.SecurityErrorEvent;


//
// 配置 URLVariables, 设置传递到服务器的数据
//

var variables:URLVariables = new URLVariables();
variables.userName = "Kakera";
variables.password = "********";


//
// 配置 URLRequest, 设置目标路径, 设置提交的数据, 方法 (POST / GET)
//

var request:URLRequest = new URLRequest("http://localhost/urlloadersample/ServerSide.asp");
request.data = variables;
request.method = URLRequestMethod.POST;


//
// 配置 URLLoader, 注册侦听器等
//

var loader:URLLoader = new URLLoader();


//
// 服务端将要返回的是纯文本数据
//

loader.dataFormat = URLLoaderDataFormat.TEXT;
loader.addEventListener(Event.COMPLETE, loader_complete);
loader.addEventListener(Event.OPEN, loader_open);
loader.addEventListener(HTTPStatusEvent.HTTP_STATUS, loader_httpStatus);
loader.addEventListener(ProgressEvent.PROGRESS, loader_progress);
loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, loader_security);
loader.addEventListener(IOErrorEvent.IO_ERROR, loader_ioError);
loader.load(request);

function loader_complete (e:Event):void {
trace("Event.COMPLETE");
trace("目标文件的原始数据 (纯文本) : /n" + loader.data);
}
function loader_open (e:Event):void {
trace("Event.OPEN");
trace("读取了的字节 : " + loader.bytesLoaded);
}
function loader_httpStatus (e:HTTPStatusEvent):void {
trace("HTTPStatusEvent.HTTP_STATUS");
trace("HTTP 状态代码 : " + e.status);
}
function loader_progress (e:ProgressEvent):void {
trace("ProgressEvent.PROGRESS");
trace("读取了的字节 : " + loader.bytesLoaded);
trace("文件总字节 : " + loader.bytesTotal);
}
function loader_security (e:SecurityErrorEvent):void {
trace("SecurityErrorEvent.SECURITY_ERROR");
}
function loader_ioError (e:IOErrorEvent):void {
trace("IOErrorEvent.IO_ERROR");
}

点击下载本教程以及教程的源码

PS:   转自蓝色理想,不错的文章,讲的很细,而且例子也不错!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我们可以使用 Python 中的 pymysql 库来连接 MySQL 数据库,并使用 tkinter 库来实现交互界面。下面是一个简单的示例代码,可以实现对一个名为 test 的数据库中的一个名为 student 的表格进行增、删、改、查操作: ```python import pymysql import tkinter as tk # 连接数据库 db = pymysql.connect(host="localhost", user="root", password="password", database="test") cursor = db.cursor() # 创建 tkinter 窗口 root = tk.Tk() root.geometry("400x300") # 定义增、删、改、查函数 def insert(): name = e1.get() age = e2.get() sql = "INSERT INTO student (name, age) VALUES ('%s', '%s')" % (name, age) cursor.execute(sql) db.commit() print("插入成功!") def delete(): id = e3.get() sql = "DELETE FROM student WHERE id='%s'" % id cursor.execute(sql) db.commit() print("删除成功!") def update(): id = e4.get() name = e5.get() age = e6.get() sql = "UPDATE student SET name='%s', age='%s' WHERE id='%s'" % (name, age, id) cursor.execute(sql) db.commit() print("更新成功!") def select(): id = e7.get() sql = "SELECT * FROM student WHERE id='%s'" % id cursor.execute(sql) result = cursor.fetchone() if result: print(result) else: print("查无此人!") # 创建标签和输入框 tk.Label(root, text="姓名").grid(row=0, column=0) e1 = tk.Entry(root) e1.grid(row=0, column=1) tk.Label(root, text="年龄").grid(row=1, column=0) e2 = tk.Entry(root) e2.grid(row=1, column=1) tk.Label(root, text="删除ID").grid(row=2, column=0) e3 = tk.Entry(root) e3.grid(row=2, column=1) tk.Label(root, text="更新ID").grid(row=3, column=0) e4 = tk.Entry(root) e4.grid(row=3, column=1) tk.Label(root, text="姓名").grid(row=4, column=0) e5 = tk.Entry(root) e5.grid(row=4, column=1) tk.Label(root, text="年龄").grid(row=5, column=0) e6 = tk.Entry(root) e6.grid(row=5, column=1) tk.Label(root, text="查询ID").grid(row=6, column=0) e7 = tk.Entry(root) e7.grid(row=6, column=1) # 创建按钮 tk.Button(root, text="增加", command=insert).grid(row=0, column=2) tk.Button(root, text="删除", command=delete).grid(row=2, column=2) tk.Button(root, text="更新", command=update).grid(row=3, column=2) tk.Button(root, text="查询", command=select).grid(row=6, column=2) root.mainloop() # 关闭数据库连接 db.close() ``` 在这个示例代码中,我们使用了 tkinter 库创建了一个简单的界面,其中包括了输入框和按钮,用户可以在输入框中输入相关信息,然后点击对应的按钮进行增、删、改、查操作。每个按钮对应一个函数,该函数会根据用户输入的信息执行相应的 SQL 语句,从而实现对数据库的操作。需要注意的是,我们在执行 SQL 语句之后要记得调用 db.commit() 函数提交事务,否则数据库中的数据不会被更新。另外,由于是交互式界面,所以在每个函数中我们都打印了操作结果,以便用户了解操作是否成功。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值