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

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

view plaincopy to clipboardprint?
<%@ 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);

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

view plaincopy to clipboardprint?
<%@ 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客户端?

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

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

 

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

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

view plaincopy to clipboardprint?
//用于与网页通信的类  
 
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));
        }
    }
}
 

  其次:

view plaincopy to clipboardprint?
//用于通信连接的事件类  
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);
        }
    }
}
 

view plaincopy to clipboardprint?
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;
   
   }
   
  }
 }
}
 

view plaincopy to clipboardprint?
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 意思为新闻列表

 

 

view plaincopy to clipboardprint?
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;
  
   }

 

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

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

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


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hero82748274/archive/2010/07/02/5709215.aspx

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值