flex数据传输与交互
FLEX数据传输与交互 数据具有流动性,数据传输是指根据用户控制传递至指定目的地。数据交互是指Flex与其他程序进行数据交换,包括传递数据给其他程序和接收其他程序返回的数据。本章将详细讲解数据传输的各种方法及如何与其他程序进行交互。 ? 21.1? 数据传输的方式 ? Flex 3.0中的数据传输方式包括内部数据传输、文件流方式传输、XML方式传输、其他方式传输。应用程序内部的数据传输大多通过变量传递来实现。外部文件的数据可分为简单文本数据、XML数据和复杂数据。对于简单的文本数据可采用文件流方式传输。对于XML数据可采用XML方式传输。对于复杂的数据,如大型数据库中的数据,需要通过其他程序来辅助数据传输。 ? ?21.1.1? 内部数据传输 ? 内部数据传输是指应用程序内部的数据流动,而变量传递是其中最常使用的传输方式。对于同一文件或类中的变量可采用直接赋值的方式。对于不同文件或类中的变量可采用公有变量的方式。 ? 1.直接赋值方式 ? 直接赋值是指将一变量赋值给另一变量。以下代码将变量b的值直接赋值给变量a。 ? var a:int,b:int=12; ? a=b; ? 大部分情况下,使用“=”符将两变量连接起来就实现了变量传递,但有两种情况下需要特殊处理。一种情况是两个变量的类型不相同,需要强制转换。需要说明的是,若两个变量类型相近,编译器可自动转换。例如,将int类型的变量赋值给Number类型变量时,编译器自动执行变量传递。若两个变量类型相差甚远,如Object型与Array型,就需要强制转换。 ? Flex 3.0中数据类型强制转换的语法如下所示。 ? 变量名 as 强制类型 ? 或者如下所示。 ? (强制类型)变量名 ? 以下代码将int类型强制转换为Number类型。 ? var s:Number=y as Number; ? var t:Number=(Number)y; ? 另一种情况是特殊的变量类型,如Array等多维数据变量。前面章节中详细介绍过数组变量。为了节约变量空间,Array类型的变量并不存储全部数据,而是存储数组的首地址。若两个数组变量直接赋值,结果是两个变量都存储了同一数组的首地址,改变任何变量中的数据也就改变了数组的内容。 ? 以下代码中两个数组变量直接赋值,带来了错误的结果。 ? var a:Array,b:Array=[1,2,3]; ? a=b; ? a[0]=100; ? trace(a);????????? ?结果:100,3 ? trace(b);?????????? 结果:100,3 ? 为了帮助读者理解,假设数组在内存的首地址为000001。变量赋值后,变量a、b都指向首地址000001。对变量a进行数据修改后,数组数据发生改变。但变量a、b仍然指向同一首地址。 ? 正确的做法是使用concat方法复制变量b。 ? 上述代码修改如下所示。 ? var b:Array=[1,3]; ? var a:Array=b.concat(); ? a[0]=100; ? trace(a);?????????? 结果:100,3 ? trace(b);?????????? 结果:1,3 ? 2.公有变量方式 ? 声明变量为公有的关键字为public”。其语法如下所示。 ? public var 变量名:变量类型; ? 以下代码定义了公有变量s。 ? public var s:String="aafdsfdsa"; ? 不同文件或类中使用公有变量方式传输变量,其步骤如下所示。 ? ?在工程中新建名为“Model”文件夹下,并在此文件夹下新建名为“model”的类。类中定义一公有变量a。 ? 以下代码定义了model类。 ? //model.cs ? package Model ? { ? ??? public class model ? ??? { ? ??????? public static var a:String="123456";??????????? //定义一个静态变量 ? ??? } ? } ? ?在MXML文件中调用model类的公有变量a。 ? 以下代码在MXML文件中调用公有变量a。 ? <?xml version="1.0" encoding="utf-8"?> ? <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" fontSize="13"> ? ??? <mx:Script> ? ??????? <![CDATA[ ? ??????????? import Model.model; ? ??????????? var s:String=model.a;?????? //将"mode"l类中的"a"变量值传递给"s"变量 ? ??????? ]]> ? ??? </mx:Script> ? ??? <mx:Panel title="内部数据传输" horizontalAlign="center" verticalAlign= "middle" width="288" height="148" x="109.5" y="56"> ? ??????? <mx:Label text="来自model类的变量:{s}"/> ? ??? </mx:Panel> ? </mx:Application> ? ?按下Ctrl+F11快捷键编译运行程序。 ? ?21.1.2? 文件流方式传输 ? 文件流方式传输是指数据以二进制文件流的形式流动。简单的数据可存储于文本文件中,通过Flex AIR工程中新增的File、FileStream等类可以方便地操作本地文件。 ? 使用文件流方式传输数据的步骤如下所示。 ? ?新建AIR工程。Flex 3.0中新增AIR工程项目及对本地文件操作类。 ? ?在工程根目录中新建名为“test.txt”的文件。文件中的内容可随意。 ? ?定义File类变量,并指向“test.txt”文件。 ? 创建File类变量的语法如下所示。 ? var File变量:File=new File(文件路径); ? 以下代码定义File类变量,并指向根目录下的“test.txt”文件。 ? var file:File=new File(File.applicationResourceDirectory.nativePath+ "test.txt"); ? “File.applicationResourceDirectory.nativePath”表示工程路径。 ? ?使用FileStream类打开文件“test.txt”。打开文件需要使用FileStream类,其语法如下所示。 ? var FileStream变量:FileStream=new FileStream(); ? FileStream变量.open(File变量,打开方式); ? 打开方式可为“FileMode.READ”、“FileMode.WRITE”、“FileMode.APPEND”、“FileMode. Update”四种。本程序中使用“FileMode.READ”。以下代码使用FileStream类打开文件“test.txt”。 ? var stream:FileStream = new FileStream();?? //定义FileStream类实例,用以处理文件流 ? stream.open(file,FileMode.READ);??????????? //以读的方式打开文件 ? ?读取FileStream类中的数据。在使用FileStream类打开文件后,数据存储于FileStream变量中。可使用readUTFBytes方法读取数据。其语法如下所示。 ? FileStream变量.readUTFBytes(); ? readUTFBytes方法返回类型为String型。以下代码使用readUTFBytes方法将数据赋值给文本组件显示。 ? txtFile.text=stream.readUTFBytes(stream.bytesAvailable); ? “stream.bytesAvailable”是readUTFBytes方法的可选参数,表示读取全部文件流数据。 ? ?在MXML的代码模式下查看完整代码。以下代码是完整的MXML程序。 ? <?xml version="1.0" encoding="utf-8"?> ? <mx:WindowedApplicationxmlns:mx="http://www.adobe.com/2006/mxml"layout="absolute"fontSize="13" creationComplete="initApp()"> ? ??? <mx:Script> ? ??????? <![CDATA[ ? ??????????? import flash.filesystem.*;???????????? //引用filesystem下的全部类 ? ??????????? [Bindable] ? ??????????? //定义File变量,并指向“test.txt”文件。 ? ??????????? var file:File=new File(File.applicationResourceDirectory. nativePath+"test.txt"); ? ??????????? private function initApp():void ? ??????????? { ? ??????????????? //定义FileStream类实例,用以处理文件流 ? ??????????????? var stream:FileStream = new FileStream(); ? ??????????????? stream.open(file,FileMode.READ);??? //以读的方式打开文件 ? ??????????????? //读取文件中的内容 ? ??????????????? txtFile.text=stream.readUTFBytes(stream.bytesAvailable); ? ??????????????? stream.close();???????????????????? //关闭文件流 ? ??????????? } ? ??????? ]]> ? ??? </mx:Script> ? ??? <mx:Panel title="文件流方式传输" verticalAlign="middle" horizontalAlign ="center" width="446" height="295"> ? ??????? <mx:TextArea id="txtFile"? width="426" height="250"/> ? ??? </mx:Panel> ? </mx:WindowedApplication> ? ?按下Ctrl+F11编译运行程序。 ? ?21.1.3? XML方式传输 ? XML优点是简单小巧、存储方便、检索快速。所以,XML常用于数据存储和数据交换。Flex 3.0使用URLLoader类可方便地传输XML数据。使用XML方式传输数据的步骤如下所示。 ? ?新建Flex工程。 ? ?新建名为“TreeMenus.xml”文件,用以存储XML数据。以下代码是“TreeMenus.xml”文件中的数据定义。 ? //TreeMenus.xml ? <?xml version="1.0" encoding="utf-8"?> ? ??? <menus> ? ??????? <node label="Mail"> ? ??????????? <node label="Inbox"/> ? ??????????? <node label="Personal Folder"> ? ??????????????? <node label="Demo"/> ? ??????????????? <node label="Personal"/> ? ??????????????? <node label="Saved Mail"/> ? ??????????????? <node label="bar"/> ? ??????????? </node> ? ??????????? <node label="Calendar"/> ? ??????????? <node label="Sent"/> ? ??????????? <node label="Trash"/> ? ??????? </node> ? ??? </menus> ? ?编写应用程序初始化处理函数initApp。函数initApp的主要处理是加载“TreeMenus.xml”文件。加载XML文件时需要定义一个URLRequest类变量,用以指明XML文件路径。其语法如下所示。 ? var URLRequest变量:URLRequest=new URLRequest(XML路径); ? 使用URLLoader类的load方法加载XML文件。其语法如下所示。 ? URLLoader变量.load(URLRequest变量) ? 以下代码定义了初始化函数initApp。 ? public function initApp():void????????????????????? //应用程序初始化处理函数 ? { ? ??? //定义URLRequest实例,指定文件地址。 ? ??? var request:URLRequest=new URLRequest("TreeMenus.xml"); ? ??? loader.load(request);?????????????????????????? //加载XML文件 ? ??? loader.addEventListener(Event.COMPLETE,completeHandle);???? //添加加载完成时的监听 ? } ? “loader.addEventListener(Event.COMPLETE,completeHandle)”语句表示添加对XML加载完成事件的监听。一旦加载完成执行completeHandle函数。 ? ?完成剩余MXML代码。剩余代码包括completeHandle函数,<mx:Tree>组件设计等。以下代码是完整的MXML代码。 ? <?xml version="1.0" encoding="utf-8"?> ? <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" ? ??? fontFamily="simsun" fontSize="12" ? ??? layout="absolute"width="242" height="442" creationComplete="initApp()"> ? ??? <mx:Script> ? ??????? <![CDATA[ ? ??????????? import mx.collections.ArrayCollection;? //引用ArrayCollection类 ? ??????????? import mx.rpc.events.ResultEvent;?????? //引用ResultEvent事件类 ? ??????????? //定义一个URLLoader类实例 ? ??????????? public var loader:URLLoader=new URLLoader(); ? ??????????? public var menus:XML=new XML();???????? //定义一个XML类实例 ? ??????? ????public function initApp():void????????? //应用程序初始化处理函数 ? ??????????? { ? ??????????????? //定义URLRequest实例,指定文件地址。 ? ??????????????? var request:URLRequest=new URLRequest("TreeMenus.xml"); ? ??????????????? loader.load(request); //加载XML文件 ? ??????????????? loader.addEventListener(Event.COMPLETE,completeHandle);???????????????????????????????????????????????????????? //添加加载完成时的监听 ? ??????????? } ? ??????????? public function completeHandle(e:Event):void???????????????????????????????????????????????????????????? ???????????????//加载完成处理函数 ? ??????????? { ? ??????????????? menus=XML(loader.data);???????????? //数据传递给menus变量 ? ??????????????? var results:XMLList=menus.node;???? //结果集传递给results变量 ? ??????????????? //results变量值传递给树形列表 ? ??????????????? tree.dataProvider=results; ? ??????????? } ? ??????? ]]> ? ??? </mx:Script> ? ???? <mx:Tree id="tree"x="10" y="35" width="218" height="397" labelField="@label" /> ? ??? <mx:Label x="10" y="10" text="Tree Nodes From XML File"/> ? ?</mx:Application> ? <mx:Tree>组件中labelField属性指定显示内容。 ? ?21.1.4? 其他方式传输 ? 除了上述小节中介绍的数据外,Flex应用程序可能还会遇到其他类型的外部数据。例如,SQL Server数据库数据、MySQL数据库数据、Oracle数据库数据等。Flex 3.0不能直接接收这些数据,需要其他程序处理这些数据后以特定的类型,如数组型、XML型、Object型传递给Flex。有关如何与其他程序交互将在后续章节中详细介绍。 ? 另外,Flex 3.0中新增了对本地数据库(.db格式)操作的类,可用于读取本地的数据库数据。新增了对PDF数据操作的类,可用于读取PDF数据。有关新增的特性将在后续章节中介绍。 ? 21.2? 使用<mx:HTTPService>组件与HTTP程序交互 ? <mx:HTTPService>组件可与所有的HTTP程序交互。例如,ASP、ASP.Net、JSP、PHP等。使用<mx:HTTPService>组件与HTTP程序交互的基本语法如下所示。 ? <mx:HTTPService id="HTTPService组件id" url="HTTP程序地址"/> ? 以下代码使用<mx:HTTPService>组件调用“www.google.cn”。 ? <mx:HTTPService id="httpser" url=" www.google.cn"/> ? 所有的HTTP程序都支持的网址带参方式,其语法如下所示。 ? 网址?参数名1=值1&参数名2=值2…&参数名n=值n ? 以下代码传递参数a、b、c。 ? http://www.baidu.com?a=11&b=22&c=33 ? 网址带参方式的优点是传参简单,但缺点是参数必须先转化为字符串类型,因为网址中只能是字符串类型。另外,若传递的参数较多,网址字符串就会变得很长。 ? 使用网址带参方式能把Flex应用程序中的数据传递给HTTP程序。HTTP程序接收数据后进行处理,并返回Flex可识别的数据类型,如数组型、XML型、Object型等。 ? <mx:HTTPService>组件返回的数据存储于ResultEvent类中。使用<mx:HTTPService>组件的result事件可处理HTTP程序返回的数据。其语法如下所示。 ? private function 处理函数名(e:ResultEvent):void ? { ? ??? e.result??????????????????????????? //返回数据 ? } ? <mx:HTTPService … result="处理函数名"> ? 返回的数据存储于ResultEvent类的result属性下。各种数据的具体位置与HTTP程序的处理结果有关。建议采用断点调试的方法确定数据的具体位置,即调试时查看ResultEvent变量的内部结构。 ? 以下代码传递用户名和密码给HTTP程序,HTTP程序处理后返回验证结果。 ? import mx.rpc.events.ResultEvent;?????????????????????? //引用ResultEvent类 ? import mx.controls.Alert;?????????????????????????????? //引用Alert类 ? private function showResult(e:ResultEvent):void ? { ? ??? Alert.show(e.result as String);???????????????????? //显示验证结果 ? } ? … ? <mx:HTTPService id="hs" ? ??? url="http://www.aaaa.com?username=a&password=123" ? ??? result="showResult(event)"/> ? ? ? ? ? ? ? ? ? ? ? ? ? 21.3? <mx:HTTPService>组件实例 ? 本小节以实例讲解如何使用<mx:HTTPService>组件与HTTP程序交互。实例实现的功能为:Flex客户端传递操作数参数给ASP.NET程序,ASP.NET程序计算全部参数的和,并将结果返回给Flex应用程序。 ? ?21.3.1? 编写ASP.NET程序 ? 本实例的ASP.NET程序使用Visual Studio 2005(简称VS 2005)编写,创建步骤如下所示。 ? ?双击打开VS 2005。 ? ?单击“文件”|“新建”|“网站…”命令,打开“新建网站”对话框。 ? ?在“模板”区域选择“ASP.NET网站”模板。在“位置”文本框中输入网站的存放路径。单击“确定”按钮完成网站的创建。 ? ?编写ASP.NET代码。创建网站工程后自动生成了“Default.aspx”文件。按下F7快捷键打开“Default.aspx.cs”文件。“Default.aspx.cs”文件是“Default.aspx”网页的后台代码页。 ? 以下代码是“Default.aspx.cs”文件的具体代码,主要是实现连加功能,并返回XML数据。 ? //Default.aspx.cs ? using System;?????????????????????????? //引用System名称空间下的所有类 ? using System.Data;????????????????????? //引用Data名称空间下的所有类 ? using System.Configuration;???????????? //引用Configuration名称空间下的所有类 ? using System.Web;?????????????????????? //引用Web名称空间下的所有类 ? using System.Web.Security;????????????? //引用Security名称空间下的所有类 ? using System.Web.UI;??????????????????? //引用UI名称空间下的所有类 ? using System.Web.UI.WebControls;??????? //引用WebControls名称空间下的所有类 ? using System.Web.UI.WebControls.WebParts;//引用WebParts名称空间下的所有类 ? using System.Web.UI.HtmlControls;?????? //引用HtmlControls名称空间下的所有类 ? public partial class _Default : System.Web.UI.Page ? { ? ??? protected void Page_Load(object sender,EventArgs e)????????????????????????????????? ??????????????????????????????//页面初始化处理函数 ? ??? { ? ??????? int sum = 0;??????????????????? //定义int型变量sum,并初始化为0 ? ??????? //接收网址中名为“num”的参数。多个“num”参数时,结果形如“1,3,4”。 ? ??????? string s=Request.QueryString["num"]; ? ??????? if (s != null) ? ??????? { ? ????????? ??string[] arr = s.Split(',');//将参数值分离并存储于arr数组中 ? ??????????? foreach (string i in arr)?? //使用循环计算全部参数值的和 ? ??????????? { ? ??????????????? sum += Convert.ToInt32(i); ? ??????????? } ? ??????? } ? ??????? //返回XML数据。元素标签为<ComputeResult>。 ? ??????? Response.Write("<ComputeResult>"+sum.ToString()+"</ComputeResult>"); ? ??? } ? } ? (12)?????? 本程序中引用名称空间及Page_Load函数的代码都是VS 2005自动生成的。 ? (13)?????? Request类的QueryString方法接收网址中传递来的数据。若有多个同名参数,结果以“,”分隔,形如“1,4,33”。 ? (14)?????? Convert类的ToInt32方法将String型转为Int32型,用于计算。 ? (15)?? ????Response类的Write方法输出数据。本程序中将计算结果放于<ComputeResult>标签中返回。 ? ?按下Ctrl+F5快捷键编译运行ASP.NET程序。用户可自带参数测试程序是否正确。例如,在浏览器中输入“http://localhost/ASP.NetExample/Default. aspx?num=2&num=5”。 ? ?单击“生成”|“发布网站”命令,弹出【发布网站】对话框。 ? ?在“目标位置”文本框中输入发布网站的本地路径,其他可默认。单击“确定”按钮,完成发布网站。发布网站的结果是生成不带后台文件(.cs文件)的网站。 ? ?21.3.2? 创建虚拟目录 ? IIS是Internet Information Service的简称,用以提供对ASP、ASP.Net等HTTP程序的解释。Windows系统默认安装时未带IIS程序,用户可将系统安装光盘插入光驱安装。本书略过IIS的安装。 ? IIS的默认路径为“系统盘:/Inetpub/wwwroot”,用户可将网站放置于此路径下。若用户需要将网站放置于别处,则需要配置虚拟目录,其步骤如下所示。 ? ?单击“开始”|“控制面板”命令,打开控制面板。 ? ?双击“管理工具”|“Internet信息服务”项,打开“Internet信息服务”对话框。 ? ?在左侧树形列表中右击“默认网站”,选择“新建”|“虚拟目录…”命令,弹出“虚拟目录创建向导”对话框。 ? ?单击“下一步”按钮,弹出“虚拟目录创建向导”第二步对话框。 ? ?在“别名”文本框中输入虚拟目录别名。单击“下一步”按钮,弹出“虚拟目录创建向导”第三步对话框。 ? ?在“目录”文本框中输入网站路径。单击“下一步”,弹出“虚拟目录创建向导”第四步对话框。 ? ?根据需要选择项目,一般默认即可。单击“下一步”按钮,完成虚拟目录的创建。 ? ?在新建的虚拟目录中右击相应的网页,如“Default.aspx”,选择“浏览”命令测试网页是否运行正常。 ? 21.3.3? 编写Flex程序 ? 编写Flex程序的步骤如下所示。 ? ?新建Flex工程。 ? ?设计外观模型。 ? 本实例中使用的可视组件包括Label组件、Button组件、DataGrid组件等。 ? 以下代码是外观模型的MXML代码。 ? <mx:Panel title="使用HTTPService交互" width="368" height="334" x="78" y="30" layout="absolute"> ? ??? <mx:Label text="参数:" x="119" y="26"/> ? ??? <mx:TextInput id="txtPara" x="161" y="24" width="95"/>? <!--输入框组件--> ? ??? <!--DataGrid组件,用以显示参数数据--> ? ??? <mx:DataGrid id="dg" x="76" y="64" height="166" width="179"> ? ??????? <mx:columns> ? ??????????? <mx:DataGridColumn dataField="para" headerText="参数"/> ? ??????? </mx:columns> ? ??? </mx:DataGrid> ? ??? <mx:Button label="添加" click="addData();" x="277" y="26"/>? <!--"添加"按钮组件--> ? ??? <mx:Button label="清空" click="delData();" x="277" y="64"/>? <!--"清空"按钮组件--> ? ??? <mx:Label text="连加结果为:" x="58" y="253"/> ? ??? <mx:Label x="126" y="253" id="lblResult"/>? <!--Label组件,用以显示结果--> ? ??? <mx:Button label="计算" click="addHandle();" x="277" y="249"/>?? <!--"计算"按钮组件--> ? </mx:Panel> ? ?添加<mx:HTTPService>组件。在<mx:HTTPService>组件的result事件中显示ASP.NET程序返回的数据。以下代码定义了<mx:HTTPService>组件及result事件的处理函数。 ? private function httpHandle(e:ResultEvent):void //执行<mx:HTTPService>组件后的处理函数 ? { ? ??? lblResult.text=e.result.ComputeResult;//显示结果 ? } ? … ? <!--HTTPService组件,用以调用HTTP服务--> ? <mx:HTTPService id="httpser" showBusyCursor="true" result="httpHandle (event);" useProxy="false"/> ? 前面的ASP.NET程序将结果存于<ComputeResult>标签中。Flex程序接收后具体位置在“e.result.ComputeResult”中。 ? ?编写按钮处理函数。本例中有三个按钮“添加”、“清空”、“计算”。“添加”按钮的处理是将输入框中的数据加入到DataGrid组件中。“清空”按钮的处理是清空DataGrid组件。“计算”按钮的处理是将DataGrid组件中数据传递给ASP.NET程序处理。以下代码定义了各个按钮的处理函数。 ? import mx.rpc.events.ResultEvent;?????????????? //引用ResultEvent类 ? import mx.controls.Alert;?????????????????????? //引用Alert类 ? [Bindable] ? private var arr:Array=new Array();????? ????????//定义数组arr,用以存放参数 ? private function addHandle():void?????????????? //单击"计算"按钮时的处理函数 ? { ? ??? httpser.url="http://localhost:88/ASP.NetExample/Default.aspx";????????????????????????????????????????????????????????????? //初始化url ? ??? if(arr.length>0)?? ?????????????????????????//若有参数时,字符串加上"?" ? ??????? httpser.url+="?"; ? ??? for(var i:int=0;i<arr.length;i++)?????????? //添加参数,形如"num=1" ? ??? { ? ??????? if(i!=arr.length-1) ? ??????????? httpser.url+="num="+arr[i].para.toString()+"&"; ? ??????? else ? ???????? ???httpser.url+="num="+arr[i].para.toString(); ? ??? } ? ??? httpser.send();???????????????????????? //开始执行<mx:HTTPService>组件 ? } ? private function addData():void???????????? //单击"添加"按钮时的处理函数 ? { ? ??? var obj:Object=new Object();??????????? //定义Object变量 ? ??? obj.para=txtPara.text;????????????????? //Object变量的para属性加入数据 ? ??? arr.push(obj);????????????????????????? //添加Object变量到数组arr ? ??? dg.dataProvider=arr;??????????????????? //将数组arr绑定至DataGrid组件上显示 ? ??? txtPara.text="";??????????????????????? //清空输入框 ? ??? dg.validateNow();?????????????????????? //刷新DataGrid组件 ? } ? private function delData():void???????????? //单击"清空"按钮时的处理函数 ? { ? ??? arr=null;?????????????????????????????? //清空数组arr ? ??? dg.dataProvider=arr;??????????????????? //将数组arr绑定至DataGrid组件上显示 ? ??? dg.validateNow();?????????????????????? //刷新DataGrid组件 ? } ? 需要注意的是,<mx:HTTPService>组件的url属性指向的HTTP程序必须正确。用户可在浏览器中输入HTTP程序路径测试。 ? ?按下Ctrl+F11快捷键编译运行程序。 ? 21.4? 使用<mx:WebService>组件与WebService程序交互 ? Flex 3.0中的<mx:WebService>组件专门用于调用和处理WebService。本小节将介绍WebService的相关知识及如何使用<mx:WebService>组件。 ? ?21.4.1? WebService概述 ? WebService是一种在互联网中提供服务的技术。WebService技术标准由各大软件开发商制定,主要解决了不同开发语言间的沟通问题。例如,.Net程序调用WebService服务,而此WebService服务是由Java语言开发的。 ? WebService具有通用性。不论用何种语言开发的WebService服务,调用的结果都是一致的。这是因为WebService有自身的标准,与开发语言无关。用户可使用几乎任何语言调用WebService服务,只要能找到WebService服务并且传递的参数正确。 ? WebService技术在国内外已有较广泛的应用。例如,每日的天气、股票走势等都有免费的WebService服务。Flex应用程序中使用<mx:WebService>组件可方便地调用WebService服务。后续章节的实例中将介绍如何使用Visual Studio 2005开发WebService。 ? ?21.4.2? 如何使用<mx:WebService>组件 ? <mx:WebService>组件的使用方法与<mx:HTTPService>组件的使用方法大同小异。最主要的区别在于参数的传递方式。<mx:WebService>组件中传递参数的语法如下所示。 ? <mx:WebService id=" WebService组件id" ? ??? wsdl="WebService地址"> ? ??? <mx:operation name="方法名"> ? ??????? <mx:request> ? ??????????? <参数名1>值1</参数名1> ? ??????????? <参数名2>值2</参数名2> ? ????????? ??… ? ??????? </mx:request> ? ??? </mx:operation> ? </mx:WebService> ? (16)?????? <mx:operation>组件表示WebService的一个方法,必须与WebService中的定义名称相同。 ? (17)?????? <mx:request>组件存储参数,参数值以标签形式存储。需要注意的是参数的名称及顺序必须与WebService中的定义相同。 ? 以下代码定义了一个<mx:WebService>组件。<mx:WebService>组件中包含带参的getMostPopularPosts方法。 ? <mx:WebService id="wsBlogAggr" ? ??? wsdl="http://weblogs.macromedia.com/mxna/webservices/mxna2.cfc?wsdl" ? ??? useProxy="false"> ? ??? <mx:operation name="getMostPopularPosts"> ? ??????? <mx:request> ? ??????????? <daysBack>30</daysBack> ? ??????????? <limit>{cbxNumPosts.value}</limit> ? ??????? </mx:request> ? ??? </mx:operation> ? </mx:WebService> ? 本程序中limit参数值是动态的,绑定于下拉框组件cbxNumPosts上。 ? <mx:WebService>组件的方法也可不显性表示参数,只需调用方法时指明即可。 ? 以下代码中<mx:WebService>组件不显性定义参数。 ? wsBlogAggr.getMostPopularPosts(30,cbxNumPosts.value).send(); ? … ? <mx:WebService id="wsBlogAggr" ? ??? wsdl="http://weblogs.macromedia.com/mxna/webservices/mxna2.cfc?wsdl" ? ??? useProxy="false"> ? ??? <mx:operation name="getMostPopularPosts"/> ? </mx:WebService> ? 调用<mx:Webservice>组件中的方法的语法如下所示。 ? WebService变量.方法.send(); ? 以下代码调用getMostPopularPosts方法。 ? wsBlogAggr.getMostPopularPosts.send(); ? <mx:operation>组件中的result事件用以处理返回数据。使用方法与<mx:HTTPService>组件相同。 ? 以下代码调用地址为“http://www.wopos.com/webservice/Stock.asmx”的WebService服务并显示结果。 ? <?xml version="1.0" encoding="GB2312"?> ? <mx:Applicationxmlns:mx="http://www.adobe.com/2006/mxml"layout="absolute"fontSize="13"creationComplete="wsStock.HelloWopos.send();"> ? ??? <mx:Script> ? ??????? <![CDATA[ ? ??????????? import mx.rpc.events.ResultEvent;?????? ????//引用ResultEvent类 ? ??????????? import mx.controls.Alert;?????????????????? //引用Alert类 ? ??????????? //HelloWopos方法返回数据时的处理函数 ? ??????????? private function wsHandle(e:ResultEvent):void ? ??????????? { ? ??????????????? lbl.text=e.result as String;??????????? //显示返回数据 ? ??????????? } ? ??????? ]]> ? ??? </mx:Script> ? ??? <mx:Panel title="使用WebService交互" horizontalAlign="center" verticalAlign="middle" width="398" height="138"> ? ??????? <mx:Label id="lbl" textAlign="center" width="378" height="24"/> ? ??? </mx:Panel> ? ? ??<mx:WebService id="wsStock" showBusyCursor="true" ? ??????? wsdl="http://www.wopos.com/webservice/Stock.asmx?wsdl" ? ??????? fault="Alert.show(event.fault.faultString,'Error')"> ? ??????? <mx:operation name="HelloWopos" result="wsHandle(event);"/> ? ???? </mx:WebService> ? </mx:Application> ? 本程序在creationComplete事件,即初始化事件时调用WebService的方法。结果显示于Label组件上。 ? ? ? ? ? ? ? ? ? 21.5? <mx:WebService>组件实例 本小节的实例实现了如下功能:Flex程序通过WebService获取SQL Server 2000数据库中的数据,并将数据显示于DataGrid组件上。涉及的技术包括创建SQL Server 2000数据库、使用VS 2005编写WebService、使用<mx:WebService>组件等。 ?21.5.1? 创建数据库 设计数据库名为“Company”。数据库中只有一张名为“Employee”的表。表的列设计如表21-1所示。 表21-1 “Employee”表的列设计 ?
? 建立数据库步骤如下所示。 ?单击“开始”|“所有程序”|“Microsoft SQL Server”|“查询分析器”命令,打开查询分析器。 ?在查询分析器的编辑区中输入SQL语句。创建数据库的SQL语句如下所示。 ? create database Company on ( NAME = 'Company_dat', ??? FILENAME = 'E:Flex基础教程源程序第7章GetDataFromSQLServer2000 Company.mdf', ??? SIZE = 10, ??? MAXSIZE = 50, ??? FILEGROWTH = 5 ) LOG ON ( NAME = 'Company_log', ??? FILENAME = 'E:Flex基础教程源程序第7章GetDataFromSQLServer2000 Company.ldf', ??? SIZE = 5MB, ??? MAXSIZE = 25MB, ??? FILEGROWTH = 5MB ) GO ? use? Company go ? create table Employee ( ? employeeId char(20) primary key, ? firstName char(50), ? lastName char(50) ) ? insert into Employee (employeeId,firstName,lastName) values ('0','a','aaa') insert into Employee (employeeId,lastName) values ('1','b','bbb') insert into Employee (employeeId,lastName) values ('2','c','ccc') 数据库所在路径的用户可自行更改。 ?选择创建数据库Company的全部SQL语句(到第一个“go”为止)。 ?单击??按钮执行SQL语句。 ?选择设置当前数据库为Company的全部SQL语句(从第一个“go”到第二个“go”为止)。 ?单击??按钮执行SQL语句。 ?选择剩余的SQL语句(从第二个“go”至最后)。 ?单击??按钮执行SQL语句。 ?21.5.2? 编写WebService 使用VS 2005编写WebService的步骤如下所示。 ?单击“文件”|“新建”|“网站”命令,弹出“新建网站”对话框。 ?选择“ASP.NET Web服务”模板,在“位置”文本框中输入项目路径。单击“确定”按钮,完成项目的创建。 ?编写WebService。在新建“ASP.NET Web服务”工程后会自动生成一个名为“Service.asmx”的文件。asmx格式文件即为WebService文件。按下F7快捷键,打开“Service.asmx”的后台代码页“Service.cs”。 以下代码是“Service.cs”文件的具体定义。主要是定义了GetData方法获取数据库中的数据,并返回数组类型。 //Service.cs using System;?????????????????????????????????? //引用System名称空间下的类 using System.Web;?????????????????????????????? //引用Web名称空间下的类 using System.Web.Services;????????????????????? //引用Services名称空间下的类 using System.Web.Services.Protocols;??????????? //引用Protocols名称空间下的类 using System.Data.SqlClient;??????????????????? //引用SqlClient名称空间下的类 using System.Collections;?????????????????????? //引用Collections名称空间下的类 using System.Data;????????????????????????????? //引用Data名称空间下的类 [WebService(Namespace = "http://tempuri.org/")]//默认的名称空间 [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] public class Service : System.Web.Services.WebService { ??? public Service ()?????????????????????????? //默认构造函数 ??? { ??? } ??? public class Employee?????????????????????? //自定义类,用以存储数据 ??? { ??????? public string employeeId; ??????? public string firstName; ??????? public string lastName; ??? } ??? ?[WebMethod] ??? ?[System.Xml.Serialization.XmlInclude(typeof(Employee))]??? //声明“Employee”类可写入XML ??? public ArrayList GetData()????????????????????? //获得数据库数据 ??? { ??????? SqlConnection conn = new SqlConnection();? //定义“SqlConnnection”类实例 ??????? //数据库连接字符串 ??????? conn.ConnectionString = "Data Source=.;Initial Catalog=Company; Persist Security Info=True;User ID=sa;Password=sa"; ??????? //定义“SqlCommand”实例,从“Employee”表中取数据 ??????? SqlCommand command = new SqlCommand( "select * from Employee",conn); ??????? conn.Open();??????????????????????????????? //打开连接 ??????? SqlDataAdapter da = new SqlDataAdapter();?? //定义“SqlDataAdapter”类实例 ??????? //将“command”值传递给“SqlDataAdapter”的“SelectCommand”属性 ??????? da.SelectCommand = command; ??????? DataSet ds = new DataSet();???????????????? //定义“DataSet”类实例 ??????? da.Fill(ds,"tables");????????????????????? //取数据 ??????? ArrayList al = new ArrayList();???????????? //定义“ArrayList”类实例 ??????? for (int i = 0; i < ds.Tables[0].Rows.Count; i++)?? //将全部数据存储于al变量中 ??????? { ??????????? Employee em = new Employee();?????????????? //定义“Employee”类实例 ??????????? //添加数据到“al”变量中 ????????????? em.employeeId= ds.Tables[0].Rows[i]["employeeId"].ToString().Trim(); ????????????? em.firstName = ds.Tables[0].Rows[i]["firstName"].ToString().Trim(); ????????????? em.lastName=ds.Tables[0].Rows[i]["lastName"].ToString().Trim(); ??????????? al.Add(em); ??????? } ??????? conn.Close();?????????????????????????? ??? ??? //关闭数据库 ??????? return al; ??? } } (18)?????? 引用名称空间、类声明、默认构造函数等代码都是VS 2005自动生成的。 (19)?????? “[WebService(Namespace = "http://tempuri.org/")]”表示WebService的名称空间。 (20)?????? [WebMethod]关键字指明此函数为WebService的方法。 (21)?????? DataSet类型是一种多表数据类型。若数据以此类型返回,Flex程序将很难处理。所以本程序中自定义了Employee类,将数据全部存储于ArrayList类型变量中。 (22)?????? 由于Employee类是自定义的,WebService在生成WSDL(WebService标准文件)时并不认识,所以需要声明。声明语句为“[System.Xml.Serialization.XmlInclude (typeof(Employee))]”。 (23)?????? 数据库连接语句“Data Source=.;Initial Catalog=Company;Persist Security Info=True; User ID=sa;Password=sa”必须正确。用户可根据实际设置修改用户名和密码。 (24)?????? 获取Employee表全部数据的SQL语句为“select * from Employee”。 ?按下Ctrl+F5快捷键,编译运行WebService程序。若程序无误会显示WebService中的方法“GetData”。 ?单击“生成”|“发布网站”命令,发布WebService网站。 ?为WebService网站创建虚拟目录。创建步骤与<mx:HTTPService>实例中相同。 ?在IIS中右击“Service.asmx”文件,选择“浏览”命令,测试WebService。 ?21.5.3? 编写Flex程序 编写Flex程序的步骤如下所示。 ?新建Flex工程。 ?添加DataGrid组件。 DataGrid组件用以显示来自WebService的返回数据。以下代码是DataGrid组件MXML代码。 <mx:Panel title="获取SQL Server数据库职工数据"> ??? <!--定义数据列表,绑定来自数据库的数据--> ??? <mx:DataGrid id="dgEmployee" width="397" dataProvider="{WS.GetData. lastResult}"> ??????? <mx:columns> ??????????? <mx:DataGridColumn headerText="用户编号" dataField="employeeId"/>??????? ??????????????? ??????????????????????????????????????? <!--数据列--> ??????????? <mx:DataGridColumn headerText="姓" dataField="firstName"/>????????? ??????????????????? ??????????????????????????????????????? <!--数据列--> ??????????? <mx:DataGridColumn headerText="名" dataField="lastName"/>?????????? ??????????????????? ??????????????????????????????????????? <!--数据列--> ??????? </mx:columns> ??? </mx:DataGrid> </mx:Panel> DataGrid组件的dataProvider属性绑定于“WS.GetData.lastResult”,即<mx:WebService>组件GetData方法的结果集上。 ?添加<mx:WebService>组件。以下代码是<mx:WebService>组件的MXML代码。 <!--定义"WebService"组件,连接来自外部的WebService--> <mx:WebService id="WS" wsdl="http://localhost:88/GetDataFromSQLServer2000/ Service.asmx?WSDL" ??? fault="Alert.show(event.fault.faultString,'Error')" showBusyCursor ="true"> ??? <mx:operation name="GetData" resultFormat="object" /> </mx:WebService> <mx:WebService>组件的wsdl属性指明WebService的地址,用户可根据实际设置修改。 ?完成剩余代码。剩余代码包括应用程序初始化时调用WebService、引用Alert类等。 以下代码是完整的MXML代码。 <?xml version="1.0" encoding="utf-8"?> <mx:Applicationxmlns:mx="http://www.adobe.com/2006/mxml"layout="absolute"creationComplete="WS.GetData.send();"> ??? <mx:Script> ??????? <![CDATA[ ??????? import mx.controls.Alert;?????????????????????? //引用Alert类 ??? ]]> ??? </mx:Script> ??? <mx:Panel > ??????? <!--定义数据列表,绑定来自数据库的数据--> ??????? <mx:DataGrid id="dgEmployee" width="397" dataProvider="{WS.GetData. lastResult}"> ??????????? <mx:columns> ??? ??????????? <mx:DataGridColumn headerText="用户编号" dataField= "employeeId"/>?? ??????????????? ??????????????????????????? <!--数据列--> ??????????????? <mx:DataGridColumn headerText="姓" dataField="firstName"/>????? ??????????????????? ??????????????????????????????????? <!--数据列--> ??????????????? <mx:DataGridColumn headerText="名" dataField="lastName"/> ????? ??????????????????? ??????????????????????????????????? <!--数据列--> ??????????? </mx:columns> ??????? </mx:DataGrid> ??? </mx:Panel> ??? <!--定义"WebService"组件,连接来自外部的WebService--> ??? <mx:WebService id="WS" wsdl="http://localhost/GetDataFromSQLServer2000 /service.asmx?WSDL" ??????? fault="Alert.show(event.fault.faultString,'Error')"> ??????? <mx:operation name="GetData" resultFormat="object" /> ??? </mx:WebService> </mx:Application> ?按下Ctrl+F11快捷键,编译运行程序。 ? ? ? ? ? ? ? ? ? ? ? ? ? 21.6? 使用Fluorine网关与ASP.NET类交互 上面章节中介绍了使用<mx:HTTPService>组件与ASP.NET网页进行交互。但这种方式的效率不如直接与ASP.NET类交互。Flex 3.0应用程序与ASP.NET类交互的难点在于,两种语言的数据类型几乎完全不同,不能正常交互。Fluorine网关的出现解决了这种转换问题。本章将详细介绍Fluorine网关的相关内容及使用方法。 ?21.6.1? Fluorine简介 Fluorine是一种开源的AMF(ActionScript Messaging Formatter)网关,专门负责Flex 3.0与.NET交互时的数据类型转换。Fluorine现支持ActionScript 2.0和ActionScript 3.0,所以Fluorine也可作为Flash与.NET交互时的AMF网关。Fluorine开发团队将Fluorine项目制作成Virsual Stdio中的模板,方便用户安装和配置。结合renaun团队开发的基于MXML的第三方组件RemoteObjectAMF0,用户可以有效、快速地与ASP.NET类进行交互。 现Fluorine网关支持转换的类型如表21-2所示。 表21-2? Fluorine网关支持转换的类型说明 ?
? 续表? ?
? ?21.6.2? Fluorine的下载与安装 Fluorine开源项目的主页为“http://fluorine.thesilentgroup.com/fluorine/index.html”。 1.下载Fluorine 下载步骤如下所示。 ?在浏览器中输入网址后,打开官方主页。 ?左边树形列表中展开“Download”结节,在右侧页面中单击“download”链接开始下载。 2.安装Fluorine 安装步骤如下所示。 ?双击安装包“fluorine.exe”开始安装,弹出Fluorine安装第一步对话框。 ?单击“Next”按钮,弹出选择安装路径对话框。 ?在路径文本框中输入安装路径,单击“Next”按钮,弹出选择开始菜单名称对话框。 ?单击“Next”按钮,弹出安装说明对话框。 ?确认安装无误后,单击“Install”按钮,完成安装。 ?21.6.3? 第三方组件RemoteObjectAMF0的使用方法 RemoteObjectAMF0组件是一种基于MXML的第三方组件,用于连接AMF网关。下载地址为“http://renaun.com/blog/flex-components/remoteobjectamf0/”。 使用RemoteObjectAMF0组件的步骤如下所示。 ?将RemoteObjectAMF0组件的源文件放置在工程中。RemoteObjectAMF0组件的源文件是“src”文件夹下的“com”文件夹。可将“com”文件夹全部复制至工程根目录下。 ?引用RemoteObjectAMF0组件所在的包。查看RemoteObjectAMF0组件的类定义时,可发现RemoteObjectAMF0组件的包为“com.renaun.rpc.*”。引用RemoteObjectAMF0组件的包的语法如下所示。 xmls:名称=" RemoteObjectAMF0组件的包" 以下代码在<mx:Application>组件中引用RemoteObjectAMF0组件的包,并定义名为“renaun”的名称空间。 <mx:Application … xmls:renaun="com.renaun.rpc.*" > ?MXML文件中定义RemoteObjectAMF0组件。RemoteObjectAMF0组件的定义语法如下所示。 <名称空间:RemoteObjectAMF0 ??? endpoint="AMF网关地址" ??? id=" RemoteObjectAMF0组件id" ??? source="指向调用的类"> ??? <名称空间:methods> ??????? <名称空间:method name="方法名" result="调用成功后的处理函数"/> ??? </名称空间:methods> </名称空间:RemoteObjectAMF0> (25)?????? RemoteObjectAMF0组件的endpoint属性指明AMF网关地址。对于Fluorine网关,其地址为“Gateway.aspx”网页所处的地址。 (26)?????? RemoteObjectAMF0组件的source属性指向类的名称空间。 (27)?????? <名称空间:method>组件的name属性指向类中的方法,必须与类中的定义相同。 (28)?????? <名称空间:method>组件的result事件处理返回的数据。使用方法与<mx:HTTPService>组件的result事件相同。 以下代码定义了一个RemoteObjectAMF0组件与“FluorineExample.Services. GetSQL Server2000Data”名称空间下的类交互。 <renaun:RemoteObjectAMF0 ??????? endpoint="http://localhost/FluorineExample/Gateway.aspx" ??????? id="fs" ??????? source="FluorineExample.Services.GetSQLServer2000Data" ??????? showBusyCursor="true" ??????? > ??????? <renaun:methods> ??????????? <renaun:method ??????????????? name="GetData" ??????????????? result="GetDataHandle(event)" ??????????? /> ??????????? <renaun:method ??????????????? name="InsertData" ??????????????? result="InsertDataHandle(event)" ??????????? /> ??????? </renaun:methods> ??? </renaun:RemoteObjectAMF0> ?调用RemoteObjectAMF0组件中的方法的语法如下所示。 RemoteObjectAMF0组件变量名.方法名(参数1,参数2…); 需要注意的是,参数的顺序必须与类中的定义相同。 以下代码调用类中的InsertData方法。 fs.InsertData("111","2222",txtee.text); ? ? ? ? ? ? ? ? ? ? 21.6.4? Fluorine实例 本实例将从SQL Server 2000数据库中取出通知信息显示在Flex端。在Flex应用程序中可插入新的通知到数据库。本实例涉及的主要技术包括:创建SQL Server 2000数据库、定义ASP.NET类、Flex 3.0通过Fluorine与ASP.NET类进行交互。 使用Fluorine网关与ASP.NET类交互的步骤如下所示。 ?创建数据库。数据库名为“School”,表名为“Notes”,表的列设计如表21-3所示。 表21-3 “Notes”表的列设计 ?
? 以下代码是创建“School”数据库的SQL语句。 ? create database School on ( NAME = 'School_dat', ??? FILENAME = 'E:Flex基础教程源程序第7章FluorineExampleSchool.mdf', ??? MAXSIZE = 50, ??? FILEGROWTH = 5 ) LOG ON ( NAME = 'Company_log', ??? FILENAME = 'E:Flex基础教程源程序第7章FluorineExampleSchool.ldf', ??? SIZE = 5MB, ??? MAXSIZE = 25MB, ??? FILEGROWTH = 5MB ) GO ? use? School go ? create table Notes ( ??? noteId char(20) primary key, ??? title char(50), ??? content char(200), ??? publisher char(20) ) ? insert into Notes(noteId,title,content,publisher) values ('1','aaaaaa','aaaaaaaaaaaaaaaaaaaaa','a') insert into Notes(noteId,publisher) values ('2','bbbbbb','bbbbbbbbbbbbbbbbbbbbb','b') insert into Notes(noteId,publisher) values ('3','cccccc','ccccccccccccccccccccc','c') 建立数据库的具体方法与WebService实例中相同,读者可参看WebService实例中的数据库设计。 ?新建Fluorine项目。安装Fluorine后,Visual Stdio 2005中自动新增名为“Fluorine ASP.NET Web Application”的模板。创建工程的具体方法可参看WebService实例。 ?设计ASP.NET类。在自动生成的代码文件夹“App_Code”下新建名为“GetSQLServer2000Data.cs”的类文件。GetSQLServer2000Data类中定义了两个方法:GetData和InsertData。GetData方法获得全部通知,并以DataSet类型返回。InsertData方法添加数据到数据库。以下代码定义了GetSQLServer2000Data类。 //GetSQLServer2000Data.cs namespace FluorineExample.Services????????????????? //类所在的名称空间,可自定义。 { ??? public class GetSQLServer2000Data ??? { ??????? public GetSQLServer2000Data()?????????????? //默认构造函数 ??????? { ??????? } ??????? public DataSet GetData()??????????????????? //获得数据库数据 ??????? { ??????????? SqlConnection conn = new SqlConnection();?????? //定义“SqlConnnection”类实例 ??????????? //数据库连接字符串 ??????????? conn.ConnectionString = "Data Source=.;Initial Catalog=School; Persist Security Info=True;User ID=sa;Password=sa"; ??????????? //定义“SqlCommand”实例,从“Notes”表中取数据 ??????????? SqlCommand command = new SqlCommand("select * from Notes",conn); ??????? ??? conn.Open();//打开连接 ??????????? SqlDataAdapter da = new SqlDataAdapter();?????? //定义“SqlDataAdapter”类实例 ??????????? //将“command”值传递给“SqlDataAdapter”的“SelectCommand”属性 ??????????? da.SelectCommand = command; ??????????? DataSet ds = new DataSet();???????????????? //定义“DataSet”类实例 ??????????? da.Fill(ds,"tables");????????????? ??????? //取数据 ??????????? conn.Close();?????????????????????????????? //关闭数据库 ??????????? return ds; ??????? } ??????? //插入数据函数 ??????? public void InsertData(string title,string content,string publisher) ??????? { ??????????? SqlConnection conn = new SqlConnection();?? //定义“SqlConnnec tion”类实例 ??????????? //数据库连接字符串 ??????????? conn.ConnectionString = "Data Source=.;Initial Catalog=School; Persist Security Info=True;User ID=sa;Password=sa"; ??????????? SqlCommand command = new SqlCommand("select Max(noteId) from Notes",conn); ??????????? conn.Open();??????????????????????????????? //打开连接 ??????? ??? SqlDataAdapter da = new SqlDataAdapter();?? ??? //定义“SqlDataAdapter”类实例 ??????????? //将“command”值传递给“SqlDataAdapter”的“SelectCommand”属性 ??????????? da.SelectCommand = command; ??????????? DataSet ds = new DataSet();???????????????? //定义“DataSet”类实例 ??????????? da.Fill(ds,"tables");????????????????????? //取数据 ??????????? //新的id为最大noteId+1 ??????????? string newid=(Convert.ToInt32(ds.Tables["tables"].Rows[0][0]. ToString())+1).ToString(); ??????????? //SQL插入语句 ??????????? command = new SqlCommand("insert into Notes values('" + newid + "','" + title.Trim() + "','" + content.Trim() + "','" + publisher.Trim()+ "')",conn); ??????????? command.ExecuteNonQuery();????????????????? //执行SQL语句 ??????????? conn.Close(); ??????? } ??? } } (29)?????? “namespace FluorineExample.Services”指明类所处的名称空间。有了名称空间就能准确地定位类。 (30)?????? 用户应根据实际配置修改数据库字符串“Data Source=Initial Catalog=School;Persist Security Info=True;User ID=sa;Password=sa”。 (31)?????? Fluorine网关会将.NET中的DataSet类型转换为Flex能够识别的Object类型,所以GetData方法可以使用DataSet类型返回数据。 (32)?????? 通知id由程序自动计算。计算方法是最大id加1。 ?在VS 2005中按下Ctrl+F5快捷键编译运行程序。 ?单击“生成”|“发布网站”命令,发布网站。 ?为网站设置虚拟目录。 ?在IIS中,右击“Gateway.aspx”文件,选择“浏览”命令,测量运行是否正常。“Gateway.aspx”文件运行时并无任何可见效果。 ?将RemoteObjectAMF0组件源文件复制至工程根目录下。 ?引用RemoteObjectAMF0组件的包,并定义名称空间。以下代码引用了RemoteObjectAMF0组件的包,并定义名称空间“renaun”。 <mx:Application … xmls:renaun="com.raun.rpc.*"> ?定义RemoteObjectAMF0组件。以下代码定义RemoteObjectAMF0组件指向GetSQLServer2000Data类。 <!--第三方网关组件,用以连接AMF网关--> ??? <renaun:RemoteObjectAMF0 ??????? endpoint="http://localhost:88/FluorineExample/Gateway.aspx" ??????? id="fs" ??????? source="FluorineExample.Services.GetSQLServer2000Data" ??????? showBusyCursor="true" ??????? > ??????? <renaun:methods> ??????????? <renaun:method ??????????????? name="GetData" ??????????????? result="GetDataHandle(event)" ??????????? /> ??????????? <renaun:method ??????????????? name="InsertData" ??????????????? result="InsertDataHandle(event)" ??????????? /> ??????? </renaun:methods> ??? </renaun:RemoteObjectAMF0> endpoint属性指向Fluorine网关的“Gateway.aspx”页。 source属性指向类。使用类的名称空间能准确定位类。 ?设计外观模型。本程序中的可视化组件包括DataGrid组件、Label组件、TextInput组件、Button组件等。 以下代码是外观模型的MXML代码。 <mx:Panel width="455" height="462" title="通知"> ??? <mx:DataGrid id="dg"> ??????? <mx:columns> ??????????? <mx:DataGridColumn headerText="编号" dataField="0"/> ??????????? <mx:DataGridColumn headerText="标题" dataField="1"/> ??????????? <mx:DataGridColumn headerText="内容" dataField="2"/> ??????????? <mx:DataGridColumn headerText="发布者" dataField="3"/> ??????? </mx:columns> ??? </mx:DataGrid> ??? <mx:Canvas width="395" height="243"> ??????? <mx:Label x="37" y="27" text="标题"/> ??????? <mx:TextInput x="80" y="25" id="txtTitle"/> ??????? <mx:Label x="37" y="155" text="发布者"/> ??????? <mx:TextInput x="80" y="153" id="txtPublisher"/> ??????? <mx:Label x="37" y="53" text="内容"/> ??????? <mx:TextArea x="80" y="55" width="278" height="90" id="txtContent"/> ??????? <mx:Buttonx="121"y="198"label="添加"id="btnInsert" click="fs. InsertData(txtTitle.text,txtContent.text,txtPublisher.text);"/> ??? </mx:Canvas> </mx:Panel> GetData方法返回的类型为DataSet。经Fluorine转换后,在Flex 3.0中以Object类型接收。由于DataSet类型为多表数据类型,所以在转换过程中列名丢失。用户可按顺序确定数据列,如dataFiled属性为“0”。外观模型效果如图21-23所示。 ?编写GetData方法调用成功后的处理函数。 函数的主要处理是将数据绑定至DataGrid组件的dataProvider属性上。 以下代码定义了处理函数GetDataHandle。 public function GetDataHandle(e:ResultEvent):void { ??? //获得的数据绑定至DataGrid组件 ??? dg.dataProvider=e.result.tables.serverInfo.initialData as Array; } DataSet经Fluorine网关转换后较复杂。经调试发现数据存储于“e.result.tables. serverInfo.initialData”中。 ?完成剩余代码。剩余代码包括InsertData方法调用成功后的处理函数、应用程序初始化处理、引用ResultEvent类等。 以下代码是完整的MXML代码。 <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" ??? xmlns:renaun="com.renaun.rpc.*" ??? layout="absolute" creationComplete="fs.GetData();" fontSize="13"> ??? <mx:Script> ??????? <![CDATA[ ??????????? import mx.collections.ArrayCollection;? //引用ArrayCollection类 ??????????? import mx.rpc.events.ResultEvent;?????? //引用ResultEvent类 ??????????? import mx.controls.Alert;?????????????? //引用Alert类 ??????????? //获得数据后的处理函数 ??????????? public function GetDataHandle(e:ResultEvent):void ??????????? { ??????????????? //获得的数据绑定至DataGrid组件 ??????????????? dg.dataProvider=e.result.tables.serverInfo.initialData as Array; ??????????? } ??????????? //插入数据成功后的处理函数 ??????????? public function InsertDataHandle(e:ResultEvent):void ??????????? { ??????????????? //提示插入成功 ??????????????? Alert.show("插入数据成功"); ??????????????? //重新获取数据 ??????????????? fs.GetData(); ??????????? } ??????? ]]> ??? </mx:Script> ??? <mx:Panel width="455" height="462" title="通知"> ??????? <mx:DataGrid id="dg"> ??????????? <mx:columns> ??????????????? <mx:DataGridColumn headerText="编号" dataField="0"/> ??????????????? <mx:DataGridColumn headerText="标题" dataField="1"/> ??????????????? <mx:DataGridColumn headerText="内容" dataField="2"/> ??????????????? <mx:DataGridColumn headerText="发布者" dataField="3"/> ??????????? </mx:columns> ??????? </mx:DataGrid> ??????? <mx:Canvas width="395" height="243"> ??????????? <mx:Label x="37" y="27" text="标题"/> ??????????? <mx:TextInput x="80" y="25" id="txtTitle"/> ??????????? <mx:Label x="37" y="155" text="发布者"/> ??????????? <mx:TextInput x="80" y="153" id="txtPublisher"/> ??????????? <mx:Label x="37" y="53" text="内容"/> ??????????? <mx:TextArea x="80" y="55" width="278" height="90" id= "txtContent"/> ??????????? <mx:Buttonx="121"y="198"label="添加"id="btnInsert" click="fs. InsertData(txtTitle.text,txtPublisher.text);"/> ??????? </mx:Canvas> ??? </mx:Panel> ??? <!--第三方网关组件,用以连接AMF网关--> ??? <renaun:RemoteObjectAMF0 ??????? endpoint="http://localhost:88/FluorineExample/Gateway.aspx" ??????? id="fs" ??????? source="FluorineExample.Services.GetSQLServer2000Data" ??????? showBusyCursor="true" ??????? > ??????? <renaun:methods> ??????????? <renaun:method ??????????????? name="GetData" ??????????????? result="GetDataHandle(event)" ??????????? /> ??????????? <renaun:method ??????????????? name="InsertData" ??????????????? result="InsertDataHandle(event)" ??????????? /> ??????? </renaun:methods> ??? </renaun:RemoteObjectAMF0> </mx:Application> ?按下Ctrl+F11编译运行程序。 ? 转自http://www.samhy.com/article/467.htm (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |