Flex3 Module 模块化 应用程序 开发

模块(Modules)

模块(Module)是创建大型Flex应用程序的一个解决方案,它允许你将你的用户接口分割成许多分散的有各自用途的小块。例如(下面出自Flex 2的文档),一个保险公司可能有数百个表单——针对于各个领域的,针对各种请求类型,以及针对各种应用等等。创建一个包含所有这些表单的Flex应用程序 将会产生一个巨大SWF文件,还会有不少问题:
应用程序越大开发过程越复杂;
应用程序越大测试过程越复杂;
应用程序越大部署过程越复杂;
SWF文件越大加载时间越长

示例程序基于Flex 2文档中的一个程序,但是我将它做了一些更改来说明几个常见的问题。这个例子展示了一个主程序和其它三个共享公有数据的模块(Module)。

其中一个设计要素是一个接口的使用,这个接口实质上是接口实现者和使用者之间的一个契约。这个例子将会说明我所说的意思。模块(Module)的接口部分 虽然不是必须的但是却可以大大简化以后的开发和维护。比如,如果开发人员有一个小组负责报告部分,另一个小组负责图表部分,如果它们一开始用了接口,那么 只要有需要,接口的实现就可以做足够多的变形而不会影响到工程结果。接口在模块(Module)中还扮演另外一个角色,我在下文中将会揭示这点。

模块(Module)是以<mx:Module>代替<mx:Application>作为根标签的MXML文件(或 ActionScript文件)。你可以将带有<mx:Module>标签的作为一个程序来看,但是它不能运行。

这个示例有一个主程序文件以及带有一个接口的两个模块。打开主程序文件你会看到:

程序代码
<mx:Panel x=”10″ y=”41″ width=”169″ height=”500″ layout=”absolute” title=”Modules”>
<mx:Text x=”10″ y=”24″ text=”Check a module to load it; uncheck to unload it” width=”129″/>
<mx:RadioButton x=”10″ y=”97″ label=”None” selected=”true”
click=”removeModule()”/>
<mx:RadioButton x=”10″ y=”123″ label=”Chart”
click=”removeModule();loadModule(‘ChartModule.swf’)”/>
<mx:RadioButton x=”10″ y=”175″ label=”Table”
click=”removeModule();loadModule(‘GridModule.swf’)”/>
</mx:Panel>
<mx:Panel x=”187″ y=”41″ width=”500″ height=”500″ layout=”absolute” title=”Module: {moduleName}”>
<mx:ModuleLoader id=”currentModule” ready=”readyModule(event)”
width=”100%” height=”100%” />
</mx:Panel>

第一个Panel包含了控制示例中模块(Module)加载和卸载的RadioButtons。第二个Panel是使 用<mx:ModuleLoader>标签加载模块(Module)的地方。注意那个id为currentModule的 ModuleLoader,它有一个关于ready事件的事件处理器。当模块SWF文件加载了足够多可以开始使用的时候,ModuleLoader 就会分派ready事件(或者说ModuleEvent.READY)。

这里有一个readyModule函数,它在<mx:Script>块中:

程序代码
private function readyModule( event:ModuleEvent ) : void
{
var ml:ModuleLoader = event.target as ModuleLoader;
var ichild:IExpenseReport = ml.child as IExpenseReport;
if( ichild != null ) {
ichild.expenseReport = expenses;
}
}

注意ModuleLoader的child属性是如何转换为IExpenseReport类的。IExpenseReport是一个所有模块 (Module)都实现了的接口。只要每个模块都实现了这个接口,它就可以很容易适应于应用程序。换句话说,想象一下当你需要创建另一个表单或者报告的时 候它的用途。并不需要更改主程序为新模块添加IF语句,你只要在新模块中实现IExpenseReport接口它就可以在程序中完美地运行。

IExpenseReport接口是:

程序代码

public interface IExpenseReport
{
function set expenseReport( ac:ArrayCollection ) : void;
}
每个模块(Module)都实现这个接口,定义各自的名为expenseReport的set函数。下面是ChartModule的根标签和接口IExpenseReport的实现:

程序代码
<mx:Module xmlns:mx=”http://www.adobe.com/2006/mxml” implements=”IExpenseReport”
layout=”vertical”
percentWidth=”100″ percentHeight=”100″ >
<mx:Script><![CDATA[
import mx.collections.ArrayCollection;
[Bindable] public var expenses:ArrayCollection;
public function set expenseReport( ac:ArrayCollection ) : void
{
expenses = ac;
}
]]></mx:Script>

</mx:Module>

让我们回到主程序,RadioButton的click事件会卸载任何当前已加载的模块然后加载一个新的模块。下面是ChartModule的RadioButton标签:

程序代码

<mx:RadioButton x=”10″ y=”123″ label=”Chart” click=”readyModule(‘ChartModule.swf’)”/>
这个click事件会调用上面列出的readyModule事件。

编译并运行程序

如果你使用了Flex Builder 2,请确定更改了项目的Properties将模块(Module)作为”Applications”包含进来。这样Flex Builder 2回将它们编译进SWF文件并且放进bin文件夹中。

Flex Builder注意:要创建一个使用模块(Module)的工程,请使用工程的Properties将模块文件作为”Applications”。这会使得他们被编译进SWF文件。

一旦SWF文件被创建你就可以运行主程序并点击RadioButtons在模块(Module)之间切换。

Flex Builder注意:Flex Builder并不会保存任何关于模块(Module)和主程序的从属信息。只要你对一个模块(Module)作了更改,你就可能需要重新编译主程序或其它从属的模块(Module)。

将SWF文件最优化

