flash与数据库 读取数据库数据

今天,天气依旧很热。整个房间像火炉一般炽热。今天来写写这方面的笔记,做个实验。看看如何运作,首先来讲这方面需要准备一些资料。就是关于数据库方面资料。因为手上资料很少,很多事情都是需要一步步探索。flash 不能直接和数据库进行交互(除air 之外),故此我们需要找一种平台搭配一些协作开发。目前很多流行的方案是多种多样,每一个家公司用的服务器都有所不同。据一些同事介绍,

搭配平台如下(1):java +flash +mysql 组合开发

(2):c++ +flash+sql组合开发

(3):php +flash+mysql 组合开发

还有FMS ,等等更多组合..........

flash 只是用于前端显示数据和交互,大部分交互数据方面需要借助其他语言帮助

目前而言mysql 已经可以满足很多开发公司,除非有特别需求动用到oracle 甲骨文这样的大型数据,但无论怎样组合目的就是要实现到产品。

好,现在开始做实验了。需要准备的材料是:java sdk tomcat ,mysql等一些工具。准备好之后,开始一步步摸索怎样交互。

我的目的是读取到数据库的数据。

当中实验当中遇到问题是(1) 怎样利用读取数据库的资料?

(2) 怎样返回数据给flash接收?

(3) 采用什么方式格式来交互?

(4) 格式应该如何选择?xml json 字符串?等

(5) 应该如何显示数据?

接下来,尝试实验第一种方式,也是最简单,最傻瓜的方式,我所知道的就是这样水平,所以要将这个实验带入一个开始阶段将不会掺杂更多完善的设计。出发的过程就需要尽量简单化。(O(∩_∩)O哈哈~)

初步意向:

flash 发送数据---->服务端 -------> 数据库

flash 接收数据<-----服务器<--------数据库

要进行这样,我们需要采用flash.net 包下URLLoader 进行发送数据(而flex 就采用Http 组件或者其他远程访问)。准备好之后,我们拥有的条件已经可以进行一个简单的发送了。

封装一个发送数据的类。用于交互 发送

创建news表

手动设计表:设置两个项 一个是id 另外一个 是title 这样的数据项。如图所示。

数据库名称为test ,表名为news 。

flash与数据库 读取数据库数据

然后

手动为表添加一些数据入去。

flash与数据库 读取数据库数据

测试数据库是否成功和数据库交互:

添加完数据库后,在这里会使用jsp 进行测试,而这种方式比较笨拙,而且效率不高,一般不会这样使用,但是这样做好处是为了省下时间做快速设计。而我们所在水平是如何,这些并不重要,关键是要适合我们,在方法当中寻找过程解决方案。这些才重要。技术水平因人而异

而其他更加优秀的做法,有一些人会严格使用框架技术,这样操作和链接数据库在效率提升不少。下面是已经链接到数据库的测试。

[c-sharp] view plain copy

<%@ page contentType="text/html; charset=utf-8" language="java" import="java.sql.*" errorPage="" %>

<%

Connection con = null;

try{

Class.forName("com.mysql.jdbc.Driver");

String dbUrl = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8";

String dbUser = "root";

String dbPwd = "123";

String sql="select * from news";

con = DriverManager.getConnection(dbUrl,dbUser,dbPwd);

out.print("已连接。。。。。");

}

catch(Exception ex)

{

out.print("连接失败!!<br>"+ex.toString());

}

%>

<%@ page contentType="text/html; charset=utf-8" language="java" import="java.sql.*" errorPage="" %><%Connection con = null; try{Class.forName("com.mysql.jdbc.Driver"); String dbUrl = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8"; String dbUser = "root"; String dbPwd = "123"; String sql="select * from news";con = DriverManager.getConnection(dbUrl,dbUser,dbPwd); out.print("已连接。。。。。"); }catch(Exception ex) { out.print("连接失败!!<br>"+ex.toString()); }%>

数据库测试成功之后,我们需要的工作就是利用SQL 语句,查询数据并输出。jsp做法是

sql语句:String sql="select * from news";

创建一个Statement 对象,通过执行executeQuery返回。

Statement stmt=con.createStatement();

ResultSet rs=stmt.executeQuery(sql); //执行查询

查询的结果集,采用循环输出来

while(rs.next())

{

msg+=rs.getString("title")+"##";

}

out.clear();

out.print("newList="+msg);

你会看到一系列的数据出现了

[c-sharp] view plain copy

<%@ page contentType="text/html; charset=utf-8" language="java" import="java.sql.*" errorPage="" %>

<%

Connection con = null;

try{

Class.forName("com.mysql.jdbc.Driver");

String dbUrl = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8";

String dbUser = "root";

String dbPwd = "123";

String sql="select * from news";

con = DriverManager.getConnection(dbUrl,dbUser,dbPwd);

out.print("已连接。。。。。");

Statement stmt=con.createStatement();

ResultSet rs=stmt.executeQuery(sql); //执行查询

String msg="";

while(rs.next())

{

msg+=rs.getString("title")+"##";

}

out.clear();

out.print("newList="+msg);

stmt.close();

con.close();

}

catch(Exception ex)

{

out.print("连接失败!!<br>"+ex.toString());

}

%>

<%@ page contentType="text/html; charset=utf-8" language="java" import="java.sql.*" errorPage="" %><%Connection con = null; try{Class.forName("com.mysql.jdbc.Driver"); String dbUrl = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8"; String dbUser = "root"; String dbPwd = "123"; String sql="select * from news";con = DriverManager.getConnection(dbUrl,dbUser,dbPwd); out.print("已连接。。。。。"); Statement stmt=con.createStatement(); ResultSet rs=stmt.executeQuery(sql); //执行查询String msg="";while(rs.next()){ msg+=rs.getString("title")+"##";}out.clear();out.print("newList="+msg);stmt.close(); con.close();}catch(Exception ex) { out.print("连接失败!!<br>"+ex.toString()); }%>

输出数据:

flash与数据库 读取数据库数据

这里是由于在数据库预先插入去了。(方式依旧是人工和手动设计。呵呵)

flash接收数据

接下来,我们就需要解决发送的问题?问题是 怎样发送数据到flash客户端?

发送的 方式是多种多样,当中可以是名称/值 的方式发送,也可以按xml ,json 还有其他格式发送。

这里是从数据库接收到的数据。并显示出来的

flash与数据库 读取数据库数据

按实验来进行一步步来制作。

封装一个类,进行发送数据

[c-sharp] view plain copy

//用于与网页通信的类

package org.summerTree.net

{

import flash.net.URLLoader;

import flash.net.URLRequest;

import flash.events.*;

import flash.net.URLVariables;

import flash.net.URLLoaderDataFormat;

import flash.net.*;

public class HttpConnection extends EventDispatcher

{

public static const VARIABLES:String=URLLoaderDataFormat.VARIABLES;

public static const BINARY:String=URLLoaderDataFormat.BINARY;

public static const TEXT:String=URLLoaderDataFormat.TEXT;

public function HttpConnection()

{

}

/*

*para 设置发送数据的

*http_url 设置发送数据的方式连接地址

*type post and get

*format 格式

*/

public function sendMessage(para:Object,http_url:String,type:String="post",format:String="VARIABLES"):void

{

var request:URLRequest=new URLRequest();

request.data=para;

request.url=http_url;

switch (type)

{

case "post" :

request.method=URLRequestMethod.POST;//发送的方式

break;

case "get" :

request.method=URLRequestMethod.GET;//发送的方式

break;

}

//发送数据

var loader:URLLoader=new URLLoader();

switch (format)

{

case "VARIABLES" :

loader.dataFormat=URLLoaderDataFormat.VARIABLES;//发送数据的格式

break;

case "BIN" :

loader.dataFormat=URLLoaderDataFormat.BINARY;//发送二进制数据的格式

break;

case "TEXT" :

loader.dataFormat=URLLoaderDataFormat.TEXT;//发送文本数据的格式

break;

}

loader.addEventListener(Event.COMPLETE,completeHandler);

loader.addEventListener(IOErrorEvent.IO_ERROR ,IoHandler);

try

{

loader.load(request);

}

catch (e:Error)

{

throw new Error(e);

}

}

private function completeHandler(e:Event):void

{

//处理返回的结果,如果插入数据库成功那么就可以

var evt:ConnectionEvent=new ConnectionEvent(ConnectionEvent.COMPLETE);

evt.data=URLLoader(e.target);

this.dispatchEvent(evt);

}

private function IoHandler(e:Event):void

{

this.dispatchEvent(new ConnectionEvent(ConnectionEvent.WRONG));

}

}

}

//用于与网页通信的类package org.summerTree.net{ import flash.net.URLLoader; import flash.net.URLRequest; import flash.events.*; import flash.net.URLVariables; import flash.net.URLLoaderDataFormat; import flash.net.*; public class HttpConnection extends EventDispatcher { public static const VARIABLES:String=URLLoaderDataFormat.VARIABLES; public static const BINARY:String=URLLoaderDataFormat.BINARY; public static const TEXT:String=URLLoaderDataFormat.TEXT; public function HttpConnection() { } /* *para 设置发送数据的 *http_url 设置发送数据的方式连接地址 *type post and get *format 格式 */ public function sendMessage(para:Object,http_url:String,type:String="post",format:String="VARIABLES"):void { var request:URLRequest=new URLRequest(); request.data=para; request.url=http_url; switch (type) { case "post" : request.method=URLRequestMethod.POST;//发送的方式 break; case "get" : request.method=URLRequestMethod.GET;//发送的方式 break; } //发送数据 var loader:URLLoader=new URLLoader(); switch (format) { case "VARIABLES" : loader.dataFormat=URLLoaderDataFormat.VARIABLES;//发送数据的格式 break; case "BIN" : loader.dataFormat=URLLoaderDataFormat.BINARY;//发送二进制数据的格式 break; case "TEXT" : loader.dataFormat=URLLoaderDataFormat.TEXT;//发送文本数据的格式 break; } loader.addEventListener(Event.COMPLETE,completeHandler); loader.addEventListener(IOErrorEvent.IO_ERROR ,IoHandler); try { loader.load(request); } catch (e:Error) { throw new Error(e); } } private function completeHandler(e:Event):void { //处理返回的结果,如果插入数据库成功那么就可以 var evt:ConnectionEvent=new ConnectionEvent(ConnectionEvent.COMPLETE); evt.data=URLLoader(e.target); this.dispatchEvent(evt); } private function IoHandler(e:Event):void { this.dispatchEvent(new ConnectionEvent(ConnectionEvent.WRONG)); } }}

其次:

[c-sharp] view plain copy

//用于通信连接的事件类

package org.summerTree.net

{

import flash.events.Event;

import flash.net.*;

public class ConnectionEvent extends Event

{

public static const COMPLETE:String="complete";

public var data:URLLoader;

public static const WRONG:String="wrong";

public function ConnectionEvent(type:String,bubbles:Boolean=false,cancelable:Boolean=false)

{

super(type,false,false);

}

override public function clone():Event

{

return new ConnectionEvent(type,false,false);

}

}

}

//用于通信连接的事件类package org.summerTree.net{ import flash.events.Event; import flash.net.*; public class ConnectionEvent extends Event { public static const COMPLETE:String="complete"; public var data:URLLoader; public static const WRONG:String="wrong"; public function ConnectionEvent(type:String,bubbles:Boolean=false,cancelable:Boolean=false) { super(type,false,false); } override public function clone():Event { return new ConnectionEvent(type,false,false); } }}

[c-sharp] view plain copy

package

{

import flash.display.Sprite;

import flash.events.*;

import flash.net.*;

import org.summerTree.net.HttpConnection;

import org.summerTree.net.ConnectionEvent;

public class Main extends Sprite

{

private var sql:HttpConnection;

private var url:String=ManagerURL.Address()+"index.jsp";

public function Main()

{

init();

}

private function init():void

{

sql=new HttpConnection();

var obj:URLVariables=new URLVariables();

sql.sendMessage(obj,url);

sql.addEventListener(ConnectionEvent.COMPLETE,onComplete);

}

private function onComplete(event:ConnectionEvent):void

{

var sqldata:*=event.data;

var msg:String=sqldata.data.newList.toString();

var list:Array=msg.split("##");

var len:int=list.length;

for(var i:int=0;i<len;i++)

{

trace(list[i]+"/r");

var news:NewList=new NewList();

addChild(news);

news.Title.text=list[i];

news.x=100;

news.y=i*news.height;

}

}

}

}

package { import flash.display.Sprite; import flash.events.*; import flash.net.*; import org.summerTree.net.HttpConnection; import org.summerTree.net.ConnectionEvent; public class Main extends Sprite { private var sql:HttpConnection; private var url:String=ManagerURL.Address()+"index.jsp"; public function Main() { init(); } private function init():void { sql=new HttpConnection(); var obj:URLVariables=new URLVariables(); sql.sendMessage(obj,url); sql.addEventListener(ConnectionEvent.COMPLETE,onComplete); } private function onComplete(event:ConnectionEvent):void { var sqldata:*=event.data; var msg:String=sqldata.data.newList.toString(); var list:Array=msg.split("##"); var len:int=list.length; for(var i:int=0;i<len;i++) { trace(list[i]+"/r"); var news:NewList=new NewList(); addChild(news); news.Title.text=list[i]; news.x=100; news.y=i*news.height; } } }}

[c-sharp] view plain copy

package

{

public final class ManagerURL

{

public function ManagerURL()

{

}

public static function Address():String

{

return "http://localhost:8080/sql/"

}

}

}

package { public final class ManagerURL { public function ManagerURL() { } public static function Address():String { return "http://localhost:8080/sql/" } }}

好乏味的东西已经准备完毕。到了解析的时候了。

在flash 里面会使用URLLoader进行发送数据,我们选择发送方式可以是post 和get 。接收数据 可以是二进制,文本,或者名称/值的方式进行。

jsp 发送的数据的过程,其实就是输出的过程当中,flash接收的是jsp输出的数据,out.print里面输出页面的数据。

接收的数据的时候,可以采用上面三种方式,而这些都是看个人需要而定。

在jsp ,使用这种名称/方式进行对于当flash 将设定的数据格式接收的时候 URLLoaderDataFormat.VARIABLES这种情况的时候。 在as3.0 的时候,设置为以下方式方式 newList是名称,可以随意的

out.print("newList="+msg);

这样flash 发送过来的是以字符串形式发送。在flash 将数据加载完毕之后,会通知flash 处理这些数据

var msg:String=sqldata.data.newList.toString(); 接收数据

采用URLLoader类来进行读取这个是data 已经填充好的数据里面。读取他们所需要的内容了。为了显示他们数据,我们准备动态文本

用于显示它的数据。

创建一个元件,在元件里面添加一个动态文本。如图,并进行库链接改名称为NewList 意思为新闻列表

flash与数据库 读取数据库数据

flash与数据库 读取数据库数据

[c-sharp] view plain copy

for(var i:int=0;i<len;i++)

{

trace(list[i]+"/r");

var news:NewList=new NewList();

addChild(news);

news.Title.text=list[i];

news.x=100;

news.y=i*news.height;

}

for(var i:int=0;i<len;i++) { trace(list[i]+"/r"); var news:NewList=new NewList(); addChild(news); news.Title.text=list[i]; news.x=100; news.y=i*news.height; }

创建新闻条数,并显示出数据来。循环读取出来。

到目前为此,显示数据实验已经初步完成了。

后面的工具就是选择其他更加有效设计了和扩展。

相关推荐