`

使用BlazeDS和AMF构建Web和桌面应用

阅读更多

作者 James Ward and Shashank Tiwari 译者 沙晓兰 发布于 2008年7月22日 下午1时8分

原文地址:http://www.infoq.com/cn/articles/blazeds-intro

 

无 论是采用Adobe AIR技术的桌面应用程序 ,还是结合Flash Player使用浏览器的应用,在需要加载或处理数据的时候往往都需要连接到服务器。在采用Adobe Flex或Flash CS3来开发应用程序的过程中,应用程序与服务器间交互的实现方式有很多选择。服务器本身除了可以运行Java、ColdFusion、.Net、 PHP、Ruby等某种服务器端技术之外,还必须具备网络通信的能力,这为Flash Player中运行的应用或Adobe AIR应用的客户端与服务器端间的交互奠定了基础。通常,两者间的通信采用的是HTTP协议-- 也就是web浏览器加载web页面和应用时所采用的协议。但是,HTTP协议下采用不同的数据传输方式会带来应用性能和开发效率的天壤之别。

很多在Abode AIR或Flash Player中运行的应用都采用XML-over-HTTP技术(比如SOAP、REST等)在客户端和服务器之间传输数据。这个方法很简单,也很容易搭 建。无论是哪种服务器端技术都很容易应用XML,因为XML完全是一个基于文本的协议。在必须实现透明协议的时候,XML是完美的选择。比 如,Flickr的web服务在HTTP传输之上采用的就是REST风格的XML。这样一来,无论是谁采用哪种技术都可以简单地通过向Flickr发送简 单的基于文本的请求来与Flickr交互。Flickr的回复是简单的XML,开发者可以轻松地解析这个XML回复,使用其中的数据。像XML这样基于文 本的协议的缺点是额外的数据抽象层的编写与维护工作相对很沉重。此外,如果数据需要序列化和反序列化,那么这个数据抽象层在客户端和服务器端都会占用很多 资源(参见图1)。

图1. AMF减少封送处理的数据层

Flash Player可以支持另外一种传输协议,这个协议能够缓解由基于文本的协议导致的传输瓶颈问题,能够帮助开发者以更简单的方式与服务器交互。这就是 AMF(Action Message Format)。它是一个二进制格式的协议,能够替代用于传输XML的基于文本的协议而在HTTP协议之上交换数据。采用AMF的应用中,数据抽象层完全 可以省去,客户与服务器间的通讯效率比传统的应用基于文本的协议传输要高得多。Census RIA Benchmark应用程序 可以证明AMF带来的性能优势。

过去几年里,大量旨在提供AMF实现的开源项目蜂拥而至,这些项目与Macromedia之前一个叫做Flash Remoting的产品很相似。由于这些开源项目,无论是PHP、Java还是其它技术的开发人员都得以能够在他们的应用中采用AMF。Flex 1.0版本发布的时候,就涵盖了AMF相关功能。Flex发布版本2的时候同时包含了XML和AMF的相关功能,但服务器端的AMF相关功能却特别转移到 Flex Data Services这个新产品中。Flex Data Services在集成到Live Cycle产品系列中的时候又被重新命名为LiveCycle Data Services。针对单个CPU服务器的LiveCycle Data Services ES Express是免费的,但针对拥有多个CPU服务器的产品则收费很高,这使得一些开发者在选择AMF的时候望而却步,其中一些人也因此干脆转而选择一些 非标准的AMF实现。

2007年十二月,Adobe做出了两个巨大的决策,让所有人都能够使用AMF。第一个决定是公开AMF规范。规范公布以后,所有项目都能按照规范 来实现 AMF,而不用再对协议做反向工程。无论back-end采用的是Java、ColdFusion、PHP、.Net、Ruby还是其它技术,AMF的实 现都只需要遵守规范即可。另一个决策是以BlazeDS项目的方式开源LiveCycle Data Services ES中的部分技术。

BlazeDS中包含了AMF的Java实现,可以用来与服务器端的Java对象远程交互,也可以用来在客户端之间传递消息。开发人员可以借助 BlazeDS的远程技术简单地调用POJO、Spring服务或EJB方法。开发人员可以通过其消息系统从客户端向服务器端发送消息,当然也可应从服务 器端向客户端发送消息。BlazeDS也可以与其他一些消息系统结合使用,比如JMS、ActiveMQ。由于其远程技术与消息系统采用的方式是在 HTTP协议上传输AMF数据,BlazeDS因此在性能上拥有很大优势,同时也避免了额外的数据抽象层的处理工作。BlazeDS在很多基于Java的 应用服务器环境下都能正常工作,这些服务器包括Tomcat、WebSphere、WebLogic、JBoss以及ColdFusion。此外,无论是 web(在Flash Player中运行)还是桌面(在Adobe AIR下运行)的Flex应用程序中,BlazeDS的使用都很简单。

开发人员现在可以从Adobe Labs 站点上下载预发布版本 , 将blazeds-samples.war文件部署到任何一个servlet容器中,就开始你使用BlazeDS开发的旅程了。这个web应用包中提供了 很多预配置的示范应用,所有这些应用都可以通过http://localhost:8080/blazeds-samples/ (端口号由你所使用的应用服务器和服务器配置所决定)来访问。

你可以遵循下面的步骤向应用程序中引入BlazeDS远程服务:

  1. 创建一个新的POJO Java类,这个类中需要包含你想要从Flex应用访问的方法
  2. 在remoting-config.xml文件中配置BlazeDS的远程终端
  3. 创建一个使用RemoteObject类的Flex应用

若要使用BlazeDS消息服务,则需要下列步骤:

  1. 在messaging-config.xml文件中创建消息服务的终端
  2. 创建一个使用Producer和Consumer类来接收消息的Flex应用
  3. 通过注册Consumer的消息feed来监听消息。

这下就可以使用BlazeDS高效地向back-end的Java类发送远程请求了,也可以应用BlazeDS的消息系统了。接下来,我们将在Eclipse和Flex Builder环境下详细讨论上面提及的步骤。在开始之前,你需要安装几个软件:

创建一个简单的远程应用:

  1. 从BlazeDS中将blazeds.war解压到应用服务器的部署目录下。比如,在JBoss下,解压到/server/default/deploy/blazeds.war
  2. 启动Eclipse和Flex Builder
  3. 创建一个新的Java项目来配置BlazeDS,向web应用中添加Java类。
    1. 将项目命名为“blazeds_server”
    2. 从现有资源中创建该项目,使用先前部署的BlazeDS WAR的WEB_INF文件夹路径,比如:/server/default/deploy/blazeds.war/WEB-INF/
    3. 在build路径下添加src目录
    4. 将WEB-INF/classes目录作为输出目录
  4. 创建一个名为HelloWorld.java的新Java类,类的定义为:
  5. public class HelloWorld {
     	public String sayHello(String name) {
     		return "hello, " + name;
     	}
     }
  6. 修改BlazeDS配置,使它支持向HelloWorld远程发送请求。这需要在WEB-INF/flex文件夹下的config.xml文件中添加消息终端的配置,具体配置可参照如下代码:
    <destination id="HelloWorld">
           <properties>
             <source>HelloWorld</source>
           </properties>
     </destination>
  7. 启动应用服务器,确定web应用可以通过下面这个地址访问(端口号由应用服务器配置决定):http://localhost:8080/blazeds/
    (假如服务器配置并未允许显示目录下的内容的话,你会得到404错误,但这没什么关系)
  8. 创建一个新Flex项目
    1. 将项目命名为“testHelloWorld”,应用服务器类型则选择“J2EE”
    2. 选择“Use remote object access service”和LiveCycle Data Services
    3. 将WAR文件部署的位置声明为根目录
    4. 将根ULR声明为:http://localhost:8080/blazeds(端口号由应用服务器配置决定)
    5. 将上下文根目录声明为:/blazeds
    6. 确定配置并点击“完成”
  9. 创建Flex应用,将下列代码替代testHelloWorld.mxml中的内容:
    <?xml version="1.0" encoding="utf-8"?>
     <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
       <mx:RemoteObject id="ro" destination="HelloWorld"/>
       <mx:TextInput id="n" change="ro.sayHello(n.text)"/>
       <mx:Label text="{ro.sayHello.lastResult}"/>
     </mx:Application>
  10. 运行该应用,在文本框中输入你的名字,文本框的正下方你可以看到“hello, <你的名字>”,如下图所示:

注释:该Flex应用使用了RemoteObject类库来与支持BlazedDS的服务器通信。当用户在文本框中输入内容的时候,文本框的 change事件促使RemoteObject向服务器发出请求。于是,服务器紧接着向定义了的远程终端Java类发送请求,这个时候也有可能调用 Spring服务或者EJB session bean,但本例调用的是POJO。本例中,POJO的返回值仅仅是在向它发送的值之前添加了“Hello,”的字符串。在对象返回值的时候,这个返回值 会系列化到AMF中,进而返回给Flex应用。然后,RemoteObject类库将该值赋值给ro..lastResult属性(本例中,则是ro.sayHello.lastResult )。最后的结果也可以通过RemoteObject上的result事件获得。数据绑定的过程中,文本框的标签就相应显示为POJO返回的字符串。BlazeDS同时也支持Java对象类的传递。

下一步,我们将创建一个使用BlazeDS消息系统的Flex应用。

  1. 首先,在WEB-INF/flex目录下的messaging-config.xml文件中添加消息终端配置。添加下面这个终端:
    <destination id="chat"/>

    消息终端的配置使得消息系统能够将消息转发给正在监听该终端消息的客户。消息终端可以配置持久时间和网络参数,同时也可以连接到其它的消息系统,比如JMS。
  2. 重新启动应用服务器,这样一来,BlazeDS会配置新的消息终端。
  3. 创建一个新Flex项目
    1. 将项目命名为“testChat”
    2. 应用服务器类型选择“J2EE”
    3. 选择“Use remote object access service”和LiveCycle Data Services
    4. 将部署的WAR文件位置声明为Root目录
    5. 将根URL声明为:http://localhost:8080/blazeds(端口号由应用服务器配置决定)
    6. 将上下文根目录声明为:/blazeds
    7. 确定配置并点击“完成”
  4. 创建一个简单的使用消息系统的聊天应用程序,用下列代码替代testChat.mxml中内容:
    <?xml version="1.0" encoding="utf-8"?>
     <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="cons.subscribe()">
    
       <mx:Script>
       import mx.messaging.messages.AsyncMessage;
       </mx:Script>
       <mx:Producer id="prod" destination="chat"/>
       <mx:Consumer id="cons" destination="chat" message="c.text += event.message.body.msg + '\n'"/>
    
       <mx:TextArea id="c" width="300" height="300"/>
       <mx:TextInput id="m"/>
       <mx:Button label="Send" click="prod.send(new AsyncMessage({msg: m.text}))"/>
    
     </mx:Application>
  5. 运行该应用。在页面底部的文本框中输入一条消息,点击“Send”。确定所发送的消息正确显示在第一个文本域中,同时确定在打开多个浏览窗口的前提下,消息也可以在这些窗口间传递。

注释:Producer对象允许Flex应用向消息系统中发送消息。另外,还有一个Java API(本例中没有用到)也可以用来向服务器上的消息系统发送消息。通过第三方适配器或服务器自带的JMS适配器,你也可以将自身的消息系统连接到其它的 消息系统,但默认配置并不支持它与另外的消息系统的连接。用户点击“Send”的时候,某个匿名对象会创建一条新消息,并将消息体中的msg属性值设置为 文本框中输入的内容。由于消息的类型是AsyncMessage,所以AsyncMessage类是必需引入的。Consumer对象使得Flex应用能 够监听消息。应用会在其初始化的时候在消息系统中进行注册,之后,一旦收到消息,Consumer上的事件处理器则会将从消息体中取得聊天消息显示在文本 域中。

BlazeDS和AMF的使用可以帮助减短开发周期,推动应用运行的速度。何不尝试一下BlazeDS,我们很期待你的反馈。在Adobe Labs站点的BlazeDS页面 上,你可以找到很多BlazeDS的相关内容以及AMF的公开规范说明。

关于作者

James Ward是Adobe的Flex技术传道士,也是Adobe在JSR 286、299和301规范制定中的JCP代表。他喜欢登山,也喜欢编程,因为两者都能给他带来无尽的发现、漂亮的解决方案、巅峰与峡谷。出于对登山冒险 的热爱,他去过很多地方。同样,技术也带给他许许多多的冒险经验,比如九十年代早期的Pascal和Assembly;Perl、HTML、九十年代中期 的JavaScript;之后就是九十年代后期的Java和相关的开发框架。如今,他主要在以基于Java的back-end的基础上使用Flex来创建 华丽的前端应用。在加入Adobe之前,James为Pillar Data Systems开发了市场和客户服务的富客户端portal应用。James Ward的博客是:http://www.jamesward.org

hashank Tiwari是Saven Technologies的主要技术开发员。Saven Technologies的总部位于芝加哥,主要为银行及金融服务机构提供由前沿技术开发的业务解决方案。Shashank是一个多产的技术开发员、作者 以及演讲者,他在JCP的表现极为积极,并且是JSR 274、283、299、301和312规范的专家组成员。他经常在使用的编程语言至少有一打,包括Java、ActionScript、Python、 Perl、PHP、C++、Groovy、JavaScript、Ruby和Matlab。他在O'Reilly Network的博客也很受欢迎。最近,他正忙于创建使用了Flex和Java的web 2.0应用。www.shanky.org 上有他更多的资料。

阅读英文原文: Building Web and Desktop Applications with BlazeDS and AMF

分享到:
评论

相关推荐

    flex使用BlazeDS远程调用java例子.

    Flex是Adobe公司开发的一种富互联网应用程序(RIA)框架,它主要用于构建交互性强、用户体验良好的桌面和移动应用。在本例子中,我们将探讨如何使用Flex与Java后端进行远程调用,借助Adobe的BlazeDS服务。BlazeDS是...

    构建全栈式Flex、BlazeDS和Spring集成解决方案–第三部分 整合全部应用.pdf

    ### 构建全栈式Flex、BlazeDS和Spring集成解决方案——第三部分 整合全部应用 #### 知识点概述 本篇文章旨在探讨一种基于Flex、BlazeDS和Spring框架构建全栈式应用程序的方法。文章分为三个部分,分别介绍了服务器...

    构建全栈式Flex、BlazeDS和Spring集成解决方案

    它不仅提供了依赖注入(DI)和面向切面编程(AOP)等核心功能,还有Spring MVC用于构建Web应用,以及Spring Data用于数据库操作。Spring与Flex和BlazeDS集成时,开发者可以在Spring服务中定义业务逻辑,然后通过...

    构建全栈式Flex、BlazeDS和Spring集成解决方案\构建全栈式Flex、BlazeDS和Spring集成解决方案–第二部分 编写to-do list服务器端.pdf

    - **BlazeDS**:Adobe BlazeDS是一种允许开发者通过AMF协议在客户端和服务器之间传输数据的通信服务器,支持Flex和AIR应用程序与后端服务器进行高效通信。 - **Spring**:Spring框架是一种轻量级的Java应用开发框架...

    Flex Blazeds java实现企业级Web系统页面【源码】

    Flex Blazeds与Java的集成在企业级Web系统开发中扮演着重要角色,它提供了一种高效、灵活的方式来构建富互联网应用程序(RIAs)。Blazeds是Adobe推出的一个开源项目,它作为Flex与服务器端技术之间的桥梁,尤其与...

    BlazeDS配置

    无论是在Web应用(Flash Player)还是桌面应用(Adobe AIR)中,BlazeDS都能无缝工作,兼容多种Java应用服务器,如Tomcat、WebSphere、WebLogic、JBoss以及ColdFusion。 总之,BlazeDS通过AMF协议实现了Java和Flex...

    Flex+JAVA+BlazeDS开发环境配置(Java工程和Flex工程独立)

    它可以与各种 Java 应用服务器兼容,如 Tomcat、WebSphere、WebLogic、JBoss 和 ColdFusion,而且适用于 Web(Flash Player)和桌面(Adobe AIR)应用。通过集成 JMS 或 ActiveMQ 等消息中间件,BlazeDS 还可以实现...

    WEB项目-集成Flex3_BlazeDS3[1].2_Spring2.5.6_iBatis2.3.4_Struts2.1.8

    **Struts 2.1.8** 是基于MVC设计模式的Java Web框架,它为构建可维护和可扩展的Web应用程序提供了基础架构。Struts 2以其强大的拦截器机制、插件架构和丰富的社区支持而闻名。它可以与Spring和其他框架集成,如...

    用BlazeDS实现Java和Flex通信

    - **广泛的应用场景**:无论是在Web环境中运行的Flex应用,还是在Adobe AIR下的桌面应用,都可以使用BlazeDS进行通信。 #### 三、搭建开发环境 为了实现Java与Flex之间的通信,我们需要搭建一套完整的开发环境,...

    Flex+Eclipse+BlazeDS+JDK+Tomcat开发实例

    【Flex+Eclipse+BlazeDS+JDK+Tomcat开发实例】是一个典型的BS架构(Browser-Server,浏览器-服务器)的开发配置,用于构建富互联网应用程序(RIA)。在这个实例中,我们将详细介绍如何整合这些组件来创建一个用户...

    Spring BlazeDS + flex

    ### Spring BlazeDS 与 Flex 集成应用详解 #### 一、引言 随着企业级应用程序需求的多样化,不同的技术栈之间的集成变得越来越重要。...对于开发者来说,掌握这套技术栈的集成方法能够大大提高开发效率和应用性能。

    Spring blazeDS

    ### Spring与BlazeDS框架整合知识点详解 #### 一、Spring框架概述 ...综上所述,Spring与BlazeDS的整合不仅能够充分利用各自的优势,还能极大地提高开发效率和应用性能,是当前RIA开发领域一个非常值得关注的方向。

    blazeds.war、ds-console.war、samples.war

    Blazeds.war、ds-console.war 和 samples.war 是三个与 Flex 开发密切相关的 Web 应用程序档案,它们...对于 Flex 开发者来说,理解并熟练掌握这些组件的工作原理和使用方法,对于提升开发效率和应用性能具有重要意义。

    flex+java的整合,包含LCDS和BlazeDS等算中方式

    1. **Flex**:一种开源的框架,用于构建跨平台的桌面和移动应用程序。Flex提供了一套完整的UI组件库,以及一套强大的数据绑定机制。 2. **Java**:一种广泛使用的面向对象编程语言,主要用于后端开发和服务端逻辑...

    flex blazeds

    Flex BlazDS是Adobe开发的一款强大的富互联网应用(RIA)解决方案,主要针对使用ActionScript和Flex框架构建的客户端应用程序与后端服务器之间的数据交互。BlazDS提供了灵活的数据服务,支持实时双向通信,使得Web...

    Flex+Elipse+blazeDS+tomcat部署.pdf

    它允许开发者创建跨平台的桌面和移动应用程序。 2. **Eclipse**:Eclipse 是一个开源的集成开发环境(IDE),支持多种编程语言,包括Java、Python、C++等。在这里,Eclipse 用于开发 Flex 应用程序,并通过插件支持...

    FLEX——blazeDS原理.pdf

    - **FLEX**:Adobe Flex是一种用于构建跨平台桌面应用程序、移动应用和Web应用的开源框架。它支持丰富的用户界面(UI)组件和数据可视化功能,能够创建高度交互式的应用程序。 - **BlazeDS**:Adobe BlazeDS是一个...

    eclipse flex集成web项目

    Flex是一种用于构建富互联网应用(RIA)的开源框架,它允许开发者创建交互性强、用户体验丰富的桌面和移动Web应用。Eclipse作为一个流行的Java开发工具,提供了强大的插件系统支持多种开发环境,包括Flex。 在描述...

    flex通过blazeds与java集成增删改查

    Flex是一种开源的富互联网应用程序(RIA)开发框架,主要用于创建交互性强、用户体验良好的桌面和移动应用。BlazDS是Adobe提供的一个服务器端数据服务组件,它使得Flex客户端能够与Java后端进行无缝通信,实现数据的...

    Flex4+Spring+ibatis实战系列教程.docx

    【Flex4+Spring+ibatis实战系列教程】 本教程旨在引导初学者深入理解富网络应用(Rich Internet Application,简称RIA)的...通过学习这些内容,开发者可以掌握构建现代Web应用的关键技能,提升开发效率和应用质量。

Global site tag (gtag.js) - Google Analytics