要连接到Java应用程序服务器上的FlashRemotingMX服务并且调用远程服务方法,就必须使用mx.remoting和mx.rpc这两个ActionScript类库:这两个类库包含了所有的FlashRemoting MX for ActionScript 2.0类和方法实现。
} |WN]h_ b>qgaWja 其中,mx.remoting是一个十分核心的ActionScript类库,它包含了用来与应用程序服务器建立连接的所有对象及方法,而mx.rpc可以用来调用远程方法并处理结果。
tq]kfyBJ g>@JJd; 在前面的章节中,我们介绍了如何通过FlashRemotingMX网关服务在JSP网页和Servlet中向Flash影片应用程序传递数据,也介绍了如何使用Flash影片应用程序向JSP网页和Servlet传递参数,并且介绍了如何使用Flash Remoting MX forJava与JDBC结合调用数据库,而且创建了几个简单的例子。
S-"PCOG'p k7yH$%0J 但是,当从JSP网页和Servlet向Flash影片应用程序传递的数据被接收到时,如何处理接收到的结果呢?我们在前面的例子中已经使用了一些方法,这只是在Flash影片应用程序中处理结果丰富方法中最简单的,Flash Remoting MX for ActionScript2.0组件内置了丰富的ActionScript脚本语法用来处理结果。
s N2^2$l> JAH;vht]M 本章就来详细地介绍一下这些ActionScript脚本语法。
?2; ~s> (0F&Q{A%J c)r|9kQ,8 I g_;DY 9.4使用DataGlue类处理记录集数据 QkcRhf[AB 0 pk!19*m 要在一个Flash UI组件中显示RecordSet记录集,一般可以使用该组件内建的setDataProvider()方法或者dataProvider属性,但是如果想在一个Flash UI组件中显示记录集中某一字段下的所有记录,就比较困难了。
W/ #nh `[ ps[dCwx 例如,在前面的例子中,我们要在一个下拉列表框组件中显示记录集中酒店名,就必须首先创建一个新的单字段记录集,将原记录集中该字段的数据填充新的单字段记录集,然后再使用组件的setDataProvider()方法或者dataProvider属性,显然,这比较麻烦,而且占用的资源也比较多。
b2;atMI1D i @. Q+- 为了解决这个问题,Flash RemotingMX还内建了名为DataGlue的ActionScript类。使用DataGlueActionScript类文件也可以在一个FlashUI组件中显示RecordSet记录集。DataGlueActionScript类文件随同Flash RemotingMX组件一起被安装,要使用它,必须导入相应的类库,可以使用下面的一行脚本:
$`?9 dF f^X@"(` import mx.remoting.DataGlue;
[n31k&81} @$AzJA[U* DataGlue类有两个内建的方法:DataGlue.bindFormatStrings()和DataGlue.bindFormatFunction(),使用这两个方法都可以在Flash UI组件(例如组合框和列表框)中显示记录集。
{wwk{nk+db HGqQ*H|4| 9.4.1使用DataGlue.bindFormatStrings方法绑定记录集 Eq~w-6 XWFT_ 可以使用DataGlue.bindFormatStrings()方法在一个FlashUI组件(例如组合框和列表框)中显示RecordSet。下面的一段ActionScript脚本代码将结果RecordSet绑定到名为displayNames的列表框UI组件:
:.r<*Hq \~c5&_]+9 DataGlue.bindFormatStrings(displayNames, result, "#ContactName#", "#customerID#");
h<[t@2 4}o?=<v/ 在这一段代码中,后两个参数被传递给函数(#ContactName#和#customerID#是记录集的字段名)。当用户选择组件中一个特殊的纪录时,ContactName列被显示在UI组件中,而customerID列被返回。下面,我们来改造一下前面的例子,看一下如何使用DataGlue类。
ye ]S7 [ ?pDKa3`T 1打开前面一章我们创建的Restaurant_component.fla文档,将文档另存为Restaurant_component_DataGlue.fla;
_f=y-e2GY JYN\7Di+72 2保持当前位于主时间轴编辑状态,修改主时间轴上的脚本代码。在”动作”面板上追加下面的一行脚本代码:
i<%O9 A BP0"[ import mx.remoting.DataGlue;
Gx3Ec @ _z=tIHYF 3在舞台上双击影片剪辑元件实例main_mc,使影片剪辑元件main处于编辑状态,选中层Script。保持该层被选中,在“动作”面板上修改其中的脚本代码:
Ov2@5a='O uqiLkITs5 将下面的一段脚本代码:
I!DW$~c: U+'bec@'% var newRecordSet:RecordSet = new RecordSet(["hotelName"]);
/): :$^ K>N -gA)Y for (var i = 0; i<resultRecordSet.length; i++) {
qi;J(] 0L(F4)y_9 newRecordSet.addItemAt(i, {hotelName:resultRecordSet.getItemAt(i).hotel_name});
T"v74r 4E+ /xio }
- ]~5/[ #)-cq4Q: if (newRecordSet.isLocal()) {
hn1% iS> Dbk newRecordSet.addItemAt(0, {hotelName:"请选择一个酒家或酒店"});
?.r_2,o t^G w: hotelName_cb.dataProvider = newRecordSet;
ea 1Y ,Xx@[ }
tPg}^_Tmp l>p0V%_ 替换为
:s>I{&v F-/yTe DataGlue.bindFormatStrings(hotelName_cb, resultRecordSet, "#hotel_name#", "#hotel_name#");
b_[X3e<~* 9>=6ET`cW) 可以看到,前面多行代码实现的功能,现在只需一行就可以实现了。
:cn1cDV% @DI[[]\ 4因为现在是使用DataGlue类,所以对于UI组件的读取方式也应该改变一下。在本例中,这段脚本代码位于函数applyFilter()体内:
kbAX5w0t. j:}=)9!3d 将下面的一段脚本代码
QlBmB5i: QwTHF"/z71 list_lb.dataProvider = resultRecordSet.filter(thisFilter, hotelName_cb.selectedItem["hotelName"]);
64A[IWl ] y}$A7D_ 替换为
gRE&dc uY8`& list_lb.dataProvider = resultRecordSet.filter(thisFilter, hotelName_cb.selectedItem.label);
@Zq K'yPX /,UZC{#D 5最后可以测试一下效果,可以看到与前面的例子功能相同。
.&r9A7&X 'tgvj$/( H[Y=g{gm( 9.5使用RemotingConnector组件和数据绑定 kpW5 0($ ykSaWo# RemotingConnector是Flash的一个数据组件,使用该组件你可以非常轻松的建立与远程服务的连接——该远程服务必须是通过FlashRemotingMX网关提供——并且可以调用远程服务所定义的方法函数,使用它只需要将该组件拖放到舞台上并定义组件参数,而且可以使用Flash的数据绑定功能。
~AUDE2t X`uaQGrA 我们在这里要介绍的是首先是通过编写脚本代码的方式使用RemotingConnector组件。
XInXv2IP l. I(X.Wb " Caa(%l 9.5.1编写脚本代码使用RemotingConnector组件 tr7}6& CR- 8TG 要通过编写脚本代码的方式使用该组件,也必须首先在开始将RemotingConnector组件拖放到当前舞台上(或者只要在库中就可以了),然后才能开始编写代码使用该组件,这是使用该组件的第一步。
)U <obs/ [z:2 &| 另外,在编写脚本代码时要导入RemotingConnector类,这是使用该组件编写脚本代码的第一步,可以使用下面的脚本语句:
bw`7$} LNk( ^; import mx.data.components.RemotingConnector;
_}c~7W%<@_ "05J?T 下面我们就使用一个例子来看一下怎样使用该组件。
=7Bjo13 ]Mi(Fzl! 1打开前面一节我们创建的Restaurant_component.fla文档,将文档另存为Restaurant_component_RC.fla;
'x'Mb?q` 2zb NV 2保持文档处于主时间轴的编辑状态,改变主时间轴上的脚本代码如下:
TG%Uy&q jzy%+Mu stop();
j`=j6[z!6 d]<|>5$` //-------------------------------------------------------------
B/gmz^. *u^O.' //导入RemotingConnector类
I ]""|h0V& #wv$M! import mx.data.components.RemotingConnector;
fv 8X?& NEaN( //构造RemotingConnector组件实例并定义实例属性
? M`:V5e: +nR&t$sBA var my_rc:RemotingConnector = new RemotingConnector();
KIX'UftH X3n LwWt5L my_rc.addEventListener("result", returnRowSet_Result);
k6jKny 6 s@ v(M<U my_rc.addEventListener("status", returnRowSet_Status);
<X~WkV `W`H B my_rc.gatewayUrl = "
http://localhost:8080/3JK/gateway";
jJ7S#w<< 46@^}.CH my_rc.methodName = "returnRowSet";
,9@@>s )S w;OAu my_rc.serviceName = "3JK";
I CZf+ FK j(t]X !ft[ my_rc.suppressInvalidCalls = true;
=yN}rz wSaN${B function GetRestaurantInfo():Void {
FJD C}b wujca%umq if (selectedhotel_name == undefined&&selectedhotel_flavor == undefined &&selectedhotel_location ==undefined) {
47yL:v"4 'P@c/qaa?t //定义参数为空
Ha`V&[M Jt|sh_2{$ my_rc.params = null;
Z4[Uiq/ y+1^G[r% //触发连接,调用远程服务方法
$|>m^6s fkhn'* my_rc.trigger();
i&{[^/U~p M]fb$<B~ } else {
}2zs<#pY g`VHr //定义传递给远程服务方法的参数
(1:.7@s= UO(jW )>N my_rc.params ={hotel_name:selectedhotel_name,hotel_flavor:selectedhotel_flavor,hotel_location:selectedhotel_location};
$P{^HA g YHZ!Do/`P //触发连接,调用远程服务方法
v[|;2w7 JmKF*dM"R my_rc.trigger();
(yCS:+;*= C,!dLGk selectedhotel_name = "正在加载数据";
'5/M]YV2 %N<m(rA }
O P>/2t6* f7Y*Mp2R }
7evYPXv3] Gj4m>;x, function returnRowSet_Result(ev:Object) {
] gk-P #hjG/ ,D[ //接收结果
8!Bm- j?c[3}@ main_mc.list_lb.removeAll();
qjqfv n- %QL3kSiae main_mc.list_lb.dataProvider = ev.target.results;
Sa \f 6N G46P7l? selectedhotel_name = "";
>KpG/H :r1 ?&H fetchOK = 1;
;V V`J/s,. KT}w&i3@ main_mc.resultRecordSet = ev.target.results;
]MT[mDX Q -bq{k }
~gtls6cI 9n1s?\ function returnRowSet_Status(stat:Object) {
k#Rj" bb 8esSKR- //接收错误
m: H;p%07 iob2BNY- trace("接收到错误");
E8`3Zuo VZHelQ( }
wdbJgz1ubL C[[_m,3Xt //初始化
a 8t[ :F V0M.g%KqI function ini():Void {
F7hD2" PUjy1=9 if (this.inited != undefined) {
=ud%F8O \!|hEf<$ return;
8 . ?i+ YqAft~|/- } else {
;;&`bVfp;# TsO^ "W var inited:Boolean = true;
PJ)k= l1e2\ltY GetRestaurantInfo();
HSxC ~ w ?,;v P`h`3 }
z{uysh}aL @HX]-hs=0 }
eP F0 *^>MQHxA3- ini();
H /)U37U +.Wm= 3打开组件面板,将RemotingConnector组件拖放到舞台上创建一个实例(实际,只需放到库中就可以了)。
l^&e4* (T+4tB6` 最后可以测试一下效果,可以看到与前面的例子功能相同。
查看本文来源