在上一篇文章《flex与.net互操作(二):基于webservice的数据访问(上) 》中介绍了通过<mx:webservice>标签来访问webservice。实际上我们也可以通过编程的方式动态的访问webservice,flex sdk为我们提供了webservice类。
使用webservice类来访问webservice其实也就是将<mx:webservice>标签的属性通过类对象的属性形式来表示,相比之下使用webservice类比使用<mx:webservice>标签要灵活。下面我们来看看编程方式怎么连接和调用远程方法:
<!--<br /><br />code highlighting produced by actipro codehighlighter (freeware)<br />http://www.codehighlighter.com/<br /><br />-->1 internalfunctiononclick():void
2{
3varservice:webservice=newwebservice();
4service.loadwsdl(http://localhost:1146/flashflexservice.asmx?wsdl);
5service.addeventlistener(resultevent.result,onresult);
6service.addeventlistener(faultevent.fault,onfault);
7service.getbook();
8}
直接通过类对象的loadwsdl()方法调用远程webservice,动态为类对象指定相关的处理函数,然后和标签一样调用远程webservice方法既可。
<!--<br /><br />code highlighting produced by actipro codehighlighter (freeware)<br />http://www.codehighlighter.com/<br /><br />-->1 internalfunctiononresult(evt:resultevent):void
2{
3alert.show(evt.result.id);
4}
5
6internalfunctiononfault(evt:faultevent):void
7{
8alert.show(evt.fault.faultdetail.tostring());
9}
如上便完成了使用webservice类通过编程的方式访问远程webservice方法的调用。
下面来看看webservice返回datatable等负责类型,在flex客户端该怎么解析。首先定义webservice方法如下:
<!--<br /><br />code highlighting produced by actipro codehighlighter (freeware)<br />http://www.codehighlighter.com/<br /><br />-->1[webmethod(description=该方法将返回datatable类型的数据)]
2publicdatatablegetdatatable()
3{
4datatabledt=newdatatable(books);
5dt.columns.add(id,typeof(int));
6dt.columns.add(name,typeof(string));
7dt.columns.add(author,typeof(string));
8dt.columns.add(price,typeof(double));
9
10datarowdr=dt.newrow();
11dr[id]=1;
12dr[name]=《flex游戏开发》;
13dr[author]=张三;
14dr[price]=54.85;
15dt.rows.add(dr);
16
17dr=dt.newrow();
18dr[id]=2;
19dr[name]=《flash游戏开发》;
20dr[author]=李四;
21dr[price]=65.50;
22dt.rows.add(dr);
23
24returndt;
25}
同样在flex客户端通过webservice来访问就可以了,下面是使用<mx:webservive>标签访问(这里需要注意,<mx:operation>标签的name必须与服务端的webservice方法同名):
<!--<br /><br />code highlighting produced by actipro codehighlighter (freeware)<br />http://www.codehighlighter.com/<br /><br />-->1<mx:webserviceid="myservice"
2wsdl="http://localhost:1146/datawebservice.asmx?wsdl"useproxy="false">
3<mx:operationname="getdatatable">
4</mx:operation>
5</mx:webservice>
提供好了webservice,客户端也连接上了webservice,现在只差调用webservice提供的远程方法了。如下:
<!--<br /><br />code highlighting produced by actipro codehighlighter (freeware)<br />http://www.codehighlighter.com/<br /><br />-->1 internalfunctionontable():void
2{
3myservice.addeventlistener(resultevent.result,onsuccess);
4myservice.addeventlistener(faultevent.fault,onfault);
5myservice.getdatatable.send();
6}
7
8internalfunctiononsuccess(evt:resultevent):void
9{
10//bookgrid.dataprovider=this.myservice.getdatatable.lastresult.tables.books.rows;
11}
12
13internalfunctiononfault(evt:faultevent):void
14{
15alert.show(调用webservice方法失败,详细:+evt.fault.faultdetail.tostring());
16
17}
将webservice的返回值绑定在flex的datagrid组件,mxml的相关代码如下:
<!--<br /><br />code highlighting produced by actipro codehighlighter (freeware)<br />http://www.codehighlighter.com/<br /><br />-->1<mx:panelx="41"y="123"width="480"height="279"layout="absolute"fontsize="12">
2<mx:datagridx="10"y="10"width="436"id="bookgrid"
3dataprovider="{this.myservice.getdatatable.lastresult.tables.books.rows}">
4<mx:columns>
5<mx:datagridcolumnheadertext="编号"datafield="id"/>
6<mx:datagridcolumnheadertext="书名"datafield="name"/>
7<mx:datagridcolumnheadertext="作者"datafield="author"/>
8<mx:datagridcolumnheadertext="价格"datafield="price"/>
9</mx:columns>
10</mx:datagrid>
11<mx:controlbar>
12<mx:buttonlabel="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,
dataset,datatable相比泛型集合来说,性能上有很大的差距,复杂的序列化和反序列化过程也很负责,自从.net 2.0推出泛型到现在,我一直就比较喜欢用泛型来传递大数据。ok,下面我将介绍下在flex中怎么去处理webservice方法返回的泛型集合数据。我们有如下webservice方法定义:
<!--<br /><br />code highlighting produced by actipro codehighlighter (freeware)<br />http://www.codehighlighter.com/<br /><br />-->1 [webmethod(description=该方法返回泛型集合)]
2publiclist<book>booklist()
3{
4returnnewlist<book>
5{
6newbook
7{
8id=1,
9name=《flex游戏开发》,
10author=张三,
11price=54.85
12},
13newbook
14{
15id=1,
16name=《flash游戏开发》,
17author=李四,
18price=65.50
19}
20};
21}
相比dataset,datatable类型,使用list<>返回数据我个人认为更方面容易处理。
这就是以泛型结合(list<>)的形式返回的数据形式,相比datatable的返回结果更为简洁,明了。话说到此,我们在flex下该怎么去获取这个返回值和处理这个值呢?其实这里已经很清楚的展现了我们可以通过什么方式去处理,仔细看上图会发现arrayofbook????这是什么东西?莫非是在客户端可以通过数组的形式得到这个返回值。为了进一步搞清楚这里面的的点点滴滴,我们需要深入到内部去了解下返回值的具体构造,通过flex builder的调试环境可以得到如下信息:
看清楚了吗?booklist方法的lastresult结构集下有两个对象,点开节点可知正是我们通过list<book>返回的两个book对象,而lastresult的类型是:mx.collections.arraycollection,这不真是actionscript中的数组集合吗?好的,既然这样,在flex客户端便可以直接通过lastresult得到webservice返回的泛型集合数据了。如下代码块:
<!--<br /><br />code highlighting produced by actipro codehighlighter (freeware)<br />http://www.codehighlighter.com/<br /><br />-->1internalfunctionontable():void
2{
3myservice.addeventlistener(resultevent.result,onsuccess);
4myservice.addeventlistener(faultevent.fault,onfault);
5myservice.booklist.send();
6}
7
8internalfunctiononsuccess(evt:resultevent):void
9{
10vararrc:arraycollection=this.myservice.booklist.lastresultasarraycollection;
11bookgrid.dataprovider=arrc;
12}
13
14internalfunctiononfault(evt:faultevent):void
15{
16alert.show(调用webservice方法失败,详细:+evt.fault.faultdetail.tostring());
17
18}
对应的mxml代码如下(运行结果和上面返回datatable类型一样):
<!--<br /><br />code highlighting produced by actipro codehighlighter (freeware)<br />http://www.codehighlighter.com/<br /><br />-->1<mx:panelx="41"y="123"width="480"height="279"layout="absolute"fontsize="12">
2<mx:datagridx="10"y="10"width="436"id="bookgrid">
3<mx:columns>
4<mx:datagridcolumnheadertext="编号"datafield="id"/>
5<mx:datagridcolumnheadertext="书名"datafield="name"/>
6<mx:datagridcolumnheadertext="作者"datafield="author"/>
7<mx:datagridcolumnheadertext="价格"datafield="price"/>
8</mx:columns>
9</mx:datagrid>
10<mx:controlbar>
11<mx:buttonlabel="datatable"click="ontable()"/>
12</mx:controlbar>
13</mx:panel>
关于webservice的数据访问就介绍到这里,由于个人能力有限,文中有不足之处还望大家指正。如果有什么好的建议也可以提出,大家相互讨论,学习,共同进步!!