丄諦啲仇魜ヤ
          如 果 敵 人 讓 你 生 氣 , 那 說 明 你 沒 有 勝 他 的 把 握!
          posts - 6,comments - 56,trackbacks - 1

          首先,做一點說明。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文件。向里面添加如下信息,作為<service>的子標簽:
          程序代碼
          <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后綴。<properties>標簽還可以有一個<scope>子標簽,其作用我在這里就不說了,大家自己看相關文檔(關于FDS的配置其實有很多東西,這些在幫助文檔里都有,我這里不多說了,也說不過來,自己看吧)。
          現在我們已經配置好了后臺的 FDS,做完了整個程序的大部分工作,接下來就是前臺Flex程序調用的事情了。
          第四步:創建Flex程序
          打開Flex Builder,新建一個工程 ConnectDB。菜單欄中 File -> New -> Flex Project,這時會彈出一個對話框,選擇 Flex Data Service,創建了一個Flex工程。
          第五步:通過 RemoteObject 訪問數據庫
          打開工程中生成的主文件 ConnectDB.mxml,聲明一個 RemoteObject :
          程序代碼
          <mx:RemoteObjectid="getData" destination="dataService"result="proccessResult(event.result)"fault="Alert.show(event.fault.faultString,'Error')"/>
          其中destination 的值是剛才我們在配置 FDS 的時候設定的 destination。 result 表示在這個RemoteObject成功返回之后所要做的動作,這里我們調用一個方法 proccessResult()來處理返回的數據,它的參數 event.result就是從服務器段獲得的數據,數據是作為一個對象傳過來的。 fault表示在這個RemoteObject請求失敗時要做的處理,這里我們會彈出一個顯示錯誤信息的對話框。接下來我們要聲明一個DataGrid控件來顯示公告的標題和發布日期:
          程序代碼
          <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屬性是用來格式化顯示的,因為傳回來的是格林威治時間,所以我們需要將其格式化然后顯示出來。注意,這里只是顯示兩個數據域,并不代表其它的數據都沒有了,它們仍然存在,只是沒有顯示出來。
          接下來,在 <mx:Script> 標簽中編寫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()方法,在<mx:Application>中添加一個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,然后運行程序,查看程序結果
          如果是其他數據庫,只需要改一下數據庫驅動信息就可以了

          posted on 2009-04-13 17:14 Crying 閱讀(584) 評論(0)  編輯  收藏 所屬分類: FLEX
          主站蜘蛛池模板: 常熟市| 土默特右旗| 河津市| 静安区| 贡嘎县| 焉耆| 高平市| 抚顺市| 东辽县| 青浦区| 平度市| 鹤岗市| 施秉县| 铜鼓县| 高尔夫| 西昌市| 延寿县| 定西市| 临沂市| 鸡泽县| 兴宁市| 怀柔区| 苏尼特右旗| 纳雍县| 潞西市| 安国市| 太原市| 东城区| 四平市| 会同县| 竹溪县| 新野县| 义马市| 龙口市| 阳原县| 军事| 稻城县| 福安市| 花莲市| 巴中市| 临江市|