Flex連接數據庫三種步驟

首先,做一點說明。Flex是不能直接連接數據庫的,這一點大家需要知道,它只能間接地連接數據庫。Flex中提供了三種方式:HttpService,WebService 和RemoteObject。其中HttpService可以直接獲取XML中的數據,還可以通過JSP,ASP以及PHP讀取數據庫中的數據,這個比較簡單,而且網上也有很多例子,我就不多說了。WebService我不懂,請自己查資料。我一直用的是JAVA對象連接數據庫,感覺這個挺方便,而且J2EE的技術已經很成熟。今天的教程就是以 Flex + JAVA + SQLServer獲取數據庫公告信息爲例簡單說一下RemoteObject的用法。
前提
1.確保你安裝了Flex Data Service。這個對於單個CUP無限APP是免費的,可以去Adobe下載。如果只是讀取XML文件是不需要這個的,連接數據庫就需要它了。
2.安裝了Flex Builder或者有Flex SDK。我這裏使用的是Flex Builder(IDE就是方便啊 ^_^)。
3.安裝了SQLServer數據庫。
4.安裝了JRUN或者tomcat或其它的J2EE容器,因爲發佈的時候我們的程序要運行在J2EE平臺上。
5.安裝了JDK。
第一步:創建數據庫
這裏我們有一個公告表,表名爲Bulletin。結構如下:
字段名稱 字段類型 說明
ID 自動編號 自動編號
title Nvarchar(100) 題目
date datatime 日期
author Nvarchar(20) 作者
content ntext 內容
在數據庫中創建這個表。保存之後進入下一步。
第二步:在JAVA中編寫獲取公告的代碼
首先,我們要創建一個公告類來專門保存獲取的公告信息,代碼如下。

NoticeInfo.java
package net.zhuoqun.connectDB;
import java.util.Date;
public class NoticeInfo {
     private String title;         // 標題
     private String author;   // 作者
     private String content;// 內容
     private Date dates;       // 時間    
     public String getAuthor() {
         return author;
     }
     public void setAuthor(String author) {
         this.author = author;
     }
     ……………… // 其它get 和 set 方法。
}

創建好這個之後我們要創建一個數據查詢類:DataServiceImpl.java來查詢數據庫,並將查詢結果傳給將要創建的Flex程序。由於我們不清楚有多少條記錄,所以就藉助一下JAVA中的ArrayList這個類,它位於java.util 包中。先創建一個ArrayList:
ArrayList noticeList = new ArrayList();
查詢數據庫之後,每讀取一條記錄就添加到 noticeList。

while(rs.next()){
     NoticeInfo temp = new NoticeInfo();
     temp.setAuthor(rs.getString("author"));
     temp.setContent(rs.getString("content"));
     temp.setDates(rs.getDate("date"));
     temp.setTitle(rs.getString("title"));
     noticeList.add(temp);
}

查詢完畢之後你就可以把這個noticeList傳回去,你也可以傳回去一個 NoticeInfo 數組:

NoticeInfo[] notices = new NoticeInfo[noticeList.size()];
for(int i=0;i<noticeList.size();i++){
     notices = (NoticeInfo)noticeList.get(i);
}
return notices;

我這裏用的是後一種方法。如果你直接把noticeList傳回去的話,記住一點,JAVA的ArrayList類型的對象到了Flex中會變成ArrayCollection類型的。
現在JAVA部分的代碼就寫好了。
DataServiceImpl.java 的全部代碼如下:

package net.zhuoqun.connectDB;
import java.sql.*;
import java.util.ArrayList;
import java.util.Date;
public class DataServiceImpl {    
     private Connection conn = null;
     private Statement stmt = null;
     // 以下是數據庫以及驅動信息
     public final static String DRIVER = "com.microsoft.jdbc.sqlserver.SQLServerDriver";
     public final static String CONN_STR_PRE = "jdbc:microsoft:sqlserver://";
     public final static String HOST_NAME = "localhost:1433;";
     public final static String DATABASE_NAME = "DatabaseName=mydata";
     public final static String USERNAME = "aaa";
     public final static String PASSWORD = "aaa";
         public DataServiceImpl(){

     }
     // 查詢數據庫
     private ResultSet executeQuery(String sqlText){
         try{
             Class.forName(DRIVER);
         }catch(ClassNotFoundException e){
             e.printStackTrace();
         }
         try{
             conn = DriverManager.getConnection(CONN_STR_PRE + HOST_NAME + DATABASE_NAME, USERNAME, PASSWORD);
             stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery(sqlText);
             return rs;
         }catch(SQLException e){
             e.printStackTrace();
         }
         return null;
     }
     // 查詢公告. 這個是本程序的關鍵代碼
     public NoticeInfo[] getNotices(){
         ArrayList noticeList = new ArrayList();       
         String sqlText = "select author,content,date,title from Bulletin";       
         ResultSet rs = executeQuery(sqlText);        
         try{
             while(rs.next()){
                 NoticeInfo temp = new NoticeInfo();
                 temp.setAuthor(rs.getString("author"));
                 temp.setContent(rs.getString("content"));
                 temp.setDates(rs.getDate("date"));
                 temp.setTitle(rs.getString("title"));
                 noticeList.add(temp);
             }          
             NoticeInfo[] notices = new NoticeInfo[noticeList.size()];
             for(int i=0;i<noticeList.size();i++){
                 notices = (NoticeInfo)noticeList.get(i);
             }
             return notices;
         }catch(SQLException e){
             e.printStackTrace();
             return null;
         }
     }
}

