|
首先是應(yīng)用的代碼, 在應(yīng)用中使用 <mx:ModuleLoader >來加載模塊
<?xml version="1.0"?>
<!-- modules/URLModuleLoaderApp.mxml -->
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" viewSourceURL="srcview/index.html">

<mx:Panel
title="Module Example"
height="90%"
width="90%"
paddingTop="10"
paddingLeft="10"
paddingRight="10"
paddingBottom="10"
>
<mx:Label width="100%" color="blue"
text="Select the tabs to change the panel."/>
<mx:TabNavigator id="tn"
width="100%"
height="100%"
creationPolicy="auto"
>
<mx:VBox id="vb1" label="Column Chart Module">
<mx:Label id="l1" text="ColumnChartModule.swf"/>
<mx:ModuleLoader url="ColumnChartModule.swf"/>
</mx:VBox>
<mx:VBox id="vb2" label="Pie Chart Module">
<mx:Label id="l2" text="piehchartmodule.swf"/>
<mx:ModuleLoader url="piechartmodule.swf"/>
</mx:VBox>
<mx:VBox id="vb3" label="Line Chart Module">
<mx:Label id="l3" text="linehchartmodule.swf"/>
<mx:ModuleLoader url="linechartmodule.swf"/>
</mx:VBox>
</mx:TabNavigator>
</mx:Panel>

</mx:Application>
在這個應(yīng)用中主要是一個TagNavigator, 里面有三個標(biāo)簽頁. 每個標(biāo)簽頁加載一個模塊. 下面是其中一個模塊的代碼:
<?xml version="1.0"?>
<!--ColumnChartModule.mxml -->
<mx:Module xmlns:mx="http://www.adobe.com/2006/mxml" width="100%" height="100%" >

<mx:Script><![CDATA[
import mx.collections.ArrayCollection;
[Bindable]
public var expenses:ArrayCollection = new ArrayCollection([
 {Month:"Jan", Profit:2000, Expenses:1500},
 {Month:"Feb", Profit:1000, Expenses:200},
 {Month:"Mar", Profit:1500, Expenses:500}
]);
]]></mx:Script>
<mx:ColumnChart id="myChart" dataProvider="{expenses}">
<mx:horizontalAxis>
<mx:CategoryAxis
dataProvider="{expenses}"
categoryField="Month"
/>
</mx:horizontalAxis>
<mx:series>
<mx:ColumnSeries
xField="Month"
yField="Profit"
displayName="Profit"
/>
<mx:ColumnSeries
xField="Month"
yField="Expenses"
displayName="Expenses"
/>
</mx:series>
</mx:ColumnChart>
<mx:Legend dataProvider="{myChart}"/>
</mx:Module>
最后, 應(yīng)用和三個模塊一共會生成4個SWF. 一般來說, 應(yīng)用使用延遲加載策略. 也就是說, 如果你打開應(yīng)用后, 從來都不使用其中的某個模塊, 那個這個模塊永遠(yuǎn)不會被加載. 這次做的好處是, 加快了第一次打開應(yīng)用的速度, 但隨之而來的缺點(diǎn)就是, 第一次打開使用某個功能, 需要加載模塊時, 會需要一點(diǎn)等待的時間.
今天在一臺新的機(jī)器上, 裝開發(fā)環(huán)境, 下載了新的JDK1.6和Tomcat6. 安裝完畢后, Tomcat無法正常啟動, 在Tomcat的Logs中發(fā)現(xiàn)有以下錯誤:
javajni.c] [error] The specified module could not be found.
到底是怎么回事呢? 因為是模塊加載的問題, 所以拿出從systeminternals下載的FileMon來監(jiān)測到底是哪個東西加載失敗了. 啟動FileMon, 然后, 嘗試啟動Tomcat, 結(jié)果當(dāng)然是失敗了. 然后在FileMon中過濾一下, 很快就找到了一個錯誤: MSVCR71.dll, 這個動態(tài)鏈接庫加載失敗. 經(jīng)過搜索后發(fā)現(xiàn)在JDK的bin目錄下有這個文件. 將其復(fù)制到system32目錄下, 然后再啟動Tomcat, 果然成功了!
這個問題可能和jakarta_servic加載動態(tài)鏈接庫的LOAD_WITH_ALTERED_PATH選項有關(guān).
最近judahfrangipane提出一種新的模式: DUDE. 大多數(shù)人都知道MVC, 問題是如果不管具體情況, 生搬硬套MVC模式就會有一些問題. 一個應(yīng)用中不是所有的東西都會有一個View, 也不是所有的東西都有一個獨(dú)立的Controller. 有時候, 可能會有多個Controller. 所以judahfrangipane推薦了一種新模式:
Data Models 如果必要的話 User Interface 如果必要的話 Design patterns 如果必要的話 Event handling 如果必要的話
注意, 上述的四個部分不一定是全部必需的. 這樣, 你在進(jìn)行應(yīng)用設(shè)計的時候, 就少了一些條條框框. 而可以根據(jù)知識, 經(jīng)驗, 設(shè)計模式來找到一個適合應(yīng)用的途徑, 就象Chuck Hoffman所說的那樣, 不要"過度設(shè)計". 但是有兩個東西必須完全分離, 那就是data和UI.
新特性 1. 支持AMF3, 這一點(diǎn)無疑是激動人心的. 2. 支持JSON, 除了gateway.php外, 增加了json.php, 讓你的服務(wù)能夠使用JSON. 有兩個例子: http://5etdemi.com/amfphp2/samples/ajaxtables/ http://5etdemi.com/amfphp2/samples/spry/ 3. 一個新的service browser 4. 在php端, 不再需要寫 $this->methodTable 這個東東了. 在amfphp 1.9 中 所有的方法默認(rèn)為可以遠(yuǎn)程訪問,除非方法名是以下劃線開始 或者 方法是 private 的(只有 php5 支持) 。
1. 先確定phpinfo()可以運(yùn)行. 2. 在通過phpinfo()查看兩個參數(shù), 一個是php.ini的路徑, 一個extension_dir的配置 我看到我的php.ini文件使用是的php安裝路徑下的, 而不是網(wǎng)上文章所說需要拷貝到c:\windows, 首先要確定你不要改錯了文件, 免得浪費(fèi)時間. 然后在php.ini文件中, 再修改extension_dir參數(shù). 3. 幾個與extension有關(guān)的dll需要去掉注釋. 4. 需要設(shè)置一個PHPRC的環(huán)境變量, 指明php的安裝路徑.
首先介紹一下SystemManager. SystemManager是Flex應(yīng)用的主控者, 它控制著應(yīng)用窗口, Application實例, 彈出窗口, cursors, 并管理著ApplicationDomain中的類. SystemManager是FlashPlayer實例化的第一個類, 它存儲了主應(yīng)用窗口的大小和位置信息, 保存其子組件比如:浮動彈出窗口和模態(tài)窗口的痕跡. 通過SystemManager可以獲得內(nèi)嵌字體,樣式和document對象. 自定義的可視化組件(UIComponent的子類)只有在調(diào)用過addChild()后, 才會有一個SystemManager賦給他們, 之前是Null. 所以在自定義可視化組件的構(gòu)造函數(shù)中不要使用SystemManager.
通常, Application對象創(chuàng)建時, 發(fā)生如下事件: 1. 實例化Application對象 2. 初始化Application.systemManager 3. Application在初始化過程之前, 派發(fā)預(yù)初始化事件. 4. 調(diào)用createChild(). 此時, 所有應(yīng)用組件被創(chuàng)建, 所有組件的createChild()被調(diào)用. 5. Application派發(fā)初始化事件, 表明所有的組件初始化完畢. 6. 派發(fā)creationComplete事件 7. Application對象添加到顯示列表中 8. 派發(fā)applicationComplete事件
大多數(shù)情況下, 我們使用<mx:Application>來創(chuàng)建application對象, 但如果使用ActionScript來創(chuàng)建的話, 那么建議不要在application的構(gòu)造函數(shù)中創(chuàng)建組件, 推薦在crateChildren函數(shù)中, 主要是從性能方面考慮.
Flash包含的是一個時間線上的多個幀, 而Flex的SWF只包含2個幀. SystemManager, Preloader, DownloadProgressBar和少量工具類都在第一幀, 剩下的包括應(yīng)用代碼/ 內(nèi)嵌資源全都在第二幀中. 當(dāng)Flash Player下載下載SWF時, 只要接收到第一幀內(nèi)足夠的數(shù)據(jù), 就會實例化SystemManager, 由它來創(chuàng)建Preloader, 然后創(chuàng)建DownloadProgressBar, 這兩個對象會察看剩余字節(jié)的傳輸過程. 當(dāng)?shù)谝粠乃凶止?jié)傳輸完畢后, SystemManager發(fā)送enterFrame到第二幀, 然后是其他事件. 最后Application對象派發(fā)applicationComplete事件.
一個動態(tài)修改Tree節(jié)點(diǎn)標(biāo)簽的例子
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" horizontalAlign="left" creationComplete="initApp()"> <mx:Script><![CDATA[ [Bindable]public var _xmlData:XML; [Bindable]private var _xmlCur:XML; private function initApp():void { //set the test data _xmlData = <node label="Mail Box"> <node label="Inbox"/> <node label="Deleted mail"/> <node label="Personal"/> <node label="Professional"/> <node label="Spam"/> <node label="Sent"/> </node>
myTree.selectedItem = myTree.dataProvider[0]; //select the first node callLater(expandTreeNode, [myTree.selectedItem]); //use callLater to expand that node }//initApp private function expandTreeNode(myXMLNode:XML):void{ myTree.expandChildrenOf(myXMLNode,true); //expand the node _xmlCur = XML(myTree.selectedItem); //set the bindable variable } private function oChangeTree(oEvent:Event):void { _xmlCur = XML(oEvent.target.selectedItem); //set the bindable variable }// private function updateNode(oEvent:Event):void { var xmlSelected:XML = XML(myTree.selectedItem) //get a reference to the selected node xmlSelected.@label = tiLabel.text; //set the label attribute }//updateNode ]]></mx:Script> <mx:Label text="Update selected Node label" /> <mx:TextInput id="tiLabel" text="{_xmlCur.@label}" change="updateNode(event)" /> <mx:HBox> <mx:Tree id="myTree" width="200" height="200" labelField="@label" showRoot="true" dataProvider="{_xmlData}" change="oChangeTree(event)" /> <mx:DataGrid id="dg" dataProvider="{_xmlData.node}" > <mx:columns> <mx:Array> <mx:DataGridColumn headerText="Name" dataField="@label" /> </mx:Array> </mx:columns> </mx:DataGrid> <mx:Label text="{_xmlCur.@label}" /> </mx:HBox> </mx:Application>
應(yīng)用中主要包含4個組件, 一個TextInput, 一個Tree, 一個DataGrid, 一個Label 1. 先看Tree, Tree使用_xmlData作為數(shù)據(jù)源, 定義一個change事件處理函數(shù), 將當(dāng)前節(jié)點(diǎn)存儲到_xmlCur變量中. 2. TextInput的數(shù)據(jù)源就是_xmlCur的label屬性, 也就是Tree當(dāng)前節(jié)點(diǎn)的標(biāo)簽. 他也定義了一個change事件處理函數(shù), 在TextInput中的文本改變時, 將新的文本賦值給Tree當(dāng)前節(jié)點(diǎn)的標(biāo)簽, 也就是改變當(dāng)前Tree節(jié)點(diǎn)的標(biāo)簽值. 值得注意的是賦值并不是直接給Tree中或者節(jié)點(diǎn)中的某個屬性, 而是通過修改數(shù)據(jù)源Xml的值來改變的. 3. DataGrid的使用顯示了如何在DataGrid中展示Xml的技巧. 4. 最后一個Label只是簡單的顯示當(dāng)前節(jié)點(diǎn)的標(biāo)簽值, 與TextInput的文本保持同步
今天準(zhǔn)備用一下, 已經(jīng)很久沒有使用的NetBeans來測試一個小程序.
在開始菜單中, 點(diǎn)了一下, 結(jié)果沒有出現(xiàn)我期待的IDE, 而是彈出一個對話框, 說無法在C:盤的JDK目錄中找到Java.exe. 奇怪啊, 我的JDK是安裝在D:的啊.
于是, 在NetBeans的目錄下, 查看了一下, 看到有個etc目錄, 進(jìn)去后, 打到了netbeans.conf. 打開一看, 果然NetBeans的JDK路徑配置在此. 將此文件中的路徑改為正確路徑. OK, 問題解決, NetBeans又正常啟動了.
1. Caringorm2.1的包中增加了完整的ASDoc文檔
2. 增加Locale,錯誤信息的國際化的處理。 添加了一個Properties文件, 添加了com.adobe.cairngorm.CairngormMessageCodes和com.adobe.cairngorm.CairngormError兩個類,其中CairngormMessageCodes用于定義Properties文件中的鍵值,而CairngormError封裝了Error,在應(yīng)用執(zhí)行的過程不再直接拋出Error,而拋出一個CairngormError,其中帶一個參數(shù)就是MessageCode,根據(jù)MessageCode到Properties文件中取出相應(yīng)的消息。
3. 在business中,添加了一個IServiceLocator的接口 ServiceLocator實現(xiàn)IServiceLocator接口,相比以前增加了以下幾個方法: a、public function getRemoteObject( serviceId : String ) : RemoteObject // Return the RemoteObject for the given service id. b、public function getHTTPService( serviceId : String ) : HTTPService // Return the HTTPService for the given service id. c、public function getWebService( serviceId : String ) : WebService // Return the WebService for the given service id. d、public function getConsumer( serviceId : String ) : Consumer // Return the message Consumer for the given service id. e、public function getProducer( serviceId : String ) : Producer // Return the message Produce for the given service id. f、public function getDataService( serviceId : String ) : DataService // Return the DataService for the given service id. g、public function setCredentials( username : String, password : String ) : void // Set the credentials for all registered services. Note that services that use a proxy or a third-party adapter to a remote endpoint will
原來的getService和getInvokerService方法已經(jīng)廢棄,改為了getRemoteObject
4. 在Command中,增加了ICommand接口,原來的Command接口繼承ICommand
5. 在VO中,增加了IValueObject接口,原來的ValueObject繼承IValueObject接口
上面添加的幾個接口,除了IServiceLocator相較2.0版本有了較大的變化,增加了一些方法,其他的幾個接口,依我所見,純粹是換了名字而已。
這個名字的改變反應(yīng)出FDS的一個重要的擴(kuò)展:LiveCycle Data Service與Adobe其他LiveCycle服務(wù)產(chǎn)品的整合將更緊密。 LiveCycel Data Service將有一些重要的新的變化: 1. 提升數(shù)據(jù)服務(wù)消息的性能 2. 與PDF、J2EE門戶等的集成 3. 另外還有一些針對未來Apollo應(yīng)用的很重要的功能,比如:本地數(shù)據(jù)緩存和脫機(jī)消息等。 下載地址: http://labs.adobe.com/technologies/livecycle_dataservices2_5/
|