??xml version="1.0" encoding="utf-8" standalone="yes"?> 1.首先下蝲FlexPaper的源码?a target="_blank">下蝲地址 2.本h不懂flashQ只是百度下Q然后自q弄弄的。我用的flash build 4.5 提供个keyQ?499-4181-9296-6452-2998-3656 首先在flash build中新Z个flex目Q第一步填写项目名U?flexpaperQ第二步直接默认Q最后一步需要注意下?/p> 选择合ƈC码中Q要不然你的bin-debug目录下面会出现很多其他的swf文g 然后把你1步下载下来的源码解压?/p> 把这三个目录全部复制C刚才建立的flex目根目录下。最后结果是q样的: q时候打开src目录下面默认包下的flexpaper.mxml文gQ加入如下代码,里面paper.swf是从pdf转换q来的,不懂的就看看我说flexpaper的文章?/p> 然后点击目的属性,附加的~译参数修改成如下所C,-source-path=locale/{locale} 我记得这些全部完成以后,好像有个文g一处会有错误,如果出错文g前面会有个红×Q找到它Q然后把那句话去掉,是一个属性设|。没什么媄响?/p> 然后可以run了?/p> 修改Q?/p> 1.右上角有一个FPQ点M后出现about 扑ֈ如下所C的文gQ?/p> 2.修改右下角的logoQ如?/p> 扑ֈ如下文gQ打开Q找到sizeChangedq个函数。把里面的两句话都注释掉OK了。(虽然不懂Q但是这些看看也都能知道个大概) 好了。修改完毕。至于其他的修改Q大家可以自q看源文g。反正功能老外都帮我们现实了,我们只要修修Ҏ而已?/p> 补充一点,如果想用Q入下图Q?/p> 扑ֈ目bin-debug下面的flexpaper.swf。(其他的swf是我之前没有合q到代码中的那些swfQ如果没有合q的需要把q些swf文g全部一h贝) 攑֜你下载回来的例子中,替换如下Q?/p> 把刚才的文gҎq个名字OK了。然后在q行׃发现可以了?/p> 上面的方法似乎是把flash已经写死了,下面的这U方法编译出来的swf应该是可以动态加载flash的。(从网上找到的Q?/p> 只需要加入如下的语句Q就可以调用gotoPage接口?/p> 别忘了增加一句监听,ljs调用 q里我们通过一个简单的HelloWorld目演示Air目的开发过E,本文演示的是?/span>Windows操作pȝ下,使用HTML技术来开?/span>Air应用的过E,在不同操作系l下Q用不同的开发技术(比如Q?/span>flash/flexQ开发过E可能会略有不同?/span> 一个完整的Air开发环境需要安?/span>AirRuntime?/span>AirSDK?/span>JavaRuntimeQM来说安装与配|过E还是比较简单的。其?/span>AirRuntime?/span>JavaRuntime的安装非常简单,我们只需要下载,q执行下载文件安装即可,和安装一个普通的应用E序没什么两P下蝲地址Q?/span> AirRuntimeQ?/span>http://get.adobe.com/cn/air/ JavaRuntimeQ?/span>http://www.java.com/zh_CN/ 需要说一下的?/span>AirSDK的安装,首先我们要下载它Q?/span>http://www.adobe.com/products/air/tools/sdk/ 下蝲后我们会得到一?/span>AdobeAIRSDK.zip文gQ您可以它解压CQ何一个目录下Q例如解压到“D:/AirSDK/”。解压后只需要在path环境变量中加?#8220;D:/AirSDK/bin”。这P我们的开发环境就搭徏好了Q下面让我们来开发应用程序吧?/span> 每一?/span>Air应用都需要一个应用程序配|文Ӟ以下UCؓQ项目描q文ӞQ这个文件?/span>XML格式Q用于配|项目相关的信息Q比如程序入口,初始H体的一些设|等?/span>Airq行时框架也是通过此文件才能得知应用程序的入口信息?/span> 在这个程序配|文件中我们可以指定应用E序入口HTML文gQ这P我们可以通过q个HTML文g来开?/span>Air应用之旅。下面我们将制作一?/span>Air应用Q整个应用由“application.xml”?#8220;HelloWorld.html”两个文gl成。我们先来看看项目描q文件?/span> 我们先来建立一个目录来存放Air应用的文Ӟ比如Q?#8220;D:/airApps/HelloWorld”。在HelloWorld建立一?/span>application.xml文gQ其内容如下Q?/span> <?xml version="1.0" encoding="UTF-8"?> <application xmlns="http://ns.adobe.com/air/application/1.5"> <id>com.keda.examples.HelloAir</id> <version>0.1</version> <filename>HelloAir</filename> <initialWindow> <content> HelloWorld.html</content> <visible>true</visible> <width>400</width> <height>200</height> </initialWindow> </application> 单解释一下: 1. <application> 元素Q包?/span> AIR 命名I间属性: <application xmlns="http://ns.adobe.com/air/application/1.5"> 该命名空间的最后一部分“1.5” 指定了应用程序所需的运行时?/span> 本?/span> 2. <id> 元素Q?/span> <id>examples.html.HelloWorld</id> 应用E序 ID 与发布?/span> ID Q?/span>AIR 从对应用E序包进行签名时使用的证书中获取Q一?/span> 可以标识唯一的应用程序。徏议采用的形式Z点分隔的反向 DNS 样式的字W串Q如 "com.company.AppName"。应用程 ?/span> ID 可用于安装、访问专用应用程序文件系l存储目录、访问专用加密存储以及应用程序间的通信?/span> 3. <version> 元素Q?/span> <version>0.1</version> 可帮助用L定安装哪个版本的应用E序?/span> 4. <filename> 元素Q?/span> <filename>HelloWorld</filename> 用于操作pȝ中应用程序可执行文g、安装目录和对应用程序的其它引用的名U?/span> 5. 包含下列子元素的 <initialWindow> 元素Qؓ初始应用E序H口指定属性: <content>HelloWorld.html</content> 标识 AIR 要加载的?/span> HTML 文g?/span> <visible>true</visible> 使窗口立卛_见?/span> <width>400</width> 讄H口宽度Q以像素为单位)?/span> <height>200</height> 讄H口高度?/span> 新徏“HelloWorld.html”内容如下Q?/span> <html> <head> <title>Hello World</title> </head> <body > <h1>Hello World</h1> </body> </html> HTML很简单,q里不多说了。到q里我们?/span>Air应用q写完成了Q下面让我们调试q行一下?/span> ?/span>Dos命o行下q入“D:/airApps/HelloWorld”Q然后?/span>adl命oq行高度。命令如下: adl application.xml 看看q行l果Q?/span> ?/span>Air应用打包之前需?/span>Air的证书,Air证书有两U,一U是Air颁发的,另一U是自签名证书,q种证书我们可以直接通过命o行生成ƈ使用Q自{证书打包的应用在安装时不会显C机构名Uͼ如下图所C: 但作为学习自{证书q是比较适用的,下面介一下自{证书的生成?/span> 命o格式说明Q?/span>adt -certificate -cn name [-ou org_unit][-o org_name][-c country] key_type pfx_file password -cn name 分配的作为新证书公共名称的字W串?/span> -ou org_unit 分配的作书颁发组l单位的字符丌Ӏ(可选。) -o org_name 被分配作书颁发组l的字符丌Ӏ(可选。) -c country 双字?/span> ISO-3166 国家/ 地区代码。如果提供的代码无效Q则不会生成证书。(可选。) key_type 用于证书的密钥类型,?#8220;1024-RSA” ?#8220;2048-RSA”?/span> pfx_file 证书文g的生成\径?/span> password 新证书的密码。当使用此证书对 AIR 文g{旉要提供密码?/span> 例如本程序证书用以下命令生成: adt -certificate -cn HelloWorld -ou it.kedacom.com -o KEDACOM 2048-RSA HelloWorld.p12 kedacom 证书生成之后我们可以进行打包了Q?/span> adt –package -tsa none -storetype pkcs12 -keystore HelloWorld.p12 HelloWorld.air application.xml HelloWorld.html pȝ提C您输入生成证书时的密码Q?/span>kedacom?/span> HelloWorld.air 参数表示 ADT 生成?/span> AIR 文g?/span>HelloWorld-app.xml 表示应用E序描述W文件。后面的参数表示?/span> 用程序所使用的文件。此CZ仅用了两个文gQ但可以包含L数量的文件和目录?/span> xQ我们的应用已l完成了Q您可以通过双击生成?/span>.air安装包来安装我们的应用?/span> 用命令行工具q行打包q是比较J琐的,推荐使用Aptana Studio来开?/span>Air应用Q项目创建、证书的生成、打包都有图形化工具可以使用?/span> Aptana Studio下蝲地址Q?/span>http://www.aptana.org/studio/download
]]><?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute"
width="100%" height="100%"
xmlns:flexpaper="com.devaldi.controls.flexpaper.*">
<!--Scale为浏览文档的攑֤比率-->
<flexpaper:FlexPaperViewer width="100%" height="100%"
Scale="1.0" SwfFile="Paper.swf" />
</mx:Application>
打开Q搜索bttnInfoQ一共就三句Q全部注释掉。然后在runQ就会发现右上角的FP没了。(print也是在这个文仉面修改的Q大家自q看吧Q?/p> <?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:fp="com.devaldi.controls.flexpaper.*"
layout="absolute" width="100%" height="100%"
applicationComplete="initApp();">
<mx:Script>
<![CDATA[
import mx.controls.Alert;
public var _aid = 0;//文档ID
[Bindable]
public var _Scale:Number = 1;//~放比例
[Bindable]
public var _SwfFile:String = "";//SWF文g路径
[Bindable]
public var _ZoomTransition:String = "easeOut";
[Bindable]
public var _ZoomTime:Number = 0.6;
[Bindable]
public var _ZoomInterval:Number = 0.1;
[Bindable]
public var _FitPageOnLoad:Boolean = false;//加蝲后适合高度
[Bindable]
public var _FitWidthOnLoad:Boolean = false;//加蝲后适合宽度
[Bindable]
public var _PrintEnabled:Boolean = true;//是否支持打印
[Bindable]
public var _FullScreenAsMaxWindow:Boolean = false;//是否支付全屏
[Bindable]
public var _ProgressiveLoading:Boolean = false;//是否延迟加蝲
[Bindable]
public var _localeChain:String = "zh_CN";//语言
private var isFocus:Boolean = false;
//初始化参?
private function initApp():void{
var params:Object = Application.application.parameters;
_Scale = getNumber(params, "Scale", 1);
_SwfFile = getString(params, "SwfFile", "Paper.swf");
_ZoomTransition = getString(params, "ZoomTransition", "easeOut");
_ZoomTime = getNumber(params, "ZoomTime", 0.6);
_ZoomInterval = getNumber(params, "ZoomInterval", 0.1);
_FitPageOnLoad = getBoolean(params, "FitPageOnLoad", false);
_FitWidthOnLoad = getBoolean(params, "FitWidthOnLoad", false);
_PrintEnabled = getBoolean(params, "PrintEnabled", true);
_FullScreenAsMaxWindow = getBoolean(params, "FullScreenAsMaxWindow", false);
_ProgressiveLoading = getBoolean(params, "ProgressiveLoading", true);
_localeChain = params["localeChain"];
//注册事g监听
this.addEventListener(MouseEvent.MOUSE_OVER, onMouseOver);
this.addEventListener(MouseEvent.MOUSE_OUT, onMouseOut);
//开攄外部QjavascriptQ调?
ExternalInterface.addCallback("hasFocus", hasFocus);
//ExternalInterface.addCallback("focus", focus);
ExternalInterface.addCallback("setViewerFocus", setViewerFocus);
}
private function onMouseOver(event:MouseEvent):void{
this.isFocus = true;
}
private function onMouseOut(event:MouseEvent):void{
this.isFocus = false;
}
public function hasFocus():Boolean{
//Alert.show("hasFocus");
return isFocus;
}
public function setViewerFocus(isFocus:Boolean):void{
//Alert.show("setViewerFocus");
this.paperViewer.setViewerFocus();
}
/**
*
* 获取Stringcd参数
* 如果没有Q则q回默认?
**/
private function getString(params:Object, name:String, def:String):String{
if(params[name] != null){
return params[name];
}
return def;
}
private function getNumber(params:Object, name:String, def:Number):Number{
if(params[name] != null){
return params[name];
}
return def;
}
private function getBoolean(params:Object, name:String, def:Boolean):Boolean{
//Alert.show("比较Q?+name);
if(params[name] != null){
return params[name] == "true";
}
return def;
}
]]>
</mx:Script>
<!--mx:Panel x="165" y="76" width="250" height="200" layout="absolute" title="一个h">
<mx:Label x="59" y="37" text="{Scale}" width="88"/>
</mx:Panel-->
<fp:FlexPaperViewer id="paperViewer"
width="100%"
height="100%"
Scale="{_Scale}"
SwfFile="{_SwfFile}"
ZoomTransition="{_ZoomTransition}"
ZoomTime="{_ZoomTime}"
ZoomInterval="{_ZoomInterval}"
FitPageOnLoad="{_FitPageOnLoad}"
FitWidthOnLoad="{_FitWidthOnLoad}"
PrintEnabled="{_PrintEnabled}"
FullScreenAsMaxWindow="{_FullScreenAsMaxWindow}"
ProgressiveLoading="{_ProgressiveLoading}" />
</mx:Application>
但是按照上述Ҏ试了下,无法调用官Ҏ供的API接口了。原因是上述的程序ƈ没有提供接口Q接口在FlexPaperViewer_Base.mxmlQ这个文件中public function gotoPage(p:Number):void{
paperViewer.gotoPage(p);
}ExternalInterface.addCallback("gotoPage", gotoPage);
]]>建立开发环?/span>
~写应用E序
创徏目描述文g
创徏入口HTML面
调试q行Air应用
打包和分?/span>
生成证书
打包分发
]]>
Flex 作ؓ?Internet 应用QRIAQ时代的新技术代表,自从 2007 q?Adobe 公司其开源以来,Flex ׃前所未有的速度在成ѝ很多公司,包括 IBM 都纷U加入了 Flex 开发的阵营当中。很多开发h员也按捺不住 Flex ?#8220;诱惑”而准备从?Flex 开发。本文主要讲q?Flex 开发的基础知识Q主要是关于开发环境的搭徏Q以及介l简单的 Flex 目创徏、编码、调试以及部|的q程?Flex ~程的基本知识。通过本文的学习,您将会学习如何搭?Flex 基本的开发环境以及开发、调试和部v斚w的基知识。ؓ您以后深入系l的学习 Flex 打下良好的基?/p>
要学习本文,您需要有一定的 Web ~程l验?Eclipse FireFox 使用l验?/p>
本文所有示例均?Windows XP SP3 pȝ中测试完成。您需要一台能畅q行 Windows XP pȝ的机器,除此之外您还需要一些工h能试用本文中的代码。所有这些工具都可以免费下蝲Q参?参考资?/a>Q:
接下来我们便q不及待的开始吧Q首先搭建我们的开发环境,Z减少因ؓ环境不一致而引L问题Q徏议读者用与本文相同的Y件版本:
大家知道 Flex 代码~译后是一?SWF 文gQ运行在 Flash Player 中,要想看到 SWF 文g在运行时输出的一些调试信息是比较困难的。所以在安装好基本的软g之后Q我们要安装一些便于我们调?Flex ?FireFox 插gQ?/p>
下蝲 q安?debug 版本?FireFox Flash Player 插g ( 本文使用的版本ؓ Flash Player10)
打开 FireFoxQ到 FireFox ?扩展lg站点 上搜索ƈ安装 HttpFoxQFlashTracerQCache Status 三个插gQ如?1 所C?/p>
?1Q开发调试需要的 FireFox 插g
在安装了 Debug 版本?Flash Player 之后QFlash Tracer 能显C您在程序中?trace() 语句输出的调试信息,HttpFox 插g不仅能查?HTTP 通信的过E和数据Q还能看到哪些内Ҏ?Cache 里面d的。另外,Cache Status 插g可以让我们方便的理~存。在 Flex 开发过E中Q往往需要先清除掉缓存中的内容,才能看到新改动的效果?/p>
接下来我们打开 Flex Builder, 在菜?strong>Window>Preferences>Server>Runtime Environment中设|我们的 Tomcat6 以及在菜?strong>Window>Preferences>General>Web Browser中设|浏览器为外部浏览器 FireFoxQ如?2 和图 3 所C:
到此为止Q我们的开发环境算是彻底搭建完毕,可以看出q个q程q不是特别单。别急,先苦后甜Q小憩一下,让我们来享受一?Flex 开发带来的乐趣吧!
打开 Flex Builder, 如图 4 所C,新徏一?Flex 目Q?/p>
?4Q新?Flex 目
在图 5 所C|页面中Q我们选择目cd?Web applicationQ关?AIR cd应用的基知识可参?developerWorks 上的另一文?a >《?Adobe AIR ?Dojo 开发基?Ajax ?Mashup 应用?/a>?Application server type 我们?J2EE ZQƈ且不要钩?Use remote object access service, 关于q些高内容Q我们将在后l的文章中陆l讨论。最后我们?Eclipse Ganymede J2EE 版本内置?WTP(Web Tools Platform) 来创Z个后端?Java 前端使用 Flex ?RIA 目。在默认讄下,src ?Java 代码的源代码文g夏V?/p>
?5Q设|?Flex 目
在后l的讄面中,我们配置目q行时的 J2EE server 为我们在安装配置开发环境部分中配置?Tomcat6 如图 6 所C:
点击 NextQ在下一个页面中一切都按照默认讄卛_。如?7 所C,Main source folder 是设|默认的 flex 代码 ( 包括 mxml ?Action script) 的源文g夹,Main application file 是项目默认的d用?Out folder URL 是项目运行在我们配置?Tomcat 上时?URL.
一切完成之后,我们来看看项目的l成l构Q如?8 所C:flex_src 中是默认?flex 源码位置Qflex_libs 则是存放 flex 其他W三方包的默认\径。类g web 应用?lib 文g夏V?src ?java 代码位置?WebContent 文g夹的l构和普通由 WTP 建立?Web Project 的结构完全相同。在默认的输\?bin-debug 文g夹中Q我们可以看?Flex builder 自动生成?FlexSample.mxml 文g已经被自动编译成 FlexSample.swf 文g?/p>
?8QFlex 目l构
接下来,我们在新创徏的项目上增加一点内容ƈ让它q行hQ双?FlexSample.mxml, 在其中添加一个最基本?Flex lg :Label, q且在该应用初始化的时候调?init() Ҏ。我们在 init() Ҏ中用 trace() 语句输出调试信息。代码如下清?1 所C:
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" initialize="init()"> <mx:Script> <![CDATA[ private function init():void { var i:int = 0; i++; trace("i="+i); } ]]> </mx:Script> <mx:Label text="Hello World!" /> </mx:Application> |
现在Q终于到了让我们的项目运行的时候了 ! 右键点击目 ->Run As->Run On Server 如图 9 所C:接下来的几个面选择默认卛_Q这时大家我们可以看到项目会被部|到我们配置?Tomcat6 上去。ƈ?Flex Builder 会自动打开一个我们刚才配|的外部 FireFox H口?/p>
?9Q运行项?/strong>
但可能o您遗憄?Flex Builder 自动打开?FireFox H口打开?URL: http://localhost:8080/FlexSample/ 却什么也没有。别着急,q剩下最后一步:
如图 10 所C:右键点击我们要运行的 FlexSample.mxml > Run As > Flex Application
如果不出意外的话Q您应该会看C面的界面QFlash Tracer 插g输出了我们用 trace() 语句输出?debug 信息Q标{ Hello World Q也被显C到了界面上。同P打开 FireFox ?HttpFox 插gQ我们也可以看到在运行时 FlexSample.swf 被蝲入?/p>
?11Q运行后的界?/strong>
如果我们希望像调?Java 代码那样Q在q行时观察变量的值怎么办呢Q首先我们像?Java 代码中设|断点一L我们?Action Script 代码增加断点。如?12 所C:
然后选择我们?FlexSample.mxml 右键选择调试q行。如?13 所C:
然后我们随提C切换到 Flex 的调试视图,׃看到我们可以?Java 调试模式那样L的调?Flex 代码。如?14 所C:
利用 WTPQ我们可以将目 export 成一个标准的 war file. 导出的 war 文g攑ֈ Tomcat ?webapps 目录或者其?web 服务器的相应目录下就可以当作一个标准的 web 应用来部|运行?/p>
到此为止Q我们应该庆一下我们已l迈入了 Flex 的大门了Q我们已l编译出了我们自q swf 文gQƈ且运行在服务器上了。熟悉了q个开发过E之后,让我们乘胜前q,l合一个小例子学习一?Flex 的编E基知识吧!
在上?Hello World 的例子中我们可以看出Q就像在 HTML 中嵌?JavaScript 那样Q我们可以在 mxml 里面嵌入 Action Script 代码来实C务逻辑。没错!如果您把 Flex ?mxml ?Action Script 的关pȝ解ؓ Html ?JavaScript 的关p,您会忽然发现您对 Flex 变的如此熟悉Q?/p>
Action Script 语言是面向对象的脚本语言Q它q编写方式都?JavaScript 非常的相伹{除了可以嵌套在 mxml 里面之外Q它q可以像 JavaScript 写在单独?.js 文g里面那样写在单独?.as 文g里面Q然后在 mxml 里面引入它?/p>
下面我们新徏一?Action Script 的类 J2eeServer.as 如清?2 所C:
package com.ibm.flex { import flash.events.EventDispatcher; import mx.rpc.AsyncToken; import mx.rpc.events.FaultEvent; import mx.rpc.events.ResultEvent; import mx.rpc.http.HTTPService; public class J2eeServer extends EventDispatcher { public function J2eeServer() { } public function sendRequest(locale:String):void { var httpObject:HTTPService = new HTTPService(); httpObject.resultFormat = "text"; httpObject.url = "http://localhost:8080/FlexSample/SampleServlet?locale="+locale; var responder:mx.rpc.Responder = new mx.rpc.Responder(onSuccess, onFault); var call:AsyncToken = httpObject.send(); call.addResponder(responder); } private function onSuccess(event:ResultEvent):void { this.dispatchEvent(event); } private function onFault(event:FaultEvent):void { trace("communication failed!"); this.dispatchEvent(event); } } } |
在这个类定义里面Q熟?Java 的开发h员可以看出其~码规范?Java 非常cM。在其中我们定义了一?sendRequest() ҎQ?使用 HTTPService 对象发v一?http ?get h , q且对于不同的返回结果我们定义了 onSuccess() ?onFault() 两个Ҏd理。在q两个结果处理方法中Q我们将事g dispatch 出去?/p>
?J2eeServer.as 中,我们通过 Action Script 发出 http hQ现在我们定义一个服务器端的 servlet 来处理该h。如清单 3 所C:
package com.ibm.sample; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class SampleServlet extends HttpServlet { private static final long serialVersionUID = 1L; public SampleServlet() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String locale = request.getParameter("locale"); response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("The locale you selected is " + locale); } } |
和普?web 应用一样配|?web.xml, 如清?4
<?xml version="1.0" encoding="UTF-8"?> <web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <display-name>FlexSample</display-name> <servlet> <display-name>SampleServlet</display-name> <servlet-name>SampleServlet</servlet-name> <servlet-class>com.ibm.sample.SampleServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>SampleServlet</servlet-name> <url-pattern>/SampleServlet</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>FlexSample.html</welcome-file> </welcome-file-list> </web-app> |
?J2eeServer.as 中我们依E可以看出 Flex 事g驱动的媄子。的,Flex 的业务流E大多是靠事件来驱动的。某一个方法结束后Qdispatch 出去一个事件。事件的监听者监听到q个事g后就会采取相应的动作来处理事件。如清单 5 所C:我们?init() Ҏ中进行了事gl定Q绑定了两个监听Ҏ successHandler () ?errorHandler () ?J2eeServer 上。当 J2eeServer 完成和服务器?servlet 通信 dispatch 出相应的事g后,两个监听Ҏ便会监听到相应的事gq进行处理?/p>
Flex 的另外一个重要的特点是支持数据l定Q在另一文?a >《?Eclipse ?JavaFX 开?Mashup 应用?/a>中我们曾介绍?JavaFx 的数据绑定特性,同样 Flex 也支持数据绑定。当数据源被l定到另外一个对象的某属性上Ӟ数据源的数据如果发生变化Q开发h员不需要写额外的代码该对象的属性值就可以相应的变化。如清单 5 中所C:如果要进行数据绑定,则要先定义一个可l定的数据源Q例如我们在变量 private
var
serverResponse:String =
""
;
的上面设|?[Bindable] 属性,表示其ؓ可绑定变量。然后我们在 resultLable 中用花括号 {serverResponse
} 变?code>serverResponsel定?resultLable ?text 属性上?/p>
清单 5QFlexSample.mxml
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init()"> <mx:Script> <![CDATA[ import mx.rpc.events.ResultEvent; import mx.rpc.events.FaultEvent; import com.ibm.flex.J2eeServer; import mx.collections.ArrayCollection; private var jserver:J2eeServer = new J2eeServer(); //可绑定变? [Bindable] private var serverResponse:String = ""; //可绑定变? [Bindable] private var locales:ArrayCollection = new ArrayCollection( [ {label:"en_us", data:"en_us"}, {label:"zh_cn", data:"zh_cn"}]); private function init():void { //事gl定 jserver.addEventListener(ResultEvent.RESULT, successHandler); jserver.addEventListener(FaultEvent.FAULT, errorHandler); } private function localeComboxChangeHandler(event:Event):void { jserver.sendRequest(localeCombox.selectedItem.data); } private function successHandler(event:ResultEvent):void { serverResponse = event.result.toString(); trace(event.result); } private function errorHandler(event:FaultEvent):void { serverResponse = event.message.toString(); trace(event.message); } ]]> </mx:Script> <mx:VBox> <mx:Label text="Select your locale:" /> <mx:ComboBox id="localeCombox" width="160" dataProvider="{locales}" change="localeComboxChangeHandler(event)"/> <mx:Label id="resultLabel" text="The response from server is: {serverResponse}" /> </mx:VBox> </mx:Application> |
最l项目的文gl构如图 15 所C:
q行目Q我们可以看到当我们改变下拉框的值的时候,会触?localeComboxChangeHandler() 函数调用 J2eeServer ?sendRequest() Ҏ选择?locale 值发送给服务器端?servletQƈ且在l果q回后,从服务器端得到?response 昄?resultLable 上。如?16 所C:
Flex 作ؓ RIA 的新技术,对传l?web 开发技术有l承也有发展。这文作ؓ入门文,主要作用是帮助大家掌?Flex 的开发环境、开发方式、开发调试部|的程以及 Flex 的基本编E知识。但 Flex 除了国际化、Unit 试、Ant ~译{传l问题之外,作ؓ新技?Flex q有很多不同以往的地方,比如模块开发,RSL(Runtime Shared Libraries), Shared object、和 JavaScript 交互以及它的 MVC 框架 cairngormQ远E调用和消息传递框?BlazeDS {。所有这些问题都是值得我们q行后箋讨论的?/p>
在本文完成之际,特别感谢 IBM 中国软g开发中?IM 开发团队我的同事们在工作和学习中给我的巨大帮助Q?/p>
学习
获得产品和技?/strong>