|
首先是应用的代码, 在应用中使用 <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/
|