|
首先是應用的代碼, 在應用中使用 <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>
在這個應用中主要是一個TagNavigator, 里面有三個標簽頁. 每個標簽頁加載一個模塊. 下面是其中一個模塊的代碼:
<?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>
最后, 應用和三個模塊一共會生成4個SWF. 一般來說, 應用使用延遲加載策略. 也就是說, 如果你打開應用后, 從來都不使用其中的某個模塊, 那個這個模塊永遠不會被加載. 這次做的好處是, 加快了第一次打開應用的速度, 但隨之而來的缺點就是, 第一次打開使用某個功能, 需要加載模塊時, 會需要一點等待的時間.
今天在一臺新的機器上, 裝開發環境, 下載了新的JDK1.6和Tomcat6. 安裝完畢后, Tomcat無法正常啟動, 在Tomcat的Logs中發現有以下錯誤:
javajni.c] [error] The specified module could not be found.
到底是怎么回事呢? 因為是模塊加載的問題, 所以拿出從systeminternals下載的FileMon來監測到底是哪個東西加載失敗了. 啟動FileMon, 然后, 嘗試啟動Tomcat, 結果當然是失敗了. 然后在FileMon中過濾一下, 很快就找到了一個錯誤: MSVCR71.dll, 這個動態鏈接庫加載失敗. 經過搜索后發現在JDK的bin目錄下有這個文件. 將其復制到system32目錄下, 然后再啟動Tomcat, 果然成功了!
這個問題可能和jakarta_servic加載動態鏈接庫的LOAD_WITH_ALTERED_PATH選項有關.
最近judahfrangipane提出一種新的模式: DUDE. 大多數人都知道MVC, 問題是如果不管具體情況, 生搬硬套MVC模式就會有一些問題. 一個應用中不是所有的東西都會有一個View, 也不是所有的東西都有一個獨立的Controller. 有時候, 可能會有多個Controller. 所以judahfrangipane推薦了一種新模式:
Data Models 如果必要的話 User Interface 如果必要的話 Design patterns 如果必要的話 Event handling 如果必要的話
注意, 上述的四個部分不一定是全部必需的. 這樣, 你在進行應用設計的時候, 就少了一些條條框框. 而可以根據知識, 經驗, 設計模式來找到一個適合應用的途徑, 就象Chuck Hoffman所說的那樣, 不要"過度設計". 但是有兩個東西必須完全分離, 那就是data和UI.
新特性 1. 支持AMF3, 這一點無疑是激動人心的. 2. 支持JSON, 除了gateway.php外, 增加了json.php, 讓你的服務能夠使用JSON. 有兩個例子: http://5etdemi.com/amfphp2/samples/ajaxtables/ http://5etdemi.com/amfphp2/samples/spry/ 3. 一個新的service browser 4. 在php端, 不再需要寫 $this->methodTable 這個東東了. 在amfphp 1.9 中 所有的方法默認為可以遠程訪問,除非方法名是以下劃線開始 或者 方法是 private 的(只有 php5 支持) 。
1. 先確定phpinfo()可以運行. 2. 在通過phpinfo()查看兩個參數, 一個是php.ini的路徑, 一個extension_dir的配置 我看到我的php.ini文件使用是的php安裝路徑下的, 而不是網上文章所說需要拷貝到c:\windows, 首先要確定你不要改錯了文件, 免得浪費時間. 然后在php.ini文件中, 再修改extension_dir參數. 3. 幾個與extension有關的dll需要去掉注釋. 4. 需要設置一個PHPRC的環境變量, 指明php的安裝路徑.
首先介紹一下SystemManager. SystemManager是Flex應用的主控者, 它控制著應用窗口, Application實例, 彈出窗口, cursors, 并管理著ApplicationDomain中的類. SystemManager是FlashPlayer實例化的第一個類, 它存儲了主應用窗口的大小和位置信息, 保存其子組件比如:浮動彈出窗口和模態窗口的痕跡. 通過SystemManager可以獲得內嵌字體,樣式和document對象. 自定義的可視化組件(UIComponent的子類)只有在調用過addChild()后, 才會有一個SystemManager賦給他們, 之前是Null. 所以在自定義可視化組件的構造函數中不要使用SystemManager.
通常, Application對象創建時, 發生如下事件: 1. 實例化Application對象 2. 初始化Application.systemManager 3. Application在初始化過程之前, 派發預初始化事件. 4. 調用createChild(). 此時, 所有應用組件被創建, 所有組件的createChild()被調用. 5. Application派發初始化事件, 表明所有的組件初始化完畢. 6. 派發creationComplete事件 7. Application對象添加到顯示列表中 8. 派發applicationComplete事件
大多數情況下, 我們使用<mx:Application>來創建application對象, 但如果使用ActionScript來創建的話, 那么建議不要在application的構造函數中創建組件, 推薦在crateChildren函數中, 主要是從性能方面考慮.
Flash包含的是一個時間線上的多個幀, 而Flex的SWF只包含2個幀. SystemManager, Preloader, DownloadProgressBar和少量工具類都在第一幀, 剩下的包括應用代碼/ 內嵌資源全都在第二幀中. 當Flash Player下載下載SWF時, 只要接收到第一幀內足夠的數據, 就會實例化SystemManager, 由它來創建Preloader, 然后創建DownloadProgressBar, 這兩個對象會察看剩余字節的傳輸過程. 當第一幀的所有字節傳輸完畢后, SystemManager發送enterFrame到第二幀, 然后是其他事件. 最后Application對象派發applicationComplete事件.
一個動態修改Tree節點標簽的例子
<?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>
應用中主要包含4個組件, 一個TextInput, 一個Tree, 一個DataGrid, 一個Label 1. 先看Tree, Tree使用_xmlData作為數據源, 定義一個change事件處理函數, 將當前節點存儲到_xmlCur變量中. 2. TextInput的數據源就是_xmlCur的label屬性, 也就是Tree當前節點的標簽. 他也定義了一個change事件處理函數, 在TextInput中的文本改變時, 將新的文本賦值給Tree當前節點的標簽, 也就是改變當前Tree節點的標簽值. 值得注意的是賦值并不是直接給Tree中或者節點中的某個屬性, 而是通過修改數據源Xml的值來改變的. 3. DataGrid的使用顯示了如何在DataGrid中展示Xml的技巧. 4. 最后一個Label只是簡單的顯示當前節點的標簽值, 與TextInput的文本保持同步
今天準備用一下, 已經很久沒有使用的NetBeans來測試一個小程序.
在開始菜單中, 點了一下, 結果沒有出現我期待的IDE, 而是彈出一個對話框, 說無法在C:盤的JDK目錄中找到Java.exe. 奇怪啊, 我的JDK是安裝在D:的啊.
于是, 在NetBeans的目錄下, 查看了一下, 看到有個etc目錄, 進去后, 打到了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,在應用執行的過程不再直接拋出Error,而拋出一個CairngormError,其中帶一個參數就是MessageCode,根據MessageCode到Properties文件中取出相應的消息。
3. 在business中,添加了一個IServiceLocator的接口 ServiceLocator實現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方法已經廢棄,改為了getRemoteObject
4. 在Command中,增加了ICommand接口,原來的Command接口繼承ICommand
5. 在VO中,增加了IValueObject接口,原來的ValueObject繼承IValueObject接口
上面添加的幾個接口,除了IServiceLocator相較2.0版本有了較大的變化,增加了一些方法,其他的幾個接口,依我所見,純粹是換了名字而已。
這個名字的改變反應出FDS的一個重要的擴展:LiveCycle Data Service與Adobe其他LiveCycle服務產品的整合將更緊密。 LiveCycel Data Service將有一些重要的新的變化: 1. 提升數據服務消息的性能 2. 與PDF、J2EE門戶等的集成 3. 另外還有一些針對未來Apollo應用的很重要的功能,比如:本地數據緩存和脫機消息等。 下載地址: http://labs.adobe.com/technologies/livecycle_dataservices2_5/
|