主题:  Java for Flash动态网站开发手札》_部分章节连载

zhangyafei

职务:普通成员
等级:1
金币:0.0
发贴:31
注册:2005/12/27 23:45:16
#12007/1/21 11:19:35
第Ⅰ篇 Java for Flash基础入门

[indent]学习任何技术都有一个基础知识,Java for Flash也不例外。本篇包含几个章节,介绍了Java for Flash的基本知识。

在第一章,我们介绍了如何安装和配置Java for Flash的开发和运行环境,这样,用户就可以开发Flash网络应用程序以实现和Java应用程序的交互。

在随后的几章,我们介绍了如何使用Java语言、如何使用JDBC结合数据库以及面向对象的Java开发。

而在第五章,我们开始使用传统的JSP网页作为中间件方法开发Flash网络应用程序,与服务器之间实现数据交换,了解了如何建立网络环境的最一般原理,有了基本的创建具有网络交互功能Flash影片应用程序的基本知识,这是实现使用Flash影片应用程序作为网络应用程序主体的一次“飞跃”。[/indent]

现在马上出发

作者邀您访问他的BLOG: http://zhang-yafei.spaces.live.com (繁体)
作者邀您访问他的BLOG: http://blog.csdn.net/zhang_yafei (简体)



zhangyafei

职务:普通成员
等级:1
金币:0.0
发贴:31
注册:2005/12/27 23:45:16
#22007/1/21 11:20:08
第01章 开发和运行环境的安装与配置
《JavaforFlash动态网站开发手札》又被称之为网络三剑客,它提供了使用FlashPlayer、XML和Java建立下一代网络应用程序最迅速、最大限度节省投资和最具有挑战性的方法组合,这一组合事实上包含四个方面:FlashPlayer的应用环境、XML的应用环境、Java应用环境以及这三个应用环境的相互关联。
在FlashPlayer、XML和Java这三剑客组成的软件运行环境中:Java是基础架构,它为Java应用程序提供运行环境,并且JSP、Servlet、JavaBeans、EJB、JMXMBean等程序组件都是在后端运行;FlashPlayer是Flash影片应用程序在前端运行的解释器(也是一个虚拟机),必须安装在客户端。FlashRemoting是Flash影片应用程序连接到Java程序的服务器和网关,它们之间的连接也是在后端运行。
本章我们就来介绍怎样安装和配置网络三剑客的开发和运行环境。

1.1新架构的优点
使用网络三剑客架构,事实上包含四个方面:Flash Player的应用环境、XML的应用环境、Java应用环境以及这三个应用环境的相互关联。
XML:标准的数据交换格式
尽管简单得令人难以置信,XML确实正在彻底改变我们创建和使用软件的方式。WEB彻底改变了用户与应用程序的交互方式:通过提供一种能使数据更易适配或更易转换的通用数据格式,XML正在彻底改变应用程序间的交互方式——或者更广义地说,计算机间的交互方式。包括SOAP和UDDI在内的基于XML的标准,构成了应用程序间通信的开放式方法,此方法叫做XML WEB服务,而我更愿意称之为SOAP-RPC。
Java:开放的、成熟的和规范的基础架构
Java是目前市场上主流的企业及分布式应用程序开发平台,它是在Sun公司的领导下,多家公司参与共同制定的应用程序开发规范,正是因为它是一种规范、它的开放性,所以能够得到了业界的广泛支持。并且经历了几年的发展,Java已经经受住了市场的考验,成为一种成熟的开发平台。使用Java架构能够快速、高效的开发出可移植的、跨平台的、具有强大功能的企业级Web应用程序。
Java包含多种技术,它们之间互为补充,实现不同功能。包括:Java Servlet技术、Java Server Page(JSP)技术、JavaBeans技术、EJB技术等。
通过JSP(最终被编译成Servlet)和Servlet这一中间件,我们可以在FlashPlayer与服务端之间进行数据交换;而通过Java和Flash Remoting这两个中间件,使得创建服务端与FlashPlayer的关系变得更加容易,更加轻松自如。
Flash Player:跨平台跨设备的富媒体客户环境
Flash Player是功能强大的富媒体客户环境,只要平台或设备上正确的安装了Flash Player,用户就可以浏览使用Flash影片应用程序。
如同Java一样,Flash影片应用程序同样具备了一次开发,可以跨平台跨设备随意浏览的特性(而且不需要重新编译),这就是Flash的一个最大的优点。无论是在Windows、Mac、Linux、Unix还是在Symbian操作系统(Nokia应用于移动电话的一种操作系统)上,也不论你是在桌面PC上还是在掌上电脑或是移动电话上,Flash影片应用程序都能发挥它最大的特点。这一点我们想着重的作一下对比,如表1.1所示:



FlashPlayer内建的ActionScript脚本语言是FlashPlayer的交互语言,它有几个版本,每种版本的ActionScript的语法和风格各不相同,但可以在同一个运行时下协调工作。FlashPlayer不但可以凭借内建的XML类加载和解析标准的XML数据。而且通过FlashRemotingMX很轻松的连接到一个应用程序开发人员要使用的远程服务端和WEB服务并实现数据交换,使得Flash影片应用程序的开发简单有效。
并且,随着Flash Media Server(简称FMS)的发布,用户更可以将视频和音频(包括实时视频和音频)集成到应用程序中,实现声音、图像、文字、数据同步传播。并且,你也可以将声音、图像、文字、数据等录制下来,通过eMail发送出去(需要编程实现)。
并且,FMS服务器和Flash RemotingMX可以无缝的集成到一块儿。有了FMS服务器和FlashRemotingMX的集成,你从而可以连接数据库以及驱动Java应用程序服务器以创建功能更强的Flash影片应用程序,并将其融入到FlashPlayer当中,从而为终端用户带来全新的富媒体应用程序体验。
和传统的基于HTML的浏览器应用程序相比,Flash影片应用程序在创建动态和复杂的、友好的用户界面方面有其独到的优势,包括:
1Flash Player运行时执行代码、传递数据和调用远程服务
2客户端展示逻辑与服务端应用程序逻辑相互独立
3有效的利用带宽,不需要刷新整个网页,使用矢量图形
4可以部署在多个平台和设备上,并且非常简单
这就是深具魅力的《Java for Flash动态网站开发手札》。
技巧与提示
用户必须区分Flash Remoting MX和Flash Remoting。Flash Remoting MX是Macromedia的一款产品,在本书中我时常称之为AMF-RPC(本书中同时介绍的OpenAMF是AMF-RPC的另一种实现)。
Flash Remoting是一个宽泛的定义,包括XML-RPC、WDDX-RPC、RTMP-RPC(也就是FMS)等都可以称为Flash Remoting。而Flash Remoting MX(AMF-RPC)仅是Flash Remoting中的一种。



zhangyafei

职务:普通成员
等级:1
金币:0.0
发贴:31
注册:2005/12/27 23:45:16
#32007/1/21 11:20:31
第Ⅱ篇 Flash网络应用程序和Flash Remoting

在第一篇,我们介绍了Java for Flash的基本原理,了解了怎样使用Flash内建的功能方法与Java实现交互,这种交互方式其实是一种极其简单的HTTP操作,来回传递的都是字符串格式的数据(XML也是字符串,需要解析为DOM)。

人们需要一种更为简洁的方式能够实现类似Native的操作,于是Flash Remoting便应运而生,这符合IT工业的一贯标准。

在这一篇,我们将介绍怎样使用包括XML-RPC、WDDX、SOAP和AMF-RPC(包括Flash Remoting MX和OpenAMF)等在内的Flash Remoting技术,开发人员可以更轻松的完成过去需要编写很多代码才能完成的任务。

本篇包含很多的章节,是本书的主体部分,主要就是介绍怎样使用各种Remoting工具实现Java for Flash的强大体验。



zhangyafei

职务:普通成员
等级:1
金币:0.0
发贴:31
注册:2005/12/27 23:45:16
#42007/1/21 11:20:55
第06章 AMF-RPC for Java基础入门

在前面的章节,我们介绍了Flash如何通过中间件JSP与服务器之间实现数据交换,了解了Flash影片应用程序如何融入到网络应用环境的最一般原理,有了基本的创建具有网络交互功能Flash影片应用程序的基本知识。

这一章,我们将开始使用Flash的一个最重要的服务器组件AMF-RPC来实现与Flash影片应用程序的交互,用户可以感受到更加强烈的Flash网络应用程序“感觉”,从而可以更轻松的创建功能更强大的Flash网络应用程序——这就是“富媒体应用程序”。

使用Flash作为开发工具,我们现在可以开始学习怎样使用AMF-RPC创建更为强大而且易用的富媒体应用程序了。

6.1 AMF-RPC技术简介

AMF-RPC是使用AMF 数据格式实现的远程方法调用,Macromedia公司为此出品了三个个实现:Flash Remoting MX for J2EE(以前也被称为Flash Remoting MX for Java)、Flash Remoting MX for .NET和Flash Remoting MX for ColdFusion,并且开源社区也为AMF-RPC编写了一个在PHP架构下的实现,名为AMFPHP(也可以称为Flash Remoting MX for PHP)。

