對一個
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 閱讀(2481)
評論(0) 編輯 收藏