1. 程式人生 > >flash與資料庫 讀取資料庫資料

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 進行測試,而這種方式比較笨拙,而且效率不高,一般不會這樣使用,但是這樣做好處是為了省下時間做快速設計。而我們所在水平是如何,這些並不重要,關鍵是要適合我們,在方法當中尋找過程解決方案。這些才重要。技術水平因人而異

而其他更加優秀的做法,有一些人會嚴格使用框架技術,這樣操作和連結資料庫在效率提升不少。下面是已經連結到資料庫的測試。

[c-sharp] view plain copy print?
  1. <%@ page contentType="text/html; charset=utf-8" language="java" import="java.sql.*" errorPage="" %>  
  2. <%  
  3. Connection con = null;   
  4. try{  
  5. Class.forName("com.mysql.jdbc.Driver");   
  6. String dbUrl = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8";   
  7. String dbUser = "root";   
  8. String dbPwd = "123";   
  9. String sql="select * from  news";  
  10. con = DriverManager.getConnection(dbUrl,dbUser,dbPwd);   
  11. out.print("已連線。。。。。");   
  12. }  
  13. catch(Exception ex)   
  14. {   
  15. out.print("連線失敗!!<br>"+ex.toString());   
  16. }  
  17. %>  
<%@ 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 print?
  1. <%@ page contentType="text/html; charset=utf-8" language="java" import="java.sql.*" errorPage="" %>  
  2. <%  
  3. Connection con = null;   
  4. try{  
  5. Class.forName("com.mysql.jdbc.Driver");   
  6. String dbUrl = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8";   
  7. String dbUser = "root";   
  8. String dbPwd = "123";   
  9. String sql="select * from  news";  
  10. con = DriverManager.getConnection(dbUrl,dbUser,dbPwd);   
  11. out.print("已連線。。。。。");   
  12. Statement stmt=con.createStatement();   
  13. ResultSet rs=stmt.executeQuery(sql); //執行查詢
  14. String msg="";  
  15. while(rs.next())  
  16. {  
  17.     msg+=rs.getString("title")+"##";  
  18. }  
  19. out.clear();  
  20. out.print("newList="+msg);  
  21. stmt.close();   
  22. con.close();  
  23. }  
  24. catch(Exception ex)   
  25. {   
  26. out.print("連線失敗!!<br>"+ex.toString());   
  27. }  
  28. %>  
<%@ 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 還有其他格式傳送。

 這裡是從資料庫接收到的資料。並顯示出來的

 

  按實驗來進行一步步來製作。

          封裝一個類,進行傳送資料

[c-sharp] view plain copy print?
  1. //用於與網頁通訊的類
  2. package org.summerTree.net  
  3. {  
  4.     import flash.net.URLLoader;  
  5.     import flash.net.URLRequest;  
  6.     import flash.events.*;  
  7.     import flash.net.URLVariables;  
  8.     import flash.net.URLLoaderDataFormat;  
  9.     import flash.net.*;  
  10.     publicclass HttpConnection extends EventDispatcher  
  11.     {  
  12.         publicstaticconst VARIABLES:String=URLLoaderDataFormat.VARIABLES;  
  13.         publicstaticconst BINARY:String=URLLoaderDataFormat.BINARY;  
  14.         publicstaticconst TEXT:String=URLLoaderDataFormat.TEXT;  
  15.         public function HttpConnection()  
  16.         {  
  17.         }         
  18.         /* 
  19.         *para 設定傳送資料的  
  20.         *http_url 設定傳送資料的方式連線地址  
  21.         *type post and get 
  22.         *format 格式 
  23.         */
  24.         public function sendMessage(para:Object,http_url:String,type:String="post",format:String="VARIABLES"):void
  25.         {      
  26.             var request:URLRequest=new URLRequest();  
  27.             request.data=para;  
  28.             request.url=http_url;  
  29.             switch (type)  
  30.             {  
  31.                 case"post" :  
  32.                     request.method=URLRequestMethod.POST;//傳送的方式 
  33.                     break;  
  34.                 case"get" :  
  35.                     request.method=URLRequestMethod.GET;//傳送的方式 
  36.                     break;  
  37.             }  
  38.             //傳送資料   
  39.             var loader:URLLoader=new URLLoader();  
  40.             switch (format)  
  41.             {  
  42.                 case"VARIABLES" :  
  43.                     loader.dataFormat=URLLoaderDataFormat.VARIABLES;//傳送資料的格式  
  44.                     break;  
  45.                 case"BIN" :  
  46.                     loader.dataFormat=URLLoaderDataFormat.BINARY;//傳送二進位制資料的格式  
  47.                     break;  
  48.                 case"TEXT" :  
  49.                     loader.dataFormat=URLLoaderDataFormat.TEXT;//傳送文字資料的格式  
  50.                     break;  
  51.             }  
  52.             loader.addEventListener(Event.COMPLETE,completeHandler);  
  53.             loader.addEventListener(IOErrorEvent.IO_ERROR ,IoHandler);  
  54.             try
  55.             {  
  56.                 loader.load(request);  
  57.             }  
  58.             catch (e:Error)  
  59.             {  
  60.                 thrownew Error(e);  
  61.             }  
  62.         }  
  63.         private function completeHandler(e:Event):void
  64.         {  
  65.             //處理返回的結果,如果插入資料庫成功那麼就可以
  66.             var evt:ConnectionEvent=new ConnectionEvent(ConnectionEvent.COMPLETE);  
  67.             evt.data=URLLoader(e.target);  
  68.             this.dispatchEvent(evt);  
  69.         }  
  70.         private function IoHandler(e:Event):void
  71.         {  
  72.             this.dispatchEvent(new ConnectionEvent(ConnectionEvent.WRONG));  
  73.         }  
  74.     }  
  75. }  
//用於與網頁通訊的類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 print?
  1. //用於通訊連線的事件類
  2. package org.summerTree.net  
  3. {  
  4.     import flash.events.Event;  
  5.     import flash.net.*;  
  6.     publicclass ConnectionEvent extends Event  
  7.     {  
  8.         publicstaticconst COMPLETE:String="complete";  
  9.         public var data:URLLoader;  
  10.         publicstaticconst WRONG:String="wrong";  
  11.         public function ConnectionEvent(type:String,bubbles:Boolean=false,cancelable:Boolean=false)  
  12.         {  
  13.             super(type,false,false);  
  14.         }  
  15.         overridepublic function clone():Event  
  16.         {  
  17.             returnnew ConnectionEvent(type,false,false);  
  18.         }  
  19.     }  
  20. }  
//用於通訊連線的事件類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 print?
  1. package   
  2. {  
  3.     import flash.display.Sprite;  
  4.     import flash.events.*;  
  5.     import flash.net.*;  
  6.     import org.summerTree.net.HttpConnection;  
  7.     import org.summerTree.net.ConnectionEvent;  
  8.     publicclass Main extends Sprite  
  9.     {  
  10.         private var sql:HttpConnection;  
  11.         private var url:String=ManagerURL.Address()+"index.jsp";  
  12.         public function Main()  
  13.         {  
  14.             init();  
  15.         }  
  16.         private function init():void
  17.         {  
  18.             sql=new HttpConnection();  
  19.             var obj:URLVariables=new URLVariables();  
  20.             sql.sendMessage(obj,url);  
  21.             sql.addEventListener(ConnectionEvent.COMPLETE,onComplete);  
  22.         }  
  23.         private function onComplete(event:ConnectionEvent):void
  24.         {  
  25.             var sqldata:*=event.data;  
  26.             var msg:String=sqldata.data.newList.toString();  
  27.             var list:Array=msg.split("##");  
  28.             var len:int=list.length;  
  29.             for(var i:int=0;i<len;i++)  
  30.             {  
  31.                 trace(list[i]+"/r");  
  32.                 var news:NewList=new NewList();  
  33.                 addChild(news);  
  34.                 news.Title.text=list[i];  
  35.                 news.x=100;  
  36.                 news.y=i*news.height;  
  37.             }  
  38.         }  
  39.     }  
  40. }  
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 print?
  1. package   
  2. {  
  3.     public final class ManagerURL  
  4.     {  
  5.         public function ManagerURL()  
  6.         {  
  7.         }  
  8.         publicstatic function Address():String  
  9.         {  
  10.             return"http://localhost:8080/sql/"
  11.         }  
  12.     }  
  13. }  
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 意思為新聞列表

[c-sharp] view plain copy print?
  1. for(var i:int=0;i<len;i++)  
  2.   {  
  3.    trace(list[i]+"/r");  
  4.    var news:NewList=new NewList();  
  5.    addChild(news);  
  6.    news.Title.text=list[i];  
  7.    news.x=100;  
  8.    news.y=i*news.height;  
  9.   }  
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;      }

建立新聞條數,並顯示出資料來。迴圈讀取出來。

到目前為此,顯示資料實驗已經初步完成了。

後面的工具就是選擇其他更加有效設計了和擴充套件。