小菜毛毛技術分享

          與大家共同成長

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            164 Posts :: 141 Stories :: 94 Comments :: 0 Trackbacks
          最近學習flex,參考了不少網上的資料,特別是 中國flex開發(fā)者(http://www.flexer.cn/)。flex數(shù)據(jù)交互是一個關鍵,做個學習總結,請flex老鳥指正!

          flex和后端的數(shù)據(jù)交互有很多方式,flex可以使用ActionScript讀寫文件(xml、txt)的形式存儲顯示數(shù)據(jù),
          Flex 3.0中新增了對本地數(shù)據(jù)庫(.db格式)操作的類,可用于讀取本地的數(shù)據(jù)庫數(shù)據(jù)。新增了對PDF數(shù)據(jù)
          操作的類,可用于讀取PDF數(shù)據(jù)。

          xml文件方式

          XML優(yōu)點是簡單小巧、存儲方便、檢索快速。所以,XML常用于數(shù)據(jù)存儲和數(shù)據(jù)交換。Flex 3.使用URLLoader類可方便地傳輸XML數(shù)據(jù)。
          使用XML方式傳輸數(shù)據(jù)的步驟如下所示。
          新建名為"tree.xml"文件,用以存儲XML數(shù)據(jù):
          Xml代碼 復制代碼
          1. <?xml version="1.0" encoding="utf-8"?>  
          2. <menus>  
          3.     <node label="Mail">  
          4.         <node label="Inbox"/>  
          5.         <node label="Personal Folder">  
          6.             <node label="Demo"/>  
          7.             <node label="Personal"/>  
          8.             <node label="Saved Mail"/>  
          9.             <node label="bar"/>  
          10.         </node>  
          11.         <node label="Calendar"/>  
          12.         <node label="Sent"/>  
          13.         <node label="Trash"/>  
          14.     </node>  
          15. </menus>  

          xml文件的讀寫我們可以用FileStream類來實現(xiàn):
          讀取xml文件:
          Javascript代碼 復制代碼
          1. var testXML:XML;   
          2. var file:File = File.documentsDirectory.resolvePath("tree.xml");   
          3. var fileStream:FileStream = new FileStream();   
          4. fileStream.open(file, FileMode.READ);   
          5. testXML = XML(fileStream.readUTFBytes(fileStream.bytesAvailable));   
          6. fileStream.close();  

          寫回xml文件
          Javascript代碼 復制代碼
          1. var testXML:XML=<content>content</content>......;   
          2. var file:File = File.documentsDirectory.resolvePath("tree.xml");   
          3. var fileStream:FileStream = new FileStream();   
          4. fileStream.open(file, FileMode.WRITE);   
          5. var outputString:String = '<?xml version="1.0" encoding="utf-8"?>\n';   
          6. outputString += testXML.toXMLString();   
          7. fileStream.writeUTFBytes(outputString);   
          8. fileStream.close();  

          需要說明一下的是文件打開方式:FileMode
          READ --設置文件打開方式為只讀
          WRITE--設置文件打開方式為寫數(shù)據(jù)。文件不存在,則創(chuàng)建;文件存在,則覆蓋原有數(shù)據(jù)。
          APPEND--設置文件打開方式為追加。文件不存在,則創(chuàng)建;文件存在,則新數(shù)據(jù)從文件末尾開始增加。
          UPDATE--設置文件打開方式為讀寫。文件不存在,則創(chuàng)建。設置該模式通常用于隨機讀寫訪問文件。可以從文件的任意位置讀取,寫入數(shù)據(jù)時,只有寫入位置的存在字節(jié)被覆蓋,其他所有字節(jié)不受影響。

          這里我們使用URLRequest類來加載xml數(shù)據(jù),編寫應用程序初始化處理函數(shù)loadXML。
          變量,用以指明XML文件路徑。
          public function loadXML():void//應用程序初始化處理函數(shù)
          {
              //定義URLRequest實例,指定文件地址。
              var request:URLRequest=new URLRequest("tree.xml");
              loader.load(request);//加載XML文件
              loader.addEventListener(Event.COMPLETE,completeHandle);     //添加加載完成時的監(jiān)聽
          }

          loader.addEventListener(Event.COMPLETE,completeHandle)語句表示添加對XML加載完成事件的監(jiān)聽。一旦加載完成執(zhí)行
          completeHandle函數(shù)。完成剩余MXML代碼。剩余代碼包括completeHandle函數(shù),<mx:Tree>組件設計等。
          以下代碼是完整的MXML代碼。
          Java代碼 復制代碼
          1. <?xml version="1.0" encoding="utf-8"?>   
          2. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" fontFamily="simsun"    
          3.     fontSize="12" layout="absolute" width="242" height="442" creationComplete="loadXML()">   
          4.     <mx:Script>   
          5.           <![CDATA[   
          6.             import mx.collections.ArrayCollection;    
          7.             import mx.rpc.events.ResultEvent;          
          8.             public var loader:URLLoader=new URLLoader();   
          9.             public var menus:XML=new XML();            
          10.             public function loadXML():void             
          11.             {   
          12.                 var request:URLRequest=new URLRequest("tree.xml");   
          13.                 loader.load(request);    
          14.                 loader.addEventListener(Event.COMPLETE,completeHandle);   
          15.             }   
          16.             public function completeHandle(e:Event):void  
          17.             {   
          18.                 menus=XML(loader.data);               
          19.                 var results:XMLList=menus.node;       
          20.                 tree.dataProvider=results;    
          21.             }   
          22.           ]]>   
          23.     </mx:Script>   
          24.   
          25.     <mx:Tree id="tree" x="10" y="35" width="218" height="397" labelField="@label" />   
          26.     <mx:Label x="10" y="10" text="Tree Nodes From XML File"/>   
          27.  </mx:Application>  

          這是運行結果截圖:



          <mx:HTTPService>組件方式


          <mx:HTTPService>組件可與所有的后端程序交互。例如,ASP、ASP.Net、JSP、PHP等。
          以下是一個<mx:HTTPService>組件語法示例:
          <mx:HTTPService id="feedRequest" url="http://localhost:8080/myflex/helloworld?para_1=para_1&para_2=para_2" result="showResult(event)" />
          id唯一標識該組件,url是數(shù)據(jù)提交的地址,可以在地址后面添加參數(shù),提交到后端進行處理,處理后
          再返回Flex可識別的數(shù)據(jù)類型,如數(shù)組型、XML型、Object型等。

          <mx:HTTPService>組件返回的數(shù)據(jù)存儲于ResultEvent類中。使用<mx:HTTPService>組件的result事件可處理HTTP程序返回的數(shù)據(jù)。
          eg. <mx:HTTPService result="處理函數(shù)名">

          返回的數(shù)據(jù)存儲于ResultEvent類的result屬性下。各種數(shù)據(jù)的具體位置與HTTP程序的處理結果有關。
          數(shù)據(jù)返回后的處理方法示例:
          Java代碼 復制代碼
          1. import mx.rpc.events.ResultEvent;                          
          2. import mx.controls.Alert;                                 
          3.   
          4. private function showResult(e:ResultEvent):void  
          5. {   
          6.     Alert.show(e.result as String);                       
          7. }  


          來一個簡單的例子會讓你更加明白的!

          這是客戶端mxml的源代碼:
          Xml代碼 復制代碼
          1. <?xml version="1.0" encoding="utf-8"?>  
          2. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" >  
          3.     <mx:Script>     
          4.       <![CDATA[    
          5.         import mx.rpc.events.ResultEvent;                
          6.         import mx.controls.Alert;                     
          7.           
          8.         private var arr:Array=new Array();               
          9.         private function addHandle():void             
          10.         {  
          11.             myHttp.url="http://localhost:8080/myflex/sum";                                                       
          12.             if(arr.length>0)                             
          13.                 myHttp.url+="?";  
          14.             for(var i:int=0;i<arr.length;i++)             
          15.             {  
          16.                 if(i!=arr.length-1)  
          17.                     myHttp.url+="num="+arr[i].para.toString()+"&";  
          18.                 else  
          19.                     myHttp.url+="num="+arr[i].para.toString();  
          20.             }  
          21.             Alert.show(myHttp.url);  
          22.             myHttp.send();                         
          23.         }  
          24.           
          25.         private function addData():void           
          26.         {  
          27.             var obj:Object=new Object();             
          28.             obj.para=txtPara.text;                  
          29.             arr.push(obj);                          
          30.             dg.dataProvider=arr;                     
          31.             txtPara.text="";                       
          32.             dg.validateNow();                        
          33.         }  
          34.           
          35.         private function delData():void           
          36.         {  
          37.             arr=new Array();                               
          38.             dg.dataProvider=arr;                   
          39.             dg.validateNow();                        
          40.         }  
          41.           
          42.         private function httpHandle(e:ResultEvent):void  
          43.         {  
          44.             lblResult.text=e.result.sumTag;  
          45.         }  
          46.         ]]>     
          47.     </mx:Script>     
          48.     <mx:HTTPService id="myHttp" showBusyCursor="true" result="httpHandle(event);" useProxy="false"/>  
          49.     <mx:Panel title="測試HTTPService" width="368" height="334" x="78" y="30" layout="absolute">  
          50.         <mx:Label text="疊加參數(shù):" x="110" y="26"/>  
          51.         <mx:TextInput id="txtPara" x="161" y="24" width="95"/>    
          52.         <mx:DataGrid id="dg" x="76" y="64" height="166" width="179">  
          53.             <mx:columns>  
          54.                 <mx:DataGridColumn dataField="para" headerText="參數(shù)列表"/>  
          55.             </mx:columns>  
          56.         </mx:DataGrid>  
          57.         <mx:Button label="添加" click="addData();" x="277" y="26"/>     
          58.         <mx:Button label="刪除" click="delData();" x="277" y="64"/>     
          59.         <mx:Label text="疊加結果是:" x="58" y="253"/>  
          60.         <mx:Label x="126" y="253" id="lblResult"/>     
          61.         <mx:Button label="計算" click="addHandle();" x="277" y="249"/>      
          62.     </mx:Panel>  
          63. </mx:Application>  

          "http://localhost:8080/myflex/sum"是一個servlet的映射地址,actionscript方法addHandle將每一個數(shù)字參數(shù)添加到url映射地
          址后面并且向服務器發(fā)送請求,addData方法把輸入的數(shù)字顯示到下方列表,delData方法刪除整個列表,httpHandle方法處理服務器
          的返回值。其中e.result.sumTag表示取得xml返回數(shù)據(jù)中sumTag標簽中的內容。
          以下是servlet中對接收參數(shù)的處理:
          Java代碼 復制代碼
          1. public void doPost(HttpServletRequest request, HttpServletResponse response)   
          2.             throws ServletException, IOException   
          3.     {   
          4.         String[] para = request.getParameterValues("num");   
          5.         int sum = 0;   
          6.         if (para != null)   
          7.         {   
          8.             for (int i = 0; i < para.length; i++)   
          9.             {   
          10.                 if (para[i] != null && !"".equals(para[i]))   
          11.                 {   
          12.                     sum = sum + Integer.parseInt(para[i]);   
          13.                 }   
          14.             }   
          15.         }   
          16.         response.getWriter().print(   
          17.                 "<?xml version=\"1.0\" encoding=\"utf-8\"?><sumTag>" + sum   
          18.                         + "</sumTag>");   
          19.     }  


          下面是例子運行的截圖:


          下一次學習總結一下<mx:WebService>組件和RemoteObject及其他的交互方式!
          posted on 2009-07-28 13:53 小菜毛毛 閱讀(1573) 評論(0)  編輯  收藏 所屬分類: FLEX
          主站蜘蛛池模板: 专栏| 井冈山市| 丘北县| 六安市| 湘潭市| 巴林左旗| 库尔勒市| 塔河县| 新安县| 合阳县| 呼伦贝尔市| 微山县| 渝北区| 博白县| 峨眉山市| 比如县| 安宁市| 衡山县| 上思县| 合山市| 凌源市| 芜湖市| 开阳县| 定远县| 鄂尔多斯市| 兰考县| 垣曲县| 中山市| 荥阳市| 海城市| 洛浦县| 浠水县| 湾仔区| 邵东县| 工布江达县| 原平市| 微山县| 金乡县| 荥经县| 大荔县| 广安市|