Flex 3权威指南
分類: 图书,计算机/网络,程序设计,Java Java Script J2EE,
作者: (美)塔伯(Tapper,J.)等著,杨博等译
出 版 社: 人民邮电出版社
出版时间: 2009-3-1字数:版次: 1页数: 502印刷时间:开本: 大16开印次: 1纸张:I S B N : 9787115196903包装: 平装内容简介
本书是Adobe公司官方教程,以课程的形式详细介绍了如何用Flex 3开发一个完整的界面华丽的网上杂货店应用程序,其中包括一个用于查看销售细节实时图的管理图表,以及一个用于添加或编辑网上商店中要销售商品的数据输入程序。书中详细介绍了Flex 3的相关知识点,具体包括构建、部署和调试RIA,使用功能强大的MXML语言布置应用程序,使用MXML和ActionScript构建自定义的UI组件,使用XML、基于SOAP的Web服务和远程调用协议AMF连接到数据等。
本书适合各层次Flash和Flex开发人员阅读。
目录
第1课理解RIA
1.1理解计算机应用程序的演化过程
1.2超越基于页面的架构
1.3明确RIA的优势
1.3.1企业经理
1.3.2IT组织
1.3.3终端用户
1.4各种RIA技术
1.4.1Ajax
1.4.2Flash
1.4.3Flex
1.4.4WPF、XAML、Silverlight和Expression
1.5学习收获
第2课开始
2.1开始Flex应用程序开发
2.2创建项目和MXML应用程序
2.3理解Flex Builder 3工作平台
2.4运行应用程序
2.5创建第二个应用程序页面,然后进入设计模式
2.6准备下一课
2.7学习收获
第3课布置界面
3.1学习容器相关知识
3.2用设计模式布置电子商务应用程序
3.3使用基于约束条件的布局
3.3.1使用相对父容器的约束条件
3.3.2使用增强型约束条件
3.4使用视图状态
3.5在源码模式中布置应用程序
3.6学习收获
第4课使用简单的控件
4.1简单控件简介
4.2显示图片
4.3建立详细信息视图
4.4使用数据绑定将数据结构链接到简单的控件
4.5使用Form布局容器布置简单的控件
4.6将单选按钮和数据字段添加到Dashboard
4.7学习收获
第5课处理事件和数据结构
5.1理解事件处理
5.1.1理解一个简单的例子
5.1.2用ActionScript函数处理事件
5.1.3调用事件处理函数时传递数据
5.2当creationComplete事件发生时建立数据结构
5.3使用来自事件对象的数据
5.4建立一个自定义的ActionScript类
5.5建立一个方法来创建对象
5.6建立购物车类
5.7学习收获
第6课为控件使用远程XML数据
6.1从HTTPService中获取XML数据
6.1.1创建HTTPService对象
6.1.2调用send()方法
6.1.3使用返回的数据
6.1.4理解安全问题
6.2通过HTTPService获取XML数据
6.3将HTTPService数据填入ArrayCollection
6.3.1使用ArrayCollection
6.3.2使用Collection作为数据提供者
6.4将数据填入ComboBox控件并用编程方法添加选项
6.5在Tree控件中使用XML数据
6.5.1理解E4X运算符
6.5.2将XML数据填入Tree控件
6.6获取XML数据并将这些数据转换为自定义类型的ArrayCollection
6.7对复杂数据结构使用数据绑定
6.8操作购物车数据
6.8.1将项目添加到购物车
6.8.2对ArrayCollection中的项目进行排序
6.8.3添加项目或者更新数量
6.8.4使用光标定位ShoppingCartItem
6.9添加Remove按钮
6.10学习收获
第7课用MXML创建组件
7.1介绍MXML组件
7.1.1理解创建自定义组件的基础知识
7.1.2一步步创建自定义组件
7.1.3在应用程序架构中使用自定义组件
7.2创建可更新/删除商品的组件,并将它实例化
7.3单击Update和Delete按钮时弹出商品信息
7.4创建另一个值对象
7.5为三个应用程序都创建数据管理器组件
7.6使用新的数据管理器组件
7.7实现添加商品的功能
7.8为Dashboard应用程序创建并使用组件
7.9学习收获
第8课使用控件和Repeater控制数据集
8.1使用数据集
8.1.1理解HorizontalList和TileList组件
8.1.2实现labelFuntcion
8.1.3实现itemRenderer
8.2使用HorizontalList和itemRenderer显示类别信息
8.3基于选中的类别显示商品
8.3.1使用Repeater遍历数据集
8.3.2从重复的组件中获取数据
8.3.3定位Repeater建立的组件
8.3.4理解TileList和Repeater的性能差异
8.3.5基于类别显示商品
8.4编写状态以显示商品信息详情
8.5将商品放入购物车
8.6学习收获
第9课使用自定义事件
9.1理解松耦合架构的优势
9.2分发事件
9.3为组件声明事件
9.4明确对自定义事件类的需求
9.5建立并使用CategoryEvent
9.6创建并使用ProductEvent类
9.6.1使用ProductEvent从购物车中移除商品
9.6.2使用ProductEvent向购物车添加商品
9.7理解事件流和事件冒泡
9.8学习收获
第10课用ActionScript 3.0创建自定义组件
10.1用ActionScript构建组件
10.2创建类的基本结构
10.3重写createChildren()方法
10.3.1在ActionScript中创建Button
10.3.2使用addChild()方法向组件添加Button
10.3.3理解边饰和rawChildren
10.3.4使用rawChildren上的addChild()向边饰部分添加元素
10.4在Flex中定位和调整组件大小
10.5理解measure()方法
10.6重写updateDisplayList()方法
10.7学习收获
第11课使用DataGrid与项目呈现器
11.1介绍DataGrid和项目呈现器
11.2向ChartPod添加通用的DataGrid
11.3向Dashboard中添加HTTPService调用
11.4用DataGrid显示购物车
11.4.1为DataGridColumn添加内联的编辑控件
11.4.2创建MXML的项目呈现器以显示商品
11.4.3创建内联的MXML项目呈现器用于显示Remove按钮
11.4.4使用set和get函数更新ShoppingCartItem
11.5使用AdvancedDataGrid
11.5.1为AdvancedDataGrid排序
11.5.2以专家模式进行排序
11.5.3设置AdvancedDataGrid的样式
11.5.4对数据进行分组
11.5.5显示摘要数据
11.6学习收获
第12课使用拖放
12.1介绍拖放操作管理器
12.2在两个DataGrid之间拖放
12.3在DataGrid和List之间拖放
12.4用不可以直接拖曳组件上实现拖放操作
12.5将商品拖进购物车
12.6学习收获
第13课实现导航
13.1导航
13.2在DataEntry程序中使用TabNavigator
13.3在电子商务应用程序中添加主页和结账页面
13.4创建由ViewStack显示的结账过程的第一步
13.5使用ViewStack完成结账过程
13.6学习收获
第14课使用格式器和验证器
14.1介绍格式器和验证器
14.2用格式器类显示电子商务应用程序的货币信息
14.3使用验证器类
14.4用正则表达式来验证数据(第一部分)
14.5用正则表达式来验证数据(第二部分)
14.6构建自定义验证器类
14.7学习收获
第15课实现历史管理和深度链接
15.1历史管理简介
15.2实现Navigator容器的历史管理
15.3构建自定义的历史管理器
15.4介绍深度链接
15.4.1实现Flex 3的深度链接
15.4.2为程序添加深度链接
15.5学习收获
第16课自定义Flex应用程序的外观
16.1用样式和皮肤来设计
16.2使用样式
16.2.1用标签的属性设置样式
16.2.2理解样式继承
16.2.3用mx:Style标签设置样式
16.2.4用Flex Builder工具来编写CSS
16.2.5用CSS文件来设置样式
16.3在运行时修改CSS
16.3.1运行时修改CSS的优点
16.3.2从CSS文件创建SWF
16.3.3用StyleManager加载CSS的SWF
16.3.4使用加载的CSS覆盖样式
16.4皮肤组件
16.4.1图形皮肤
16.4.2导入CS3创建的皮肤
16.4.3可编程的皮肤
16.5学习收获
第17课使用Web服务
17.1 服务器通信介绍
17.2 使用远程服务器调用的事件模型
17.3 配置应用程序在本地运行
17.4 在Dashboard中使用Web服务
17.4.1 处理Web服务的结果
17.4.2 调用Web服务方法
17.5 在DataEntry程序里使用Web服务
17.6 使用Web Service Introspection向导
17.7 在应用程序中使用生成代码
17.8 用Flex Builder重构
17.9 完成生成代码的集成
17.10 更新和删除商品
17.11 学习收获
第18课访问服务器端对象
18.1 向服务器上传文件
18.2 用RemoteObject来保存订单
18.2.1 更新Flex编译器命令
18.2.2 在结账过程分发订单确认事件
18.2.3 创建和调用远程对象
18.2.4 把ShoppingCart传入Checkout组件
18.2.5 改变程序状态以将其返回Welcome页面
18.3 把ActionScript对象映射到服务器对象
18.4 Flex Builder数据向导
18.5学习收获
第19课可视化数据
19.1 探索Flex图表组件
19.1.1 图表类型
19.1.2 图表软件包
19.1.3 图表的组成部分
19.2 布置最初的图表
19.3 填充图表
19.3.1 指定图表的系列
19.3.2 向折线图和柱状图添加横轴和纵轴
19.4 向图表添加图例
19.5 限制轴上显示的标识数量
19.6 与图表交互
19.6.1 鼠标经过事件
19.6.2 单击事件
19.6.3 选中事件
19.7 添加图表事件
19.8 向图表添加动画
19.9 用样式自定义图表外观
19.10学习收获
第20课创建模块化的程序
20.1 介绍Flex 3的模块化程序
20.2 使用Flex模块
20.2.1 使用Module类
20.2.2 用ModuleLoader标签来代替Checkout代码
20.3 理解RSL
20.4 使用Flex框架RSL缓存
20.4.1 理解框架缓存的目的
20.4.2 使用有签名的RSL与没有签名的RSL
20.4.3 检查程序的当前大小
20.4.4 配置程序使用框架RSL
20.4.5 检查框架RSL带来的差别
20.5 创建库项目
20.5.1 把类和资源加入库
20.5.2 在FlexGrocer程序中使用FlexGrocerLibrary
20.6学习收获
第21课部署Flex应用程序
21.1 编译应用程序的部署版本
21.2 用AIR摆脱浏览器
21.2.1 开始AIR
21.2.2 安装AIR
21.2.3 安装第一个程序
21.3 创建AIR应用程序
21.3.1 创建新的AIR项目
21.3.2 使Dashboard程序成为AIR应用程序
21.3.3 用Application.xml文件定制程序
21.3.4 导出AIR文件
21.4学习收获
第22课创建过渡和行为
22.1 介绍行为和过渡
22.1.1 在组件上使用行为
22.1.2 在视图状态上使用过渡
22.2 在组件上实现效果
22.3 为视图状态添加效果
22.4学习收获
第23课Flex的打印功能
23.1 介绍Flex的打印功能
23.2 第一次使用Flex的打印功能
23.3 在不可见容器中使用PrintDataGrid
23.4 在单独的组件中构建打印视图
23.5 调整打印输出的缩放比例
23.6 从结账过程打印收据
23.7学习收获
第24课使用共享对象
24.1 介绍共享对象
24.1.1 创建共享对象
24.1.2 读取共享对象
24.2 构建SharedObject来保存购物车数据
24.3 从已有的共享对象中读取数据
24.4学习收获
第25课调试Flex应用程序
25.1 调试技术简介
25.2 观察客户端与服务器端的数据交换
25.3 学习更多调试器相关知识
25.3.1 学习设置断点的更多相关细节
25.3.2 在调试器中检查变量及其相关值
25.4 使用try-catch处理错误
25.4.1 使用try-catch语法
25.4.2 理解错误类型
25.4.3 使用多个catch块
25.4.4 使用一个catch块的示例
25.4.5 在第一个catch块中使用基类Error的不良做法示例
25.4.6 使用finally语句
25.4.7 使用throw语句
25.4.8 创建自己的错误类
25.5学习收获
第26课对Flex应用程序进行剖析
26.1 Flash Player的内存使用
26.1.1 Flash Player的内存分配
26.1.2 按引用传递和按值传递
26.1.3 Flash Player的垃圾收集
26.1.4 垃圾收集
26.2 对Flex应用程序进行内存剖析
26.2.1 审查ProfilerTest应用程序
26.2.2 剖析ProfilerTest应用程序
26.2.3 修复ImageDisplay类
26.3 对Flex应用程序进行性能剖析
26.3.1 剖析ProfilerTest应用程序
26.3.2 修复ProfilerTest类
26.4学习收获
附录A 安装指南
书摘插图
第1课理解RIA
1.1理解计算机程序的演化过程
最早的商业应用程序的所有数据处理都发生在大型主机上,而客户端的任务仅仅包括显示来自服务器的信息以及接受用户输入,这主要是因为数据处理的成本很高。要在整个企业中遍布强大的客户端是无法承受的,因此只能将所有的数据处理集中起来,并由“哑终端”负责用户交互。
随着内存和处理的成本越来越便宜,哑终端被微机(也叫C)所取代。微机的处理能力更强,可以单独运行更多的桌面应用程序,比如文字处理程序和电子表格程序,因此,服务器不再是必需的了。应用微机的组织所面临的一个挑战在于不容易集中数据。虽然大型主机时代集中了一切,但是到了微机时代却要把数据分布开,结果在集中业务规则和同步企业内部数据时碰上了许多难题。
为了解决这些问题,多家厂商发布了力求结合微机与大型主机二者优势的平台,从而导致C/S(Client/Server,客户机朋艮务器)架构的诞生。这些平台把微机的功能和易用性提供给终端用户,同时允许从一个集中地点存储和访问商业逻辑和数据,为用户解决了当时的那些问题。但C/S体系引发了一个新问题——软件分发。如果客户端应用程序发生变化,IT部门就不得不手动对每一台单机上的软件进行重装或升级。许多公司发现,他们需要用一个全职的IT人员来负责保持终端用户桌面电脑上的软件是当前最新的。
随着20世纪90年代因特网的爆炸式发展,出现了一种商业应用程序的新模式。这种模式依赖一个作为瘦客户端的Web浏览器,其主要职责是呈现HTML(Hypertext Markup Language,超文本标记语言)并把请求发回到应用服务器,而应用服务器动态地生成页面并传给客户端。这往往被称为“基于页面的架构”①,该模式成功地解决了C/S时期面临的软件分发问题。每次终端用户需要应用程序时都会从服务器下载,所以只需升级单个中心服务器,就能自动分发给整个用户基。这一模式已经成功并将继续用于许多应用程序,但同时也带来了一些显著的缺点和局限性。实际上,因特网应用程序与大型机应用程序有很多相似之处,比如,所有处理都集中在服务器,而客户端只是呈现数据和捕获用户反馈。该模式最大的问题与UI(UserInterface,用户界面)有关。过去10年内终端用户逐渐接受的很多便捷元素都丢失了,而ul也受到HTML能力的限制。比如,桌面软件以及C/S应用程序会常常使用拖放功能。然而,HTML应用程序几乎从不使用该功能,这是因为该功能太复杂,而且缺乏支持跨浏览器flODHTML(Dynamic HTML,动态HTML)元素,而DHTML元素却是在纯HTML/DHTML方案中实现拖放功能所必需的。
在大多数情况下,能建成并交付使用的解决方案的总复杂度是大大降低了。虽然Web使部署应用程序更便捷,但基于Web的商业应用程序的功能却大幅度地后退了,这是因为基于浏览器的应用程序必须适应HTML以及HTTP(Hypertext Transport Protocol,超文本传输协议)等Web架构的局限性。
今天,对基于因特网应用程序的需求持续增长,与20世纪90年代中期的需求又有很大不同。终端用户和企业进行因特网技术投资时会提出越来越高的要求。为了给用户提供真正的价值,许多公司正在为因特网应用程序寻找更“丰富”的模式,既拥有传统桌面程序的丰富媒体,又拥有Web应用程序天生的丰富内容。
随着因特网应用程序开始被用于核心业务功能,应用程序的可维护性变得更加关键。一个应用程序的可维护性直接关系到应用程序的架构。可惜,许多Web应用程序在构建时几乎没有考虑过应用程序架构的原则,因此很难维护和扩展。今天,可以使用许多方式来将业务、数据访问和显示三者分隔开,因而能更容易地为应用程序建立一个稳固的架构。随着web服务等元素的引入,SOA(Service—OrientedArchitecture,面向服务的架构)的概念对基于Web的应用程序来说已经逐渐弯得可行。
为了满足企业的需求,RIA必须能做到以下几点。
RIA必须能为代码执行、内容显示和网络通信提供一个高效率、高效能的运行时环境。在1.2节,将会研究基于HTML的标准应用程序的各种限制;学习与基于页面的传统架构的大量性能相关的问题。
RIA必须能提供强大而又可扩展的对象模型以方便交互。Web浏览器近年来的进步,已经有能力支持通过JavaScript和lDHTML在DOM(Document Object Model,文档对象模型)中进行交互,但它们仍然缺乏跨平台和跨浏览器的标准化支持。若使用上述工具建立可以运行在各种浏览器和操作系统中的RIA,就要创建同一应用程序的多个版本。RIA必须能使用服务器端对象,不论是通过web服务还是别的类似技术。RIA要保证能够使显示逻辑和用户界面与封装在服务器端中的应用逻辑彻底地分离。
RIA必须允许离线使用因特网应用程序。一方面,笔记本电脑和其他便携设备的人气持续增长,另一方面,因特网应用程序最严重的局限性之一,就是要求运行应用程序的机器必须连接到因特网。虽然用户绝大多数时间都可以上网,但对商务旅行者来说,有些时候是不可能连接到因特网的。一个成功的RIA应该允许用户不论在线或者离线都能使用它。
1.2超越基于页面的架构
对于经验丰富的Web开发者来说,构建RIA最大的挑战之一是脱离基于页面的架构。传统的Web应用都围绕着网页这个概念。不论使用哪种服务器端技术(如果用到的话),流程总是类似下面这样。
(1)用户打开浏览器,向web服务器请求一个页面。
(2)wed服务器收到请求。
(3)(可选)网络服务器把请求交给应用服务器来动态组装页面。
(4)(可选)网络服务器从文件系统获取静态页面。
(5)web服务器将(动态或静态)页面发回给浏览器。
(6)浏览器绘制页面以替代先前显示的页面。
即使在新页面的大部分内容与先前页面基本相同的情况下,整个新页面依然需要被发送到浏览器并呈现。这是传统Web应用程序低效的原因之一:每次用户交互都需要在浏览器中加载一个新页面。RIA的关键目标之一就是要减少每次请求传送的额外数据量。相比下载整个页面,为什么不可以只下载改变了的数据,然后再更新用户正在浏览的页面呢?这正是标准桌面程序或者C/S应用程序工作的方式。
虽然这个目标似乎不难,也很容易被首次进行RIA开发的开发者所接受,但Web开发者往往会把基于页面的思维方式带到RIA中,执著于想解决RIA中已经不需要解决的旧问题,例如如何“维持状态”。举例来说,用户登录以后,怎么知道他们是谁,允许他们用应用程序做些什么?
维持状态是基于Web的应用程序引入的一个挑战。HTTP被设计为一种无状态协议,每次对服务器的请求都是一次原子操作,对先前的请求一无所知。这种无状态的本质让Web更具效率和冗余性,因为在浏览器和服务器之间并不需要保持连接。每一个新页面的请求持续的时间仅仅是服务器用来检索和发送该页面的时间,这样能让单台服务器处理更多同时发来的请求。
Web无状态的本质也给应用程序开发者带来了一些挑战。通常,应用程序需要记住用户相关的资料,如登录权限、添加到购物车的物品,等等。如果没有能力记住一次次请求之中的这些数据,就不可能进行真正的应用开发。为了帮助解决这个问题,实施了一系列的解决方案,其基本原理是在每次请求时将一个独特的标识发回给服务器(通常使用cookie。cookie是一些小文本文件,包含了应用程序指定的每个用户的特定标识符),并在服务器存储该用户信息。
有别于传统的Web应用程序,RIA可以绕过许多上述问题。因为应用程序在被用户使用(而不像基于页面模式那样只是加载和卸载)的整个时间内一直待在客户端的内存中,所以只要设定一次变量,就能在整个应用程序的生命周期中访问该变量。
许多情况下,开发RIA时与开发Web应用程序时所需的思维方式稍有区别,处理状态的方法不同只是其中之一。事实上,基于Web的RIA相LLWeb应用程序反而与C/S应用程序有更多的相似性。
1.3明确RIA的优势
与20世纪90年代中后期的网络泡沫时不同,企业不会再简单地因为因特网技术很酷就投资。要取得成功,一项新技术必须体现出真正的投资回报率和真正的价值增长。RIA可在以下几个层次上实现以上目标,其中都降低了开发成本并增加了整个组织的价值。
……