`
zerozone
  • 浏览: 205288 次
  • 来自: 北京
社区版块
存档分类
最新评论

第一个ActionScript MySQL Driver:asSQL原理与实践

阅读更多

 熟悉Flex 的开发者都知道,在Flex中不能直接访问数据库,而是采用HTTPService/WebService/RemoteObject等方式实现。asSQL的出现多少让大家感到意外(抛开这两种方式的优劣不提),也可见它的威力。

1.
简介

大型软件系统都采取了分层设计的原则,将其分为大致表现(UI)、业务逻辑以及EIS三部分。在Java语言,直接与数据库打交道曾是家常便饭。HibernateO/R Mapping工具流行,直接使用JDBC编程变得少见了,但有时这种方式更加简便、速度更快。

ActionScript
用于在Flash实现动画设计,访问数据库自然不是它的强项,甚至大家都觉得没有必要。asSQL的出现使许多Flash的开发 者感到惊喜(也许在Java开发人员看来这实在算不了什么)。asSQL现在是alpha版本,还很稚嫩有一些问题。但基本工作正常。

2. asSQL
驱动

a
Connection

asSQL
也提供了类似Java语言的Connection,确切的说asSQL中的Connection是类,而JavaConnectio是接口。 Connection负责与mySQL Server通讯(通过socket建立连接,握手,接收/发送数据包),并按照mySQL协议解析、加密数据包(此处略去协议处理细节,感兴趣的请访问 http://www.redferni.uklinux.net/mysql/MySQL-Protocol.html)。

b
MysqlService

虽然ConnectionasSQL的核心对象,但与客户打交道仅有一个UI组件MysqlService。该组件需要用户输入hostport database等信息,在内部创建Connection,这避免了用户直接操作Connection可能引发的错误。<o:p></o:p>
 

xml 代码
 
  1. <controls:MysqlService id="sqlService" host="localhost" port="3306" user="root" scrambler="{new PlainTextScrambler('sa')}"  database="jpetstore" response="onResponse(event)" error="onError(event)" />  

 将操作结果保存到lastResult中,因此它可作为数据源(data provider)供其它组件(如DataGrid)使用,如下所示:<o:p></o:p>  

xml 代码
 
  1. <mx:DataGrid x="55" y="137" dataProvider="{sqlService.lastResult}">  
  2.     <mx:columns>  
  3.         <mx:DataGridColumn headerText="UserId" dataField="userid"/>  
  4.         <mx:DataGridColumn headerText="Email" dataField="email"/>  
  5.         <mx:DataGridColumn headerText="First Name" dataField="firstname"/>  
  6.     mx:columns>  
  7. mx:DataGrid>  

在一个按钮click事件中,调用myService.send('SELECT userid,email,firstname FROM account;')即可触发上述DataGrid加载数据。

MysqlService支持3个事件,分别是resultsresponseerrors,供调用者定制操作结果。

errors
:显然是发生错误
results
response的区别是前者针对SELECT操作,后者针对UPDATEDELETE......


遗憾的是,MysqlService设计的不够完美,Connection的创建和释放可能被分离到类内部和外部实现。如果用户提供上述事件的响应函数,就必须在该函数中显示关闭connection。如下所示:
 

<o:p></o:p>

ActionScript 代码
 
  1. private function onResults(e:ResultsEvent):void{   
  2.       var st:Statement = Statement(e.target);   
  3.       var con:Connection = st.getConnection();   
  4.       var rs:ResultSet = e.resultSet;   
  5.   
  6.       while ( rs.next() ) {   
  7.           var userid = rs.getString("userid");   
  8.           //var email = rs.getString(2);   
  9.           trace(userid);   
  10.       }   
  11.   
  12.       con.disconnect();   
  13. }   
  14.   
  15. private function onResponse(e:ResponseEvent):void{     
  16.      var st:Statement = Statement(e.target);   
  17.      var con:Connection = st.getConnection();   
  18.         
  19.      var affectedRows:int = e.affectedRows;   
  20.      var insertID:int = e.insertID;   
  21.   
  22.      con.disconnect();   
  23. }   
  24.   
  25. private function onError(e:SQLErrorEvent):void{   
  26.      var st:Statement = Statement(e.target);   
  27.      var con:Connection = st.getConnection();   
  28.         
  29.      var message:String = e.msg;   
  30.      var errorNo:int = e.id;   
  31.      var text:String = e.text; // Equals SQLError #{id}: {msg}   
  32.   
  33.      con.disconnect();   
  34. }   

3. 示例

    asSQL
目前仅支持mySQL,它以UI组件的形式供用户调用,并以数据源的形式把数据和UI组件绑定。

   
开发环境:Flex Builder 2,以及MySql 5,还有Spring <st1:chsdate month="12" islunardate="False" day="30" year="1899" w:st="on" isrocdate="False">1.2.8</st1:chsdate>中实例JPetStoreSchema

步骤1MySQL中建立一个叫做JPetStoreDatabase。并把JPetStoreSchema导入其中。
步骤2:从http://maclema.com/assql/downloads/asSQL-0.1alpha.swc下载asSQL SWC
步骤3:新建Flex Project项目,然后选中项目根目录,右键Properties->Flex Build Path->Library Path;点击右侧按钮Add SWC,在浏览窗口找到刚下载的SWC文件。
步骤4:编辑Flex的界面元素,增加1ComboBox1DataGrid,以及2个按钮。然后编辑MXML文件。

附件是运行界面和源代码。
  • 大小: 409.6 KB
分享到:
评论
8 楼 waltliu 2007-06-12  
你的例子程序不能运行!连接不上数据库呀!
7 楼 qileroro 2007-05-31  
数据访问写在客户界面层了?
6 楼 zerozone 2007-05-27  
安全问题的确不能忽视。

MySQL Client/Server通讯协议大体流程(仅介绍客户认证过程):

1.客户与Server连接建立,服务器向客户端发生握手包( Handshake Initialization Packet)也叫做问候包,其中还包含了Server信息如版本号、线程号,此外还有服务器的capabilities以及最重要的scramble_buff字段包含用于实现客户认证的crypt_seed。

2.客户认证包仍然包含scramble_buff字段,存放SHA1加密后的数据。
 
  The server sends a random string to the client, in scramble_buff.
  The client encrypts the scramble_buff value using the password that the user
  enters. This happens in sql/password.c:scramble() function.
  The client sends the encrypted scramble_buff value to the server.
  The server encrypts the original random string using a value in the mysql
  database, mysql.user.Password.
  The server compares its encrypted random string to what the client sent
  in scramble_buff.
  If they are the same, the password is okay.

由于和AJAX关系不大,此处简单的描述一下,更多信息请参考http://forge.mysql.com/wiki/MySQL_Internals_ClientServer_Protocol

此外,服务器端有一道防止外部非法链接访问的安全屏障:security sandbox。可设置授权访问域。
5 楼 jindw 2007-05-27  
呵呵,仔细看了一下,安全性还是有考虑的。

原文:
Scrambling operations

The client first calculates hash1 = SHA1(password), then hash2 = SHA1(hash1). The server already knows this, as that is what is held in its password table (preceded with a *).

It then appends hash2 to the salt sent by the server and hashes that, and finally exclusive ors the result with hash1.

So it sends to the server SHA1(password) XOR SHA1(salt.SHA1(SHA1(password)).

The server does effectively the same calculation and checks the result (though for some reason it prefers to undo the Exclusive-OR and compare with hash1).
4 楼 sp42 2007-05-27  
玩Flash的很多的都是平面 、code 双轨能力很强的人
如果作者属于这种人,那真是牛。
3 楼 jindw 2007-05-27  
Name: Matt MacLean
Hometown: Calgary, AB, Canada
Birthday: June 11, 1986
Employer: Essentialtalk
Languages: AS3, Java, Javascript, C# and whatever else I need to learn.

作者信息。
牛,86年人,看示例的提示筐是简体中文,和大中华有何渊源,呵呵?
2 楼 sp42 2007-05-27  
顶顶jindw.
如此原则性的问题,冒昧地说句,不能乱来!
1 楼 jindw 2007-05-27  
客户端直接链接数据库,安全如何保证?

相关推荐

    FLEX Flash 连接 MySQL有源码 ver2.8最新版

    Actionscript 3 MySql Driver asSQL is an Actionscript 3 Mysql Driver aimed towards AIR projects to allow Mysql database connectivity directly from Actionscript. flash直接连mysql组件,有源码。

    mysql driver

    mysql driver

    ActionScript 3.0语法参考手册

    用于比较第一个操作数是否大于等于第二个操作数。 **示例代码:** ```actionscript var x:Number = 10; var y:Number = 10; trace(x &gt;= y); // 输出 true ``` #### 三十四、成员运算符 `in` 用于检查对象是否包含...

    ActionScript 3.0基础教程 as3源代码

    8. **ActionScript 3.0与Flash Player的集成**:AS3代码与Flash Player紧密结合,可以访问所有Flash Player提供的API,如硬件加速的图形渲染、网络通信和多媒体处理。 9. **性能提升**:与AS2相比,AS3的执行速度...

    Foundation ActionScript 3 Animation:Making Things Move!中文版.part1

    Foundation ActionScript 3 Animation:Making Things Move!中文版。分两部分上传。史上最好的AS3教程!王汝义翻译~

    Foundation ActionScript 3 Animation:Making Things Move!中文版.part2

    Foundation ActionScript 3 Animation:Making Things Move!中文版。分两部分上传。史上最好的AS3教程!王汝义翻译~

    ActionScript3:五子棋源码

    1. 图形绘制:AS3提供了Graphics类,可以用来在舞台上绘制图形,如棋盘的格子线。使用beginFill()、lineTo()等方法,可以轻松绘制出棋盘。 2. 事件监听:使用addEventListener()方法监听鼠标点击事件,获取到用户的...

    ActionScript 3.0开发技术大全(第一部分)

    第一部分: 第1篇 ActionScript3.0语言基础  第1章 ActionScript3.0概述  第2章 搭建ActionScript3.0开发环境  第3章 ActionScript3.0语法 第2篇 ActionScript3.0面向对象特性  第4章 ActionScript3.0面向...

    Foundation.Actionscript.3.0.Animation

    《Foundation Actionscript 3.0 Animation》是一本深入探讨ActionScript 3.0动画技术的专业电子教程。ActionScript是Adobe Flash Platform的核心编程语言,而3.0版本的更新带来了许多性能提升和新特性,使得创建复杂...

    as3.0访问mysql数据库

    在本文中,我们将深入探讨如何使用AS3.0(ActionScript 3.0)通过Flash与PHP进行交互,从而访问MySQL数据库。ActionScript是Adobe Flash Professional和Flash Builder中用于创建动态内容的编程语言,而PHP是一种广泛...

    从 ActionScript 2.0 迁移到 ActionScript 3.0:主要概念和变化

    从 ActionScript 2.0 迁移到 ActionScript 3.0:主要概念和变化

    actionscript demo

    4. 事件模型:AS3有一个强大的事件驱动模型,允许对象之间通过事件进行通信。例如,用户交互、加载数据或时间触发的事件都可以用事件处理函数来响应。 5. 异步编程:由于Flash运行在浏览器环境中,ActionScript 3.0...

    ActionScript3.0官方帮助文档

    1. **面向对象编程**:ActionScript 3.0是一个完全的面向对象语言,支持类、接口、包和继承。这使得开发者可以构建复杂的软件结构和模块化代码。 2. **事件驱动**:AS3基于事件驱动模型,允许程序响应用户交互、...

    ActionScript 3.0编程精髓

    1. **基础语法**:AS3引入了更严格的类型系统,包括动态类型和静态类型的区分,以及强类型变量的声明。此外,AS3的面向对象特性显著增强,支持类、接口、封装、继承和多态等概念。 2. **类与对象**:AS3中的类定义...

    ActionScript

    ActionScript是一种基于ECMAScript(JavaScript的标准化版本)的编程语言,主要被应用于Adobe Flash平台,用于创建交互式内容、富互联网应用程序(RIA)以及动画。在“ActionScript开发技术大全”这个主题中,我们...

    as3,php和mysql之间的连接及使用数据

    1. **XMLSocket通信**:AS3可以使用XMLSocket类来与服务器进行双向实时通信。通过创建XMLSocket对象并连接到PHP服务器,AS3可以发送和接收数据。PHP端可以通过socket服务处理这些通信,实现数据交换。 2. **AMF通信...

    actionscript

    1. **类型系统**:AS3 引入了强类型系统,每个变量在声明时必须指定其数据类型,如 `var myVar:String;`。这有助于减少运行时错误并提高代码质量。 2. **类与对象**:AS3 采用面向对象编程,支持类、对象、继承、...

Global site tag (gtag.js) - Google Analytics