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?- <%@ 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?- <%@ 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?- //用於與網頁通訊的類
- 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.*;
- publicclass HttpConnection extends EventDispatcher
- {
- publicstaticconst VARIABLES:String=URLLoaderDataFormat.VARIABLES;
- publicstaticconst BINARY:String=URLLoaderDataFormat.BINARY;
- publicstaticconst 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)
- {
- thrownew 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?- //用於通訊連線的事件類
- package org.summerTree.net
- {
- import flash.events.Event;
- import flash.net.*;
- publicclass ConnectionEvent extends Event
- {
- publicstaticconst COMPLETE:String="complete";
- public var data:URLLoader;
- publicstaticconst WRONG:String="wrong";
- public function ConnectionEvent(type:String,bubbles:Boolean=false,cancelable:Boolean=false)
- {
- super(type,false,false);
- }
- overridepublic function clone():Event
- {
- returnnew 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;
- publicclass 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()
- {
- }
- publicstatic 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?- 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;
- }
建立新聞條數,並顯示出資料來。迴圈讀取出來。
到目前為此,顯示資料實驗已經初步完成了。
後面的工具就是選擇其他更加有效設計了和擴充套件。