Flex与.NET互操作(三):基于WebService的数据访问(下)
在上一篇文章《Flex與.NET互操作(二):基于WebService的數據訪問(上)?》中介紹了通過<mx:WebService>標簽來訪問Webservice。實際上我們也可以通過編程的方式動態的訪問WebService,Flex SDK為我們提供了WebService類。
?????使用WebService類來訪問WebService其實也就是將<mx:WebService>標簽的屬性通過類對象的屬性形式來表示,相比之下使用WebService類比使用<mx:WebService>標簽要靈活。下面我們來看看編程方式怎么連接和調用遠程方法:
1?????internalfunction?onClick():void2?{3?var?service:WebService?=newWebService();4?service.loadWSDL("http://localhost:1146/FlashFlexService.asmx?wsdl");5?service.addEventListener(ResultEvent.RESULT,onResult);6?service.addEventListener(FaultEvent.FAULT,onFault);7?service.GetBook();8?}?????直接通過類對象的loadWSDL()方法調用遠程WebService,動態為類對象指定相關的處理函數,然后和標簽一樣調用遠程WebService方法既可。
1?????internalfunction?onResult(evt:ResultEvent):void2?{3?Alert.show(evt.result.Id);4?}5?6?internalfunction?onFault(evt:FaultEvent):void7?{8?Alert.show(evt.fault.faultDetail.toString());9?}?????如上便完成了使用WebService類通過編程的方式訪問遠程WebService方法的調用。
?????下面來看看WebService返回DataTable等負責類型,在Flex客戶端該怎么解析。首先定義WebService方法如下:
1?[WebMethod(Description="該方法將返回DataTable類型的數據")]2?publicDataTable?GetDataTable()3?{4?DataTable?dt?=newDataTable("Books");5?dt.Columns.Add("Id",?typeof(int));6?dt.Columns.Add("Name",?typeof(string));7?dt.Columns.Add("Author",?typeof(string));8?dt.Columns.Add("Price",?typeof(double));9?10?DataRow?dr?=dt.NewRow();11?dr["Id"]?=1;12?dr["Name"]?="《Flex游戲開發》";13?dr["Author"]?="張三";14?dr["Price"]?=54.85;15?dt.Rows.Add(dr);16?17?dr?=dt.NewRow();18?dr["Id"]?=2;19?dr["Name"]?="《Flash游戲開發》";20?dr["Author"]?="李四";21?dr["Price"]?=65.50;22?dt.Rows.Add(dr);23?24?returndt;25?}?????同樣在Flex客戶端通過WebService來訪問就可以了,下面是使用<mx:WebServive>標簽訪問(這里需要注意,<mx:operation>標簽的name必須與服務端的WebService方法同名):
1?<mx:WebService?id="myService"2?wsdl="http://localhost:1146/DataWebService.asmx?wsdl"useProxy="false">3?<mx:operation?name="GetDataTable">4?</mx:operation>5?</mx:WebService>?????提供好了WebService,客戶端也連接上了WebService,現在只差調用WebService提供的遠程方法了。如下:
1?????internalfunction?onTable():void2?{3?myService.addEventListener(ResultEvent.RESULT,onSuccess);4?myService.addEventListener(FaultEvent.FAULT,onFault);5?myService.GetDataTable.send();6?}7?8?internalfunction?onSuccess(evt:ResultEvent):void9?{10?//bookGrid.dataProvider=this.myService.GetDataTable.lastResult.Tables.Books.Rows;11?}12?13?internalfunction?onFault(evt:FaultEvent):void14?{15?Alert.show("調用WebService方法失敗,詳細:"+evt.fault.faultDetail.toString());16?17?}?????將WebService的返回值綁定在Flex的DataGrid組件,mxml的相關代碼如下:
1?<mx:Panel?x="41"y="123"width="480"height="279"layout="absolute"fontSize="12">2?<mx:DataGrid?x="10"y="10"width="436"id="bookGrid"3?dataProvider="{this.myService.GetDataTable.lastResult.Tables.Books.Rows}">4?<mx:columns>5?<mx:DataGridColumn?headerText="編號"dataField="Id"/>6?<mx:DataGridColumn?headerText="書名"dataField="Name"/>7?<mx:DataGridColumn?headerText="作者"dataField="Author"/>8?<mx:DataGridColumn?headerText="價格"dataField="Price"/>9?</mx:columns>10?</mx:DataGrid>11?<mx:ControlBar>12?<mx:Button?label="DataTable"click="onTable()"/>13?</mx:ControlBar>14?</mx:Panel>?????通過DataGrid的dataProvider屬性綁定DataGrid組件的數據源,除了直接通過"{}"綁定表達式幫定外我們也可以在調用遠程方法成功的處理函數里給DataGrid指定數據源,見上面代碼中注釋的代碼部分。{this.myService.GetDataTable.lastResult.Tables.Books.Rows}表示將遠程WebService方法GetDataTable()的返回結果(DataTable)的所有行作為數據源與DataGrid組件進綁定,其中Books為數據源DataTable的name,詳細見前面WebService方法的定義出。程序運行結果如下圖:
?????????
?????DataSet,DataTable相比泛型集合來說,性能上有很大的差距,復雜的序列化和反序列化過程也很負責,自從.net 2.0推出泛型到現在,我一直就比較喜歡用泛型來傳遞大數據。OK,下面我將介紹下在Flex中怎么去處理WebService方法返回的泛型集合數據。我們有如下WebService方法定義:
1?????[WebMethod(Description="該方法返回泛型集合")]2?publicList<Book>BookList()3?{4?returnnewList<Book>5?{6?newBook7?{8?Id?=1,9?Name?="《Flex游戲開發》",10?Author?="張三",11?Price?=54.8512?},13?newBook14?{15?Id?=1,16?Name?="《Flash游戲開發》",17?Author?="李四",18?Price?=65.5019?}20?};21?}?????相比DataSet,DataTable類型,使用List<>返回數據我個人認為更方面容易處理。我們直接在WebService的調試環境下測試返回List<>的WebService方法可以看到如下結果:
???????
??????這就是以泛型結合(List<>)的形式返回的數據形式,相比DataTable的返回結果更為簡潔,明了。話說到此,我們在Flex下該怎么去獲取這個返回值和處理這個值呢?其實這里已經很清楚的展現了我們可以通過什么方式去處理,仔細看上圖會發現"ArrayOfBook"????這是什么東西?莫非是在客戶端可以通過數組的形式得到這個返回值。為了進一步搞清楚這里面的的點點滴滴,我們需要深入到內部去了解下返回值的具體構造,通過Flex Builder的調試環境可以得到如下信息:??
??????????
?????看清楚了嗎?BookList方法的lastResult結構集下有兩個對象,點開節點可知正是我們通過List<Book>返回的兩個Book對象,而lastResult的類型是:mx.collections.ArrayCollection,這不真是ActionScript中的數組集合嗎?好的,既然這樣,在Flex客戶端便可以直接通過lastResult得到WebService返回的泛型集合數據了。如下代碼塊:
1?internalfunction?onTable():void2?{3?myService.addEventListener(ResultEvent.RESULT,onSuccess);4?myService.addEventListener(FaultEvent.FAULT,onFault);5?myService.BookList.send();6?}7?8?internalfunction?onSuccess(evt:ResultEvent):void9?{10?var?arrC:ArrayCollection?=this.myService.BookList.lastResult?asArrayCollection;11?bookGrid.dataProvider=arrC;12?}13?14?internalfunction?onFault(evt:FaultEvent):void15?{16?Alert.show("調用WebService方法失敗,詳細:"+evt.fault.faultDetail.toString());17?18?}?????對應的mxml代碼如下(運行結果和上面返回DataTable類型一樣):
1?<mx:Panel?x="41"y="123"width="480"height="279"layout="absolute"fontSize="12">2?<mx:DataGrid?x="10"y="10"width="436"id="bookGrid">3?<mx:columns>4?<mx:DataGridColumn?headerText="編號"dataField="Id"/>5?<mx:DataGridColumn?headerText="書名"dataField="Name"/>6?<mx:DataGridColumn?headerText="作者"dataField="Author"/>7?<mx:DataGridColumn?headerText="價格"dataField="Price"/>8?</mx:columns>9?</mx:DataGrid>10?<mx:ControlBar>11?<mx:Button?label="DataTable"click="onTable()"/>12?</mx:ControlBar>13?</mx:Panel>?????關于WebService的數據訪問就介紹到這里,由于個人能力有限,文中有不足之處還望大家指正。如果有什么好的建議也可以提出,大家相互討論,學習,共同進步!!
版權說明? 本文屬原創文章,歡迎轉載,其版權歸作者和博客園共有。??
? 作??????者:Beniao
?文章出處:http://www.cnblogs.com/
總結
以上是生活随笔為你收集整理的Flex与.NET互操作(三):基于WebService的数据访问(下)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 店面起名字,要注意什么问题呢?
- 下一篇: Flex与.NET互操作(四):使用Ht