就如其它的RPC工具一样,AMF-RPC是一个应用程序服务器网关,它在Flash影片应用程序和远程服务之间提供一个相互通信的网络通道:在这个通道间传输的是AMF格式的数据(AMF是专用于Flash远程数据传输的一种数据格式);远程服务则包含各种应用服务技术(例如JavaBeans、ColdFusion组件和网页、ASP.NET网页或者Web服务等等)。

和其它的连接到外部数据提供者的技术相比,AMF-RPC的优点是不言而喻的。在前面一章我们介绍的像getURL、loadVariables、XML和XMLSocket等语句,它们都是使用的简单的HTTP功能,一般都离不开内建的类如Request和Response这样的语法,而AMF-RPC则有其独特的一面,总的说来有下列优点:

[1]易用。AMF-RPC可以对本地远程服务程序代码(Java,CFML,PHP和C#)的数据类型进行自动转换:可以转换成ActionScript代码数据类型,也可以转回本地远程服务程序代码数据类型。

[2]高性能。AMF-RPC使用Action Message Format(AMF)将Flash影片应用程序和远程服务之间的通信信息序列化。AMF是一个二进制格式,符合Simple Object Access Protocol(SOAP)协议格式,通信更加快速。

[3]可扩展性。AMF-RPC设计的时候集成了现有应用程序设计模式和最佳的开发实践,从而可以满足高度扩展性Flash网络应用程序设计要求。

要了解这些优点,最好是先来看一个简单的使用AMF-RPC创建的Flash网络应用程序。



zhangyafei

职务:普通成员
等级:1
金币:0.0
发贴:31
注册:2005/12/27 23:45:16
#52007/1/24 13:10:02
第09章 在Flash影片应用程序中处理结果和结果集对象

要连接到Java应用程序服务器上的FlashRemotingMX服务并且调用远程服务方法,就必须使用mx.remoting和mx.rpc这两个ActionScript类库:这两个类库包含了所有的FlashRemoting MX for ActionScript 2.0类和方法实现。

其中,mx.remoting是一个十分核心的ActionScript类库,它包含了用来与应用程序服务器建立连接的所有对象及方法,而mx.rpc可以用来调用远程方法并处理结果。

在前面的章节中,我们介绍了如何通过FlashRemotingMX网关服务在JSP网页和Servlet中向Flash影片应用程序传递数据,也介绍了如何使用Flash影片应用程序向JSP网页和Servlet传递参数,并且介绍了如何使用Flash Remoting MX forJava与JDBC结合调用数据库,而且创建了几个简单的例子。

但是,当从JSP网页和Servlet向Flash影片应用程序传递的数据被接收到时,如何处理接收到的结果呢?我们在前面的例子中已经使用了一些方法,这只是在Flash影片应用程序中处理结果丰富方法中最简单的,Flash Remoting MX for ActionScript2.0组件内置了丰富的ActionScript脚本语法用来处理结果。

本章就来详细地介绍一下这些ActionScript脚本语法。



9.4使用DataGlue类处理记录集数据

要在一个Flash UI组件中显示RecordSet记录集,一般可以使用该组件内建的setDataProvider()方法或者dataProvider属性,但是如果想在一个Flash UI组件中显示记录集中某一字段下的所有记录,就比较困难了。

例如,在前面的例子中,我们要在一个下拉列表框组件中显示记录集中酒店名,就必须首先创建一个新的单字段记录集,将原记录集中该字段的数据填充新的单字段记录集,然后再使用组件的setDataProvider()方法或者dataProvider属性,显然,这比较麻烦,而且占用的资源也比较多。

为了解决这个问题,Flash RemotingMX还内建了名为DataGlue的ActionScript类。使用DataGlueActionScript类文件也可以在一个FlashUI组件中显示RecordSet记录集。DataGlueActionScript类文件随同Flash RemotingMX组件一起被安装,要使用它,必须导入相应的类库,可以使用下面的一行脚本:

import mx.remoting.DataGlue;

DataGlue类有两个内建的方法:DataGlue.bindFormatStrings()和DataGlue.bindFormatFunction(),使用这两个方法都可以在Flash UI组件(例如组合框和列表框)中显示记录集。

9.4.1使用DataGlue.bindFormatStrings方法绑定记录集

可以使用DataGlue.bindFormatStrings()方法在一个FlashUI组件(例如组合框和列表框)中显示RecordSet。下面的一段ActionScript脚本代码将结果RecordSet绑定到名为displayNames的列表框UI组件:

DataGlue.bindFormatStrings(displayNames, result, "#ContactName#", "#customerID#";

在这一段代码中,后两个参数被传递给函数(#ContactName#和#customerID#是记录集的字段名)。当用户选择组件中一个特殊的纪录时,ContactName列被显示在UI组件中,而customerID列被返回。下面,我们来改造一下前面的例子,看一下如何使用DataGlue类。

1打开前面一章我们创建的Restaurant_component.fla文档,将文档另存为Restaurant_component_DataGlue.fla;

2保持当前位于主时间轴编辑状态,修改主时间轴上的脚本代码。在”动作”面板上追加下面的一行脚本代码:

import mx.remoting.DataGlue;

3在舞台上双击影片剪辑元件实例main_mc,使影片剪辑元件main处于编辑状态,选中层Script。保持该层被选中,在“动作”面板上修改其中的脚本代码:

将下面的一段脚本代码:

var newRecordSet:RecordSet = new RecordSet(["hotelName"]);

for (var i = 0; i<resultRecordSet.length; i++) {

newRecordSet.addItemAt(i, {hotelName:resultRecordSet.getItemAt(i).hotel_name});

}

if (newRecordSet.isLocal()) {

newRecordSet.addItemAt(0, {hotelName:"请选择一个酒家或酒店"});

hotelName_cb.dataProvider = newRecordSet;

}

替换为

DataGlue.bindFormatStrings(hotelName_cb, resultRecordSet, "#hotel_name#", "#hotel_name#";

可以看到,前面多行代码实现的功能,现在只需一行就可以实现了。

4因为现在是使用DataGlue类,所以对于UI组件的读取方式也应该改变一下。在本例中,这段脚本代码位于函数applyFilter()体内:

将下面的一段脚本代码

list_lb.dataProvider = resultRecordSet.filter(thisFilter, hotelName_cb.selectedItem["hotelName"]);

替换为

list_lb.dataProvider = resultRecordSet.filter(thisFilter, hotelName_cb.selectedItem.label);

5最后可以测试一下效果,可以看到与前面的例子功能相同。


9.5使用RemotingConnector组件和数据绑定

RemotingConnector是Flash的一个数据组件,使用该组件你可以非常轻松的建立与远程服务的连接——该远程服务必须是通过FlashRemotingMX网关提供——并且可以调用远程服务所定义的方法函数,使用它只需要将该组件拖放到舞台上并定义组件参数,而且可以使用Flash的数据绑定功能。

我们在这里要介绍的是首先是通过编写脚本代码的方式使用RemotingConnector组件。


9.5.1编写脚本代码使用RemotingConnector组件

要通过编写脚本代码的方式使用该组件,也必须首先在开始将RemotingConnector组件拖放到当前舞台上(或者只要在库中就可以了),然后才能开始编写代码使用该组件,这是使用该组件的第一步。

另外,在编写脚本代码时要导入RemotingConnector类,这是使用该组件编写脚本代码的第一步,可以使用下面的脚本语句:

import mx.data.components.RemotingConnector;

下面我们就使用一个例子来看一下怎样使用该组件。

1打开前面一节我们创建的Restaurant_component.fla文档,将文档另存为Restaurant_component_RC.fla;

2保持文档处于主时间轴的编辑状态,改变主时间轴上的脚本代码如下:

stop();

//-------------------------------------------------------------

//导入RemotingConnector类

import mx.data.components.RemotingConnector;

//构造RemotingConnector组件实例并定义实例属性

var my_rc:RemotingConnector = new RemotingConnector();

my_rc.addEventListener("result", returnRowSet_Result);

my_rc.addEventListener("status", returnRowSet_Status);

my_rc.gatewayUrl = "http://localhost:8080/3JK/gateway";

my_rc.methodName = "returnRowSet";

my_rc.serviceName = "3JK";

my_rc.suppressInvalidCalls = true;

function GetRestaurantInfo():Void {

if (selectedhotel_name == undefined&&selectedhotel_flavor == undefined &&selectedhotel_location ==undefined) {

//定义参数为空

my_rc.params = null;

//触发连接,调用远程服务方法

my_rc.trigger();

} else {

//定义传递给远程服务方法的参数

my_rc.params ={hotel_name:selectedhotel_name,hotel_flavor:selectedhotel_flavor,hotel_location:selectedhotel_location};

//触发连接,调用远程服务方法

my_rc.trigger();

selectedhotel_name = "正在加载数据";

}

}

function returnRowSet_Result(evbject) {

//接收结果

main_mc.list_lb.removeAll();

main_mc.list_lb.dataProvider = ev.target.results;

selectedhotel_name = "";

fetchOK = 1;

main_mc.resultRecordSet = ev.target.results;

}

function returnRowSet_Status(statbject) {

//接收错误

trace("接收到错误";

}

//初始化

function ini():Void {

if (this.inited != undefined) {

return;

} else {

var inited:Boolean = true;

GetRestaurantInfo();

}

}

ini();

3打开组件面板,将RemotingConnector组件拖放到舞台上创建一个实例(实际,只需放到库中就可以了)。

最后可以测试一下效果,可以看到与前面的例子功能相同。