基于WebService的數(shù)據(jù)訪問(wèn)(下) Flex與.NET互操作(三)
使用WebService類來(lái)訪問(wèn)WebService其實(shí)也就是將<mx:WebService>標(biāo)簽的屬性通過(guò)類對(duì)象的屬性形式來(lái)表示,相比之下使用WebService類比使用<mx:WebService>標(biāo)簽要靈活。下面我們來(lái)看看編程方式怎么連接和調(diào)用遠(yuǎn)程方法:
2 {
3 var service:WebService = new WebService();
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 }
直接通過(guò)類對(duì)象的loadWSDL()方法調(diào)用遠(yuǎn)程WebService,動(dòng)態(tài)為類對(duì)象指定相關(guān)的處理函數(shù),然后和標(biāo)簽一樣調(diào)用遠(yuǎn)程WebService方法既可。
2 {
3 Alert.show(evt.result.Id);
4 }
5
6 internal function onFault(evt:FaultEvent):void
7 {
8 Alert.show(evt.fault.faultDetail.toString());
9 }
如上便完成了使用WebService類通過(guò)編程的方式訪問(wèn)遠(yuǎn)程WebService方法的調(diào)用。
下面來(lái)看看WebService返回DataTable等負(fù)責(zé)類型,在Flex客戶端該怎么解析。首先定義WebService方法如下:
2 public DataTable GetDataTable()
3 {
4 DataTable dt = new DataTable("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游戲開(kāi)發(fā)》";
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游戲開(kāi)發(fā)》";
20 dr["Author"] = "李四";
21 dr["Price"] = 65.50;
22 dt.Rows.Add(dr);
23
24 return dt;
25 }
同樣在Flex客戶端通過(guò)WebService來(lái)訪問(wèn)就可以了,下面是使用<mx:WebServive>標(biāo)簽訪問(wèn)(這里需要注意,<mx:operation>標(biāo)簽的name必須與服務(wù)端的WebService方法同名):
2 wsdl="http://localhost:1146/DataWebService.asmx?wsdl" useProxy="false">
3 <mx:operation name="GetDataTable">
4 </mx:operation>
5 </mx:WebService>
提供好了WebService,客戶端也連接上了WebService,現(xiàn)在只差調(diào)用WebService提供的遠(yuǎn)程方法了。如下:
2 {
3 myService.addEventListener(ResultEvent.RESULT,onSuccess);
4 myService.addEventListener(FaultEvent.FAULT,onFault);
5 myService.GetDataTable.send();
6 }
7
8 internal function onSuccess(evt:ResultEvent):void
9 {
10 //bookGrid.dataProvider=this.myService.GetDataTable.lastResult.Tables.Books.Rows;
11 }
12
13 internal function onFault(evt:FaultEvent):void
14 {
15 Alert.show("調(diào)用WebService方法失敗,詳細(xì):" + evt.fault.faultDetail.toString());
16
17 }
將WebService的返回值綁定在Flex的DataGrid組件,mxml的相關(guān)代碼如下:
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="編號(hào)" dataField="Id"/>
6 <mx:DataGridColumn headerText="書名" dataField="Name"/>
7 <mx:DataGridColumn headerText="作者" dataField="Author"/>
8 <mx:DataGridColumn headerText="價(jià)格" dataField="Price"/>
9 </mx:columns>
10 </mx:DataGrid>
11 <mx:ControlBar>
12 <mx:Button label="DataTable" click="onTable()"/>
13 </mx:ControlBar>
14 </mx:Panel>
通過(guò)DataGrid的dataProvider屬性綁定DataGrid組件的數(shù)據(jù)源,除了直接通過(guò)"{}"綁定表達(dá)式幫定外我們也可以在調(diào)用遠(yuǎn)程方法成功的處理函數(shù)里給DataGrid指定數(shù)據(jù)源,見(jiàn)上面代碼中注釋的代碼部分。{this.myService.GetDataTable.lastResult.Tables.Books.Rows}表示將遠(yuǎn)程 WebService方法GetDataTable()的返回結(jié)果(DataTable)的所有行作為數(shù)據(jù)源與DataGrid組件進(jìn)綁定,其中 Books為數(shù)據(jù)源DataTable的name,詳細(xì)見(jiàn)前面WebService方法的定義出。程序運(yùn)行結(jié)果如下圖:
DataSet,DataTable相比泛型集合來(lái)說(shuō),性能上有很大的差距,復(fù)雜的序列化和反序列化過(guò)程也很負(fù)責(zé),自從.net 2.0推出泛型到現(xiàn)在,我一直就比較喜歡用泛型來(lái)傳遞大數(shù)據(jù)。OK,下面我將介紹下在Flex中怎么去處理WebService方法返回的泛型集合數(shù)據(jù)。我們有如下WebService方法定義:
2 public List<Book> BookList()
3 {
4 return new List<Book>
5 {
6 new Book
7 {
8 Id = 1,
9 Name = "《Flex游戲開(kāi)發(fā)》",
10 Author = "張三",
11 Price = 54.85
12 },
13 new Book
14 {
15 Id = 1,
16 Name = "《Flash游戲開(kāi)發(fā)》",
17 Author = "李四",
18 Price = 65.50
19 }
20 };
21 }
相比DataSet,DataTable類型,使用List<>返回?cái)?shù)據(jù)我個(gè)人認(rèn)為更方面容易處理。我們直接在WebService的調(diào)試環(huán)境下測(cè)試返回List<>的WebService方法可以看到如下結(jié)果:
這就是以泛型結(jié)合(List<>)的形式返回的數(shù)據(jù)形式,相比DataTable的返回結(jié)果更為簡(jiǎn)潔,明了。話說(shuō)到此,我們?cè)贔lex下該怎么去獲取這個(gè)返回值和處理這個(gè)值呢?其實(shí)這里已經(jīng)很清楚的展現(xiàn)了我們可以通過(guò)什么方式去處理,仔細(xì)看上圖會(huì)發(fā)現(xiàn)"ArrayOfBook"????這是什么東西?莫非是在客戶端可以通過(guò)數(shù)組的形式得到這個(gè)返回值。為了進(jìn)一步搞清楚這里面的的點(diǎn)點(diǎn)滴滴,我們需要深入到內(nèi)部去了解下返回值的具體構(gòu)造,通過(guò)Flex Builder的調(diào)試環(huán)境可以得到如下信息:
看清楚了嗎?BookList方法的lastResult結(jié)構(gòu)集下有兩個(gè)對(duì)象,點(diǎn)開(kāi)節(jié)點(diǎn)可知正是我們通過(guò) List<Book>返回的兩個(gè)Book對(duì)象,而lastResult的類型是:mx.collections.ArrayCollection,這不真是ActionScript中的數(shù)組集合嗎?好的,既然這樣,在Flex客戶端便可以直接通過(guò)lastResult得到WebService返回的泛型集合數(shù)據(jù)了。如下代碼塊:
2 {
3 myService.addEventListener(ResultEvent.RESULT,onSuccess);
4 myService.addEventListener(FaultEvent.FAULT,onFault);
5 myService.BookList.send();
6 }
7
8 internal function onSuccess(evt:ResultEvent):void
9 {
10 var arrC:ArrayCollection = this.myService.BookList.lastResult as ArrayCollection;
11 bookGrid.dataProvider=arrC;
12 }
13
14 internal function onFault(evt:FaultEvent):void
15 {
16 Alert.show("調(diào)用WebService方法失敗,詳細(xì):" + evt.fault.faultDetail.toString());
17
18 }
對(duì)應(yīng)的mxml代碼如下(運(yùn)行結(jié)果和上面返回DataTable類型一樣):
2 <mx:DataGrid x="10" y="10" width="436" id="bookGrid">
3 <mx:columns>
4 <mx:DataGridColumn headerText="編號(hào)" dataField="Id"/>
5 <mx:DataGridColumn headerText="書名" dataField="Name"/>
6 <mx:DataGridColumn headerText="作者" dataField="Author"/>
7 <mx:DataGridColumn headerText="價(jià)格" dataField="Price"/>
8 </mx:columns>
9 </mx:DataGrid>
10 <mx:ControlBar>
11 <mx:Button label="DataTable" click="onTable()"/>
12 </mx:ControlBar>
13 </mx:Panel>
關(guān)于WebService的數(shù)據(jù)訪問(wèn)就介紹到這里,由于個(gè)人能力有限,文中有不足之處還望大家指正。如果有什么好的建議也可以提出,大家相互討論,學(xué)習(xí),共同進(jìn)步!!
相關(guān)文章
Flex Gumbo 通過(guò)smooth屬性設(shè)置BitmapGraphic對(duì)象平滑度的例子
接下來(lái)的例子演示了Flex Gumbo中如何通過(guò)smooth屬性,設(shè)置BitmapGraphic對(duì)象平滑度。2009-06-06Flex與.NET互操作(十一):FluorineFx.Net的及時(shí)通信應(yīng)用(Remote Procedure Call
FluorineFx.NET提供了完善的RPC(Remote Procedure Call)功能,無(wú)論是通過(guò)Flash還是Flex開(kāi)發(fā)的客戶端應(yīng)用(.swf)都可以非常簡(jiǎn)單方便的采用RPC的方式調(diào)用.NET的服務(wù)器端方法2009-06-06flex 實(shí)現(xiàn)全文檢索中的高亮顯示代碼
關(guān)鍵是重寫了 override public function set data(value:Object):void 方法2009-06-06