第三步: 配置Flex Data Service
1,把剛纔寫的JAVA文件編譯。打開FDS的安裝文件夾,將編譯的文件拷貝到\jrun4\servers\default\flex\WEB-INF\classes 文件夾中,進行下面的配置。
2.打開FDS的安裝文件夾。進入jrun4\servers\default\flex\WEB-INF\flex 目錄。裏面是關於FlexData Service的配置文件,我們這裏只看RemoteObject如何配置,其它配置信息請自己看幫助。現在我們打開裏面的remoting-config.xml文件。向裏面添加如下信息,作爲的子標籤:
程序代碼

<destination id="dataService">
     <properties>
           <source>net.zhuoqun.connectDB.DataServiceImpl</source>
     </properties>
</destination>

當你設定了 destination的時候,你就引用了了可以用來連接相應類的信息通道(messaging channel)。它的id必須在文件中是獨一無二的。source屬性是指你編譯的JAVA類在classes文件夾中的路徑。由於我的DataServiceImpl類在classes\net\zhuoqun\connectDB中,所以source的值爲net.zhuoqun.connectDB.DataServiceImpl。記住,不要寫.class後綴。標籤還可以有一個子標籤,其作用我在這裏就不說了,大家自己看相關文檔(關於FDS的配置其實有很多東西,這些在幫助文檔裏都有,我這裏不多說了,也說不過來,自己看吧)。
現在我們已經配置好了後臺的 FDS,做完了整個程序的大部分工作,接下來就是前臺Flex程序調用的事情了。
第四步:創建Flex程序
打開Flex Builder,新建一個工程 ConnectDB。菜單欄中 File -> New -> Flex Project,這時會彈出一個對話框,選擇 Flex Data Service,創建了一個Flex工程。
第五步:通過 RemoteObject 訪問數據庫
打開工程中生成的主文件 ConnectDB.mxml,聲明一個 RemoteObject :
程序代碼

<mxataGrid id="myDG">
     <mx:columns>
         <mxataGridColumn headerText="標題" dataField="title"/>
         <mxataGridColumn headerText="發佈日期" dataField="dates" labelFunction="formatDate"/>
     </mx:columns>
</mx:DataGrid>

其中headerText是顯示在上方的表頭,dataField表示要顯示的數據域,爲什麼數據域是title和dates呢?因爲我們傳回的是一個NoticeInfo 對象數組,雖然它是作爲一個對象傳回來的,但是其中的數據結構並沒有變,那些數據域的名字也沒有變,所以我們可以根據NoticeInfo 中的變量設定dataField。labelFunction屬性是用來格式化顯示的,因爲傳回來的是格林威治時間,所以我們需要將其格式化然後顯示出來。注意,這裏只是顯示兩個數據域,並不代表其它的數據都沒有了,它們仍然存在,只是沒有顯示出來。
接下來,在 標籤中編寫proccessResult()方法和格式化日期的 formatDate方法:
程序代碼

private function proccessResult(result:Object):void
{
     myDG.dataProvider = ArrayUtil.toArray(result);
}
private function formatDate(item:Object,column:DataGridColumn):String
{
     return df.format(item.dates);
}  

// df 是一個 DateFormatter,在下面會給出。關於如何格式化DataGrid的顯示
// 以及DateFormatter這裏就不討論了,幫助裏寫得很清楚
這個函數只是簡單地將獲得的數據傳給 myDG 的 dataProvider。result的類型是Object,因爲數據是作爲一個對象傳過來的。之所以調用 ArrayUtil.toArray()這個方法,是因爲返回的記錄可能只有一條,而myDG 的 dataProvider顯示單個對象的時候可能會出錯,所以安全起見先將其轉換成數組。
最後,我們編寫調用 RemoteObject 的方法,使其在程序啓動時就調用。
程序代碼

private function initApp():void
{
       getData.getNotices();
}

其中 getData 是RemoteObject的id,getNotices()是DataServiceImpl.java中的方法。在這裏可以直接調用它。當然,如果DataServiceImpl.java有其它方法,也可以通過這種方式直接調用。接下來設定組件創建完畢時調用 initApp()方法,在中添加一個creationComplete屬性:
程序代碼

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" fontSize="12" creationComplete="initApp()">

ConnectDB.mxml的全部代碼:
程序代碼

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" fontSize="12" creationComplete="initApp()">
     <mx:Script>
         <![CDATA[
             import mx.controls.Alert;           
             import mx.utils.ArrayUtil;        
             private function initApp():void
             {
                 getData.getNotices();
             }
             private function proccessResult(result:Object):void
             {
                 myDG.dataProvider = ArrayUtil.toArray(result);
             }
             private function formatDate(item:Object,column:DataGridColumn):String
             {
                 return df.format(item.dates);
             }// df 是一個 DateFormatter,在下面會給出。關於如何格式化DataGrid的顯示
             // 以及DateFormatter這裏就不討論了,幫助裏寫得很清楚
         ]]>
     </mx:Script>
     <mx:DateFormatter id="df" formatString="YYYY-MM-DD"/>
   <mx:RemoteObject id="getData" destination="dataService"result="proccessResult(event.result)"fault="Alert.show(event.fault.faultString,'Error')"/>   
     <mx:DataGrid id="myDG">
         <mx:columns>
             <mx:DataGridColumn headerText="標題" dataField="title"/>
             <mx:DataGridColumn headerText="發佈日期" dataField="dates" labelFunction="formatDate"/>
         </mx:columns>
     </mx:DataGrid>
</mx:Application>

整個工程終於完成,啓動JRUN,然後運行程序,查看程序結果
如果是其他數據庫,只需要改一下數據庫驅動信息就可以了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章