小菜毛毛技術分享

          與大家共同成長

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

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

          xml文件方式

          XML優點是簡單小巧、存儲方便、檢索快速。所以,XML常用于數據存儲和數據交換。Flex 3.使用URLLoader類可方便地傳輸XML數據。
          使用XML方式傳輸數據的步驟如下所示。
          新建名為"tree.xml"文件,用以存儲XML數據:
          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類來實現:
          讀取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--設置文件打開方式為寫數據。文件不存在,則創建;文件存在,則覆蓋原有數據。
          APPEND--設置文件打開方式為追加。文件不存在,則創建;文件存在,則新數據從文件末尾開始增加。
          UPDATE--設置文件打開方式為讀寫。文件不存在,則創建。設置該模式通常用于隨機讀寫訪問文件。可以從文件的任意位置讀取,寫入數據時,只有寫入位置的存在字節被覆蓋,其他所有字節不受影響。

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

          loader.addEventListener(Event.COMPLETE,completeHandle)語句表示添加對XML加載完成事件的監聽。一旦加載完成執行
          completeHandle函數。完成剩余MXML代碼。剩余代碼包括completeHandle函數,<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是數據提交的地址,可以在地址后面添加參數,提交到后端進行處理,處理后
          再返回Flex可識別的數據類型,如數組型、XML型、Object型等。

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

          返回的數據存儲于ResultEvent類的result屬性下。各種數據的具體位置與HTTP程序的處理結果有關。
          數據返回后的處理方法示例:
          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="疊加參數:" 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="參數列表"/>  
          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將每一個數字參數添加到url映射地
          址后面并且向服務器發送請求,addData方法把輸入的數字顯示到下方列表,delData方法刪除整個列表,httpHandle方法處理服務器
          的返回值。其中e.result.sumTag表示取得xml返回數據中sumTag標簽中的內容。
          以下是servlet中對接收參數的處理:
          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 小菜毛毛 閱讀(1574) 評論(0)  編輯  收藏 所屬分類: FLEX
          主站蜘蛛池模板: 德昌县| 湖口县| 龙岩市| 宝鸡市| 马龙县| 蒲城县| 兴和县| 盐山县| 平远县| 晋州市| 安仁县| 乌什县| 安达市| 成武县| 康乐县| 彭水| 河津市| 娱乐| 泰顺县| 驻马店市| 郁南县| 扶沟县| 光泽县| 高雄市| 高台县| 东港市| 高淳县| 华池县| 新化县| 桦南县| 韩城市| 托克托县| 徐闻县| 禄丰县| 收藏| 宁河县| 灵丘县| 南康市| 弋阳县| 渝中区| 改则县|