企业开发基础
查看mxml翻译成的as代码
设置编译参数: 在属性的flex compiler -keep-generated-actionscript=true
IMXMLObject接口
对于不可视化组件(不是继承于UIComponent)如果实现了IMXMLObject接口,当以标签的方式创建组件时,会自动调用initialized方法,使得不可视对象可以访问它所在的document对象。
MetaData Inspectable的作用:为属性提供一些提示信息,如属性的类型、枚举的合法值、默认值等
客户端MVC
每个功能有一个MXML和AS类文件,as文件实现模型和在模型上的操作(如获取远程数据、排序或过滤)。
Mxml绑定as中的模型对象,如{ },而模型无需知道视图。
用户操作时,MXML响应事件,调用as中的方法改变数据,再通过绑定机制自动刷新到MXML中。
异步调用
问题:
模型数据不一致:flex不会阻塞当前线程,用户可能会以不同的参数多次对同一个远程调用,由于无法保证返回的顺序,则可能调用的参数和得到的结果不匹配。
解决方法:
Flex企业开发中的主要元素
Flex Application
System Manager
是Flex应用的主控者,是Flash Player实例化的第一个类,存储了主应用窗口的大小和位置信息,子组件、内嵌字体、样式和document对象
Flex编译会只包含两帧,第一帧包含systemManager,preloader,downloadProcessBar和少量工具类。第二帧包含应用代码和内嵌资源。
Creation_complete表示所有的子对象建立完成,application_complete表示全部子对象初始化完成。
Preloader
负责监听Application RSL和模块的下载和初始化状态,并生成相应的进度条事件。默认情况下使用DownloadProgressBar作为系统默认的加载显示类。
加载现实类必须实现IPreloaderdisplay接口
1. 修改默认显示类的属性:继承于DownloadProgressBar,修改属性和覆写方法,并将新的实现类指定给Application的preloader。其中backgroundImage backgroundSize backgroundAlpha backgroundColor需要覆写get方法, backgroundImage和backgroundColor不能同时设置。
2. 监听加载事件,重新绘图(自行绘制进度条):集成于DownloadProcessBar,在set preloader中设置监听器
3. 重新实现IPreloaderdisplay接口:继承于Sprite,实现Ipreloaderdisplay接口
Application类
是所有显示组件的根,每个UIComponent通过parentApplication指向Application类,以下属性:
pageTitle:页标题,类似于jsp的header
usePreloader:是否显示滚动条
application:指向最上层的Application,在模块中使用
url: swf文件的完整路径,读取该属性,可以获得服务器的名称和页面的参数,通过路径控制权限。
parameters:网页中参数,也可以从url获得,不过这个更方便。访问方式类似于map,如 test.swf?name=hello 通过parameters.name能获得hello
通过SWF Loader加载Application
1. 主应用MainApp
通过 swfloader获得SubApp
Var sub:SubApp=SubApp(SystemManager(loder.content).application)
2. 子应用 SubApp
Application.application获得MainApp
Application.application[‘mainLabel’].text=”sss”
实际中,只有父引用了解子应用
跨域访问
访问相同域中的文件不需要任何额外的工作。
如果跨域,
首先配置被访问的swf的跨域策略文件crossdomain.mxml,
其次在as中设置
var lc:LoaderContext=new LoaderContext();
lc.securityDomain=SecurityDomain.currentDomain
运行期共享库RSL
当客户端有多个flex应用,如果都共享一个图片文件、组件和其他资源,用户只需下载一次,可以明显减少主应用文件的大小,如果RSL发生变化,也只需要重新下载该RSL
1. 使用系统的RSL
工程属性-》flex build path->library path->Framework linkage
2. 其他的swc包
Flash builder没找到怎么操作
3. 自定义的swc包
Flex on Java企业应用架构
选择框架
客户端和服务器端使用HttpService和WebService传递少量、数据格式不易变化的数据,大量的通信使用RemoteObject,通过AMF协议,可以直接将actionscript对象作为参数和返回结果。
使用BlazeDS的好处:
1. 支持二进制协议AMF
2. 实现as和java对象的自动转换
系统架构
服务器端:
当C和S中的数据对象不一致时,通常是在Server端再加一层接口RemoteFacade类
Client中的vo和Server中的dto对应,代表参数和返回值,在包名和类名上一致
客户端:
Proxy:封装了客户端对Remote Façade的调用代码,作为RemoteFacade的代理,是和RemoteFacade的包名类名相匹配的。
VO:远程方法的参数和返回值
路径规划
{公司路径}/{模块路径}/{类责任}
类责任主要有 vo model view proxy events
主MXML放在Project的根路径下
大规模应用解决方案
减少SWF大小
1. 在一个应用中,应该只有一个Application作为主应用,主应用以动态载入方式打开业务界面,主应用主要存储登录信息及其他全局公用信息,如消息流、权限等
2. 业务界面应该由Module类实现,以便于分工实现
3. 主和业务界面依赖的公共类库放在RSL中
4. 对于每个业务模块有三个工程Flex Project Java Flex Library Project,有利于提取公有代码和分工合作
应用开发实例
开发环境
常常将服务器端工程、客户端工程和客户端Library工程三部分分开,便于分工合作和加快编译速度。
Flex SDK包文件分为 External、Merged into code和RSL三种类型,采用原则是如果包文件Flash虚拟机已经提供,则采用External类型;如果工程没有引用包中的任何类,则采用Merged into code;如果引用了包中的类,则使用RSL类型,包链接类型如下:
框架部分、flex-lib是RSL,如果flex unit没有使用,则为merge into code
客户端数据过滤
从服务器获取数据后,可以在客户端对数据进行过滤,思路如下:
设置grid.filterFunction=onFilter; //参数item:Object 为该行对应数据
刷新grid.refresh();
设置过滤函数为Null grid.filterFunction=null; 不影响后续的操作
客户端定位
在返回结果中进行查找,对查找到得结果高亮显示,思路如下:
设置grid.selectedindex 为查找到得行号
滚动到该行 grid.scrollToIndex(index)
设置为焦点 grid.setFocus()
使用户等待远程调用结束
用户希望看到进度;后续操作的前提是本次操作的结果。
实现方法:
创建组件:能同时监控多个操作或任务的进度,并能支持在操作或任务进行中锁定用户界面。当然通过程序启动、更新状态和停止进度监控的功能是必不可少的,具体实现参考代码。
设置RemoteObject busy属性为true
身份认证功能
在java的login中,FlexContext.getHttpRequest() 可以得到客户端请求的request。 FlexContext.getFlexSession() 可以得到session对象
Flex部署到应用环境
解决Flex所在工程改完工程名后flex需要重新编译。需要修改 web.xml加入Flexdispatcher.java ;创建Flexdispatcher.java; flex工程中创建RemoteObject.as;其他as文件使用该RemoteObject完成远程访问