如果你查看一下主程序的SWF文件和模块(Module)的SWF文件的话,你会发现它们的大小差不多。这就说明,模块的SWF和主程序SWF中有很多同样的组件定义。

Flash Player并不会保存元件(symbol)的副本。例如,如果主程序有一个Button组件而一个模块(Module)也有一个Button组件,Flash Player就不会从模块中加载Button了,因为它已经在主程序中有定义了。

使用-link-report=report.xml编译主程序,这样会创建一个链接到主程序的包含所有元件信息的文件。然后在编译模块(Module)的时候会使用那个report.xml文件。

程序代码

mxmlc -load-externs=report.xml ChartModule.mxml
当ChartModule被编译的时候,所有在report.xml文件中列出的元件将会在它的SWF中省略。当我不使用report.xml文件编译 ChartModule.swf的时候,它的大小是202K。而当我使用report.xml文件的时候,SWF的大小只有68K。这大大减少了模块 (Module)的加载时间。

在文章的开始将到模块(Module)的时候,我提过接口有另一个作用。假设你没有使用接口而是在主程序中引用模块的类。当你运行link-report 的时候,你的模块类将会出现在report.xml中。当你使用使用link-report编译模块(Module)的时候你的模块并不会包含在它自己的 SWF中!起初这并不会成为一个问题,尽管主程序由于包含了模块的定义而变得很大。然而,当你更改你的模块的时候发生了什么才是重要的。如果你没有重新编 译主程序,你主程序的SWF文件将会包含模块(Module)旧的定义——而不是你已经更改过的。

程序代码
mxmlc -link-report=report.xml Main.mxml
mxmlc -load-externs=report.xml ChartModule.mxml
// etc.
如果你决定使用这个技术来减小模块(Module)的大小,那么就使用接口来确保终端用户使用的总是模块(Module)的最新版本。

Flex Builder注意:Flex Builder在一个工程里没有办法做到这些。如果你确定你将要创建一个使用模块(Module)的工程,可以考虑一下将公共的类和接口(包括event 类)放到一个SWC(Flex Library Project)中然后将模块(Module)分离到它们各自的工程里。

或者,你可以将所有东西创建为一个单一的Flex工程,然后将最优化作为一个产品化前或测试前的部署步骤在Flex Builder之外进行。

总结

将程序分割成多块并不是每个人都会使用模块(Module)。使用这种方法主程序会比平常小,而且多数用户只使用整个程序的一部分。
使用接口来使主程序或模块(Module)来与加载的模块通信。这使维护变得容易。
使用-link-report命令参数编译主程序来产生一个使用元件列表。
在主程序中使用-load-externs和report.xml编译模块(Module),这样可以使它们变得更小。
本项目是一个基于SSM(Spring+SpringMVC+MyBatis)后端框架与Vue.js前端框架开发的疫情居家办公系统。该系统旨在为居家办公的员工提供一个高效、便捷的工作环境,同时帮助企业更好地管理远程工作流程。项目包含了完整的数据库设计、前后端代码实现以及详细的文档说明,非常适合计算机相关专业的毕设学生和需要进行项目实战练习的Java学习者。 系统的核心功能包括用户管理、任务分配、进度跟踪、文件共享和在线沟通等。用户管理模块允许管理员创建和管理用户账户,分配不同的权限。任务分配模块使项目经理能够轻松地分配任务给团队成员,并设置截止日期。进度跟踪模块允许员工实时更新他们的工作状态,确保项目按计划进行。文件共享模块提供了一个安全的平台,让团队成员可以共享和协作处理文档。在线沟通模块则支持即时消息和视频会议,以增强团队之间的沟通效率。 技术栈方面,后端采用了Spring框架来管理业务逻辑,SpringMVC用于构建Web应用程序,MyBatis作为ORM框架简化数据库操作。前端则使用Vue.js来实现动态用户界面,搭配Vue Router进行页面导航,以及Vuex进行状态管理。数据库选用MySQL,确保数据的安全性和可靠性。 该项目不仅提供了一个完整的技术实现示例,还为开发者留下了扩展和改进的空间,可以根据实际需求添加新功能或优化现有功能。
本项目是一个基于SSM(Spring+SpringMVC+MyBatis)后端框架与Vue.js前端框架开发的网上球鞋竞拍系统。该项目旨在为球鞋爱好者提供一个便捷、高效的在线竞拍平台,用户可以在此平台上浏览、搜索、竞拍心仪的球鞋,并参与到各种有趣的竞拍活动中。 系统的主要功能包括用户注册登录、球鞋信息展示、竞拍活动创建与管理、实时竞拍以及交易安全保障等。用户可以通过注册账号后,浏览平台上发布的各类球鞋信息,包括品牌、型号、颜色、尺码以及当前竞拍状态等。系统支持用户创建和管理自己的竞拍活动,设定竞拍规则和时间,同时提供实时竞拍功能,确保公平、透明的交易过程。 在技术实现上,后端采用SSM框架进行开发,Spring负责业务逻辑层,SpringMVC处理Web请求,MyBatis进行数据库操作,保证了系统的稳定性和扩展性。前端则使用Vue.js框架,结合Axios进行数据请求,实现了前后端分离,提高了开发效率和用户体验。 数据库设计方面,系统采用了MySQL数据库,存储用户信息、球鞋信息、竞拍活动等数据,确保数据的安全性和完整性。此外,项目还包含了详细的文档资料,包括需求分析、系统设计、数据库设计以及测试报告等,为项目的实施和维护提供了有力的支持。 该项目不仅适合作为计算机相关专业学生的毕业设计题目,也适合Java学习者进行实战练习,通过在此基础上进行功能扩展和改进,可以进一步提升编程技能和项目管理能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值