对一个
Remote Object
的理解
对于大型的应用程序,
MM
及一些志同道合者,都认为和后台的数据交换应该采用
RO
的方式,因为这种方式更强大。
MM
提供的实例程序中就有这样一个:文件的结构是这样的:
1.
一个
mxml
文件:
EDRemoteObject.mxml
它里面导入了两个
as
类,分别是
EmployeeVO.as
和
PhoneNumberVO.as
,这两个类存放在当前目录的
samples\data
子目录下,因此在
mxml
文件中要导入这两个类的包。因此在
script
中有代码:
import samples.data.*;
声明
RemoteObject
,代码如下:
<mx:RemoteObject id="srv" source="samples.data.EmployeeService">
<mx:method name="addEmployee"/>
</mx:RemoteObject>
对代码的说明,
source
是指对应的在
samples\WEB-INF\classes\samples\data
下的
java
类(也就是
EmployeeService.class
文件)。
2.
对
EmployeeVO.as
的理解:
在
EmployeeVO.as
中有这样一行代码:
static var registered=
Object.registerClass("samples.data.EmployeeVO", samples.data.EmployeeVO);
该行代码声明的是一个类的映射(
class mapping
),括号中前一部分是
Java
类,后一个部分是
as
类。
注意的是:
java
和
as
的类名必须严格一致;
java
和
as
类的数据类型必须严格一致;另外,包的名称不是必须一致,但是推荐包名也保持一致。
3.
对
java
文件的理解:
Java
文件和相对应的
class
文件存放的目录是
samples\WEB-INF\classes\samples\data
;分别是
EmployeeService.java
、
EmployeeVO.java
、
PhoneNumberVO.java
,以及相对应的
class
文件。
Java
文件的理解不是很难,这里不再一一赘述了。但是值得注意的是,根据
MM
提供的源代码,程序的输出结果似乎是不可理解的,正要考虑是不是调用了别的什么函数。突然想到,可以反编译
class
得到
java
文件。于是反编译,果然,
MM
提供的源代码中有部分的删节。反编译的
java
文件放在了
samples\WEB-INF\classes\samples\data\java bak
下面,
EmployeeService.java
的代码里面还有一小部分尚未完全理解,有待进一步探讨。见另一篇文章:一个Remote Object的实例应用(从java到Flex)。
另外,本应用程序支持中文的输入,不需要作任何的改动。
以这个程序作为蓝本,对
Flex
和数据库的连接应该是很有帮助的。
一个Remote Object的应用程序(从java到flex传送数据) |
|
|
|
昨天对
MM
提供的源代码中的关于
Remote Objecet
的一个应用程序,做了深刻的分析。剩下了一个小问题就是,对
samples\WEB-INF\classes\samples\data
下的
EmployeeService.java
(由
class
反编译得到的)文件中的一个方法,不是很理解,代码如下:
public List getEmployeeList()
{
DateFormat df = new SimpleDateFormat("mm/dd/yyyy");
ArrayList list = new ArrayList();
try
{
list.add(new EmployeeVO("Walter", "Mellon", 46000, df.parse("1/20/2001")));
…………
}
catch(ParseException e)
{
e.printStackTrace();
}
return list;
}
今天研究了一下,这个方法是向
flex
前台传送数据的,返回值的类型是
list
。
上网参照网友的例子,并参照
EDRemoteObject.mxml
,写了一个自己的应用程序。
程序源代码放在了
\samples\My_Examples\complexdata
文件夹下,文件名字
EDRemoteObjectRec.mxml
。
在这个应用程序中,定义了一个
Remote Object
,代码如下:
<mx:RemoteObject id="srv" source="samples.data.EmployeeService"
result="datagrid.dataProvider=event.result"
fault="alert(event.fault.faultstring, 'RemoteObject Error')">
<mx:method name="getEmployeeList"/>
</mx:RemoteObject>
其他的部分不再赘述。需要注意的是
result="datagrid.dataProvider=event.result"
,正是它定义了
datagrid
的
dataProvider
。
然后是一个显示结果的
datagrid
,不再赘述。
其实,这个应用很简单。
有很多朋友都问如何在flex中的2ge"窗体"(以下我也这么称呼)之间进行调用和传递参数 下面我就给大家讲解一下 1. 调用窗体 A 窗体是一个applicaton窗体 B 窗体是自定义窗体(类似Dialog之类的窗体,本身并不能独立运行) A 窗体 片断代码如下: ............. ............. <mx:Script><![CDATA[
import mx.containers.TitleWindow; import mx.managers.PopUpManager; function ShowDetailDialog(){ var oInitObj:Object = new Object(); oInitObj.title = "FX-Blog Details"; oInitObj.width = 400; oInitObj.height = 480; oInitObj.x = 350; oInitObj.mainApp = this; oInitObj.strDetailTitle = "aaa"; oInitObj.strDetailDetails = "bbb"; var DetailsDialogInstance:Object = TitleWindow(PopUpManager.createPopUp(_root, B, true, oInitObj, false)) } ]]></mx:Script> <mx:Button label="Click" click="ShowDetailDialog()" width="61"/> ------------------ B 窗体 片断代码如下: ............. ............. <?xml version="1.0" encoding="utf-8"?> <mx:TitleWindow xmlns:mx="http://www.macromedia.com/2003/mxml" closeButton="true" click="this.deletePopUp();" alpha="50" initialize="initComponent()"> <mx:Script><![CDATA[ public var mainApp:index = null; public var strDetailTitle:String; public var strDetailDetails:String; } ]]></mx:Script> <mx:TextArea" text="{strDetailTitle}" editable="false" width="100%" alpha="0" height="240" vScrollPolicy="auto"/> <mx:TextArea" text="{strDetailDetails}" editable="false" width="100%" alpha="0" height="240" vScrollPolicy="auto"/> </mx:TitleWindow> -------------- 以上,当在A 窗体点击button的时候,触发Click event 然后调用ShowDetailDialog这个function,在这个function中红色的字体是必须要注意的,其中strDetailTitle 和strDetailDetails 这个2个变量就是要传递参数的变量和B 窗体中的strDetailTitle 和strDetailDetails 必须一致,否则flex中不认哦,这样当点击button后,就会调用B 窗体 并且把strDetailTitle 和strDetailDetails 传递到B 窗体的 textArea中了,其中var DetailsDialogInstance:Object = TitleWindow(PopUpManager.createPopUp(_root, B, true, oInitObj, false)这个代码中的B一定要和A在同一个文件夹中,并且名字和和B的外部名称一致,否则也会失败的!
|
|
posted on 2007-02-10 13:42
☜♥☞MengChuChen 阅读(2476)
评论(0) 编辑 收藏