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 。

 

 

 

 

然后

 

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

 

 

 

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

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

 

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

 

<%@ 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);

 

 

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

 

<%@ 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客户端?

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

 

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

 

 

 

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

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

//用于与网页通信的类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.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 { 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 { 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 意思为新闻列表

 

 

 

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;      }

 

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

 

 

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

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

 

 

 

 

 

 

         

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

    

 

 

 

 

 

         

 

 

 

 

 

 

 

           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow