第22章 Flex应用程序开发 在本章以前的章节中,花了很大的精力来讲解组件、数据等内容,毕竟大部分的开发者使用Flex都是受因为其强大的表示层功能吸引。本章在前面的基础上,进一步介绍Flex应用程序的开发。与前面的章节相比,本章将从整体上把握如何开发Flex应用,侧重于设计模式问题、安全、性能优化等。
22.1 设计模式 在面向对象的程序设计中,总是反复的提到设计模式。毫无疑问,设计模式对于开发者还是程序,乃至整个应用,都是多赢的。设计模式实现了代码复用,是软件工程的基础。本节简要的设计模式的基础。
22.1.1 什么是设计模式 人们在生活中,模式是无处不在的。例如高考前,总要做无数经典的题目,但是考试中不会有这样的题目出现。不过,这些经典的题目可以对我们做题进行启发,从而达到举一反三、融会贯通的作用。设计模式不是解决问题的方法,而是经典的解决问题的套路。模式是不能直接套用的,具逦侍饩咛宸治觥I杓颇J骄褪蔷涞纳杓品椒ā 目前,设计模式被定义为一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。
22.1.2 了解MVC模式 对于Web应用而言,用户对应用界面的接受程度直接关乎应用的成败。人人都喜欢使用漂亮、互动性好的界面。随着Web应用的深入和广泛的使用,用户对于界面的需求越来越高。越来越多的用户要求“定制界面”,实际上只是图形界面的变更,系统的功能仍未改变。如何做到在不改变系统模型、功能的基础上,根据不同的需求获得不同的界面呢? 从系统角度看,上述的问题可以进一步转化为在满足对界面要求的同时,如何使软件的计算模型独立于界面的构成。MVC的出现很好的解决了这个问题。 模型-视图-控制(MVC:Model-View-Controller)就一种交互界面的结构组织模型。也是目前广泛流行的软件设计模式。MVC模式包含3个元素:视图(view)、模型(Model)、控制器(Controller)。
22.2 开发前的准备 经过漫长的学习,终于可以开发自己的Flex应用程序了。开发可以看作简单的工作,最终还是归结为编码。但是,从整体上看,开发应用的流程是个复杂的过程,要经过需求分析、建模、编码、测试等等流程。要想开发出好的应用,需要进行充足的准备工作、精确的设计、规范的代码。 1.需求分析:整个应用要实现什么样的功能,每个功能的运行流程等。Flex本身更侧重于用户界面的开发,所以对于界面背后的业务逻辑,仅仅依靠ActionScript是不实际的。 2.软件设计:软件设计建立在需求分析的基础上。在需求分析中,已经解决了应用要实现什么功能,每个功能的流程等。软件设计的任务就是讲这些功能合理在组合,规划。例如整个界面的划分。每个页面实现什么功能,每个功能采用什么样的方式实现。 3.编写代码:根据软件设计的框架编写界面、业务逻辑、数据库访问等代码。对应应开发人员来说,编写代码相对于前面的需求分析和软件设计简单了很多。但是要注意的是,养成良好的编码习惯,编写出稳定、安全、高效的代码。
22.3 模块化开发 在前面讲述创建自定义组件时,曾经讲过将复杂的应用分为多个模块,然后将模块加载进去,其中的模块讲的是使用Flex Builder创建的Flex Component。使用这种方式创建的模块在加载后是与整个应用文件一起编译。如果模块过大,编译的文件也会增大,于是打开的速度就慢了。为了方便与其他模块区分,这种模块简称为MXML模块。 Flex中还有另外一种模块,与上面的模块不同。该模块在MXML以<mx:Module>作为开始和结束的标记,而不是使用组件标签。这种模块最终需要编译为SWF文件。与Flex 1.5中的load方式不同,它不能直接运行,但是可以在应用中动态载入,即在需要的时候加载,不需要的时候释放。在这里简称为SWF模块。SWF模块的创建相对于MXML模块要复杂些。需要将编写好的MXML文件编译成SWF文件,但其与MXML模块相比,它还是具有一定的优势。 减少初始下载SWF文件的大小。 更小的SWF文件就带来了更短的载入时间。
22.4 使用共享对象 在Web应用中,运行时有些数据需要暂存到本地磁盘中,可以被整个应用获取,也可以在下一次打开应用时获取。Flex中,可以使用共享对象(Shared Object)来实现这样的功能。共享对象有点类似浏览器的cookies,可以为应用暂存一些数据。它与cookies相比,具有如下的优势。 它是不会过期的。 共享的内容,可以由用户指定,可以是字符,可以是数组。 存储位置也可以由应用定义,但必须在用户目录下。 默认情况下,可以使用的存储空间为100K,该数值可以利用Flash Player中的Global Storage Settings panel设定。 只作为本地数据,不会被传输到服务端。该共享对象可以被同一域中的Flex应用共享。
22.4.1 SharedObject类 SharedObject类的常用属性如表所示。 clear():清除共享对象数据。 flush():将共享对象写入客户端的文件中。 getLocal():该方法用来获取共享对象,其接口如下所示: public static function getLocal(name:String, localPath:String = null, secure:Boolean = false):SharedObject
22.4.2 创建共享对象 创建共享对象不能使用MXML,只能在ActionScript中创建。创建共享对象时使用getLocal()方法,该方法接口如下所示,其中pathName为可选项。 SharedObject.getLocal("objectName" [, pathname]): SharedObject 下面的例子创建了一个共享对象myShare。 public var myShare:SharedObject; myShare = SharedObject.getLocal("myData"); 在创建了共享对象后,需要为共享对象进行赋值,格式如下所示: sharedObject_name.data.variable = value; 例如下面的代码为userName赋值。 myShare.data.userName = “silence”;
22.4.3 删除共享对象 删除共享对象时,需要使用ShareObject()类中的clear()方法。 mySO.clear();
22.4.4 使用共享对象 共享对象常用来保存应用的一些数据,如用户名、密码。下面的例子在用户登录中使用共享对象,如图所示。当用户登录时选择记录用户名时,则创建共享对象记录用户名和密码。在本地次方上创建了myData.sol,如图所示。登录后显示欢迎界面,如图所示。当用户再次从本机登录时,程序自动读取共享变量的内容进行登录,并在欢迎界面下方显示“您已经自动登录”字样,如图所示。
22.5 优化Flex应用程序 性能对于应用来说,是非常关键的因素。良好的编程习惯、合理的使用组件都能减少应用在性能上的损失,谁也不想使用花了3、5分钟才能打开的页面。在编写Flex应用中,应尽可能避免那些影响性能、效率的因素。本节主要讨论如何提高应用的性能即效率,如缩短打开页面的时间等。
22.5.1 合理使用布局 Flex程序最初始状态还是由各种各样的组件组合而成的。无论怎样嵌套,所有的组件都放置于容器内。哪个组件位于哪个位置有组件布局负责。所以优化应用程序的第一步是合理的使用布局。在使用布局时,应注意以下几点: 1.避免多层嵌套容器 2.使用绝对定位和缩放 3.导航式容器推迟实例化
22.5.2 使用动态样式 在初始化过程中尽早设定样式,可以避免不必要的样式通知和查找。在使用样式时,第一次为对象设定样式不要用setStyle()方法,应使用<mx:Style>标签中,或作为MXML标签的一个属性。通过外部CSS样式表,或作为全局样式来设定。避免对setStyle()方法的过度使用,或者不必要的使用,都会影响效率。仅在需要改变现有对象的样式时使用setStyle()即可。 某些应用程序在应用过程,或对象实例化过程中必须调用setStyle()方法时,可在实例化阶段较早调用setStyle()方法。即从组件或应用程序的initialize事件开始设定样式,而不是从creationComplete,或其他事件开始设定样式。
22.5.3 减少SWF的体积 MXML文件在显示的时候总是要编译成swf文件在Flash Player中显示的,查看MXML页面也就是将该页面的SWF文件下载到本地然后打开观看。用户打开页面的速度由以下2个因素决定。 网络速度 SWF的大小 网络的速度因不同的地域而不同,但无论对于多少的带宽,越小的SWF体积越好。减小SWF体积可以从以下几个方面入手: 在编译MXML文件的时候使用-optimize编译参数。 禁止调试,可以减去一些专门记录调试环境的数据。 避免引入一些不必要的包和类,不要将包内所有的类都添加,如: import mx.controls.* 减少内置资源的加载,例如使用[embeded]。可以使用外部文件,在运行时载入,而不是在编译时载入。
22.6 应用跨域访问 安全对于应用来说是非常重要的。Flex应用的运行是依靠Flash Player,可以把Flex应用看作SWF文件,由Flash Player播放。Flex应用文件存放在服务端,当用户浏览器请求查看时,需要把应用文件下载到本地才能查看,类似于许多使用flash开发的网站,在打开时显示“正在加载”或者显示进度条,此时,就是将SWF文件从远程下载到本地。所以Flex应用的安全分为2部分。 客户端:由Flash Player中的沙箱负责。 服务端:验证和授权用户获得服务端资源。 Flash Player允许访问、修改本地的文件,其自动检测应用中是否不符合正常运行的因素,例如无限循环,超出使用硬盘空间,默认情况为100k,当然,可以手动修改。 在考虑客户端安全问题时,主要面对客户端与服务器之间的安全问题,通常包含如下2个方面。 用户是否可以访问该资源,即站点。 用户是否可以下载该资源。