flex和blazeds
本文概述了Java程序员学习Flex和BlazeDS的13个原因。 它讨论了为什么Flex with BlazeDS是开发富Internet应用程序(RIA)的最佳选择之一-从高度交互的网站到带有Java后端的企业应用程序。 最重要的是,它显示了此组合为开发人员和企业提供的高投资回报率(ROI)。
在概述Java程序员学习BlazeDS的13个原因时,我使用了一个虚拟的汽水分配器来展示如何将现有的Java程序转换为RIA。 通过该示例,我说明了可以在现有Java应用程序或新Java应用程序中使用BlazeDS的不同方法。
Flex核心软件开发套件(SDK)是一个开放源代码框架,用于构建和维护RIA,这些RIA在不同的浏览器和操作系统上的外观相同。 Flex是根据Mozilla公共许可证发行的。 编译的Flex应用程序在专有的Adobe Flash平台中运行。
为了将Flex连接到Java,BlazeDS是一种用于远程处理和消息传递的开源技术。 它作为Servlet在Java应用程序服务器上运行,允许您在任何标准Java Web应用程序中使用它。 BlazeDS是根据较小的GNU公共许可证(LGPL)许可的。 随着BlazeDS的发布,Adobe发布了ActionScript消息格式(AMF)规范,该规范允许BlazeDS和Java使用紧凑的二进制格式与Flex客户端进行通信。
Flex拥有一个非常活跃的社区,其中包含许多社区贡献的项目。 Flex.org是一个包含社区新闻的Adobe网站,几乎每天都能看到社区的贡献,而Yahoo!上的Flex用户组也是如此。 拥有超过11,000名成员。
例如,Google Code上的FlexLib项目贡献了大量的开源用户界面(UI)组件。 Swiz和Mate项目贡献了一个框架来帮助处理事件。 大猩猩逻辑公司为自动UI测试贡献了Flex Monkey。
根据Adobe的Flex传播者James Ward的说法,仍然需要高级Flex开发人员。 Learning Flex为您提供适销对路的技能,使您在竞争中处于领先地位。
通常,开发企业Web应用程序非常困难。 Flex和BlazeDS不仅提供功能更强大的工具,而且更易于开发。 开发人员生产力的提高使组织可以更快地进入市场。 Flex和Flash还可以创建更引人入胜的用户体验,从而可以增加流量和转化率。
一个理想的例子是Borders书店连锁店,该连锁店最近推出了一个新网站“ Magic Shelf”。 该站点使用Flash界面来模拟浏览书籍的体验。 Borders发现这大大提高了转换率:“使用Flash驱动界面的客户(允许访问者查看书籍,DVD和CD的封面)的转化率比不使用Flash的客户高62%” 。
后来,大多数语言都添加了对构建UI的支持。 对于带有Swing的Java来说尤其如此。 结果,Swing中的简单事情(例如接线数据)可能会很痛苦,并且需要使用特定于Swing的数据模型。 Swing的最大问题是,您必须非常深入地研究应用程序编程接口(API)才能发挥作用。
相反,Flex恰恰相反:它是从头开始设计的,用于构建Web UI。 正如Bruce Eckel所言,Flex是用于UI开发的第一种域特定语言(DSL)。 因此,与其他技术(例如JavaServer Pages(JSP),JavaServer Faces(JSF)和Swing)相比,在Flex中创建UI要容易得多。 该语言内置了数据绑定,事件处理,组件布局以及其他常见的UI开发技术,即使您对该语言了解甚少,也可以使您高效。
您可以使用用于开发Java的现有工具进行开发。 您还可以使用SDK附带的免费命令行工具,Adobe Flex Builder(Eclipse插件)或最近使用IntelliJ IDEA 8开发Flex应用程序。
Flex提供了一个有状态的环境,在该环境中可以从客户端加载数据。 与超文本标记语言(HTML)编程相比,该编程模型更像是开发桌面客户端,这使该编程模型对执行Java Swing编程的任何人都感到熟悉。
Flex是使用MXML(一种类似于可扩展标记语言(XML)的UI标记语言)和Adobe ActionScript(一种面向对象的脚本语言)的组合进行编程的。 这种组合使Flex编程类似于Java编程,因为您可以使用熟悉的面向对象的概念。
设置开发环境的理想方法是在Web部署目录中直接构建Flex应用程序。 这样,您无需在每次构建后重新部署应用程序:简单的浏览器刷新即可反映最新的更改。 因此,使用Flex和BlazeDS进行开发非常有生产力。
可以使用多种版本的BlazeDS ,包括完整版本,其中包括使用BlazeDS配置的Apache Tomcat版本。 在本文中,我使用了Web存档(WAR)附带的二进制发行版,展示了如何部署到任何应用程序服务器。 否则,您可以提取Java归档(JAR)文件并在项目中使用它们。 请访问BlazeDS Wiki,以获取有关安装BlazeDS的各种选项的信息。
本示例将BlazeDS与现有项目(简单的苏打水分配器)结合使用。 您只需将JAR文件添加到您的项目中,然后就可以在应用程序中使用BlazeDS,这允许您将其部署到可以部署应用程序的任何位置。
要将BlazeDS添加到您的项目中,请完成以下步骤:
对于苏打水示例,假设您要公开现有的苏打水服务,以便远程Flex应用程序可以连接到它。 使用现有应用程序设置BlazeDS的基本步骤是:
MessageBrokerServlet
和会话侦听器。 设置BlazeDS之后,需要将苏打服务添加到BlazeDS远程配置文件中,以允许从Flex客户端调用苏打服务。 您可以通过定义目标和一个或多个用于传输数据的通道来进行添加。 基本AMF通道在services.xml文件中定义。 使用此定义在remoting-config.xml中标识目标:
<destination id="sodaService" channels="my-amf">
<properties>
<source>com.gorillalogic.sodaSample.SodaService</source>
</properties>
</destination>
通过在远程配置文件中定义端点,可以从Flex客户端调用任何基本Java服务。
要将Java数据模型传递给Flex客户端,请在ActionScript类中定义两者之间的映射:
[Bindable]
[RemoteClass(alias="com.gorillalogic.sodaSample.SodaModel")]
此代码告诉Flex,当远程服务调用的结果返回Java SodaModel时,将其映射到Flex SodaModel
。 示例中的Flex客户端显示了如何调用此Java服务。 调用返回一个SodaModel
,其中填充了您的订单:
public function callSodaService():void {
var sodaType:String = type.text;
var sodaCount:int = parseInt(cnt.text);
var flag:Boolean = preOpen.selected;
remoteObject.getSoda(sodaType, sodaCount, flag);
}
private function resultHandler(event:ResultEvent):void {
var sodaModel:SodaModel = event.result as SodaModel;
}
Flex在通用result
变量中返回结果,该result
变量映射到您的SodaModel
。 我不会在这里详细介绍,但是一个技巧是在编译器配置中指定services-config.xml,如下所示:
-locale en_US -services=/nsource/sodaSample/web/WEB-INF/flex/services-config.xml -context-root /
否则,您的Flex客户端将无法找到Java服务。 以相同的方式,您可以将对象从客户端传递回服务器。 例如,您可以将空苏打模型传递回客户端。
假设您决定要在调用苏打水服务时随时添加特殊日志记录。 您可以扩展标准Java适配器以添加日志记录。
首先,添加一个扩展JavaAdapter
的Java类:
import flex.messaging.services.remoting.adapters.JavaAdapter.
public class TimingJavaAdapter extends JavaAdapter {
然后,重载invoke()方法:
public Object invoke(Message message) {
RemotingMessage remotingMessage = (RemotingMessage) message;
String operation = remotingMessage.getOperation();
String destination = remotingMessage.getDestination();
Logger.info("calling " + operation + " on destination " + destination);
Object data = super.invoke(message);
return data;
}
在这种方法中,您可以看到传入的操作和呼叫的目的地。 您还可以将这个简单的钩子用于其他事情,例如,确定对服务器的呼叫花费多长时间。
您可以通过几种不同的方式进行此调用,例如通过浏览器管理器和flashVars
。 可以通过HTML页面设置flashVars
,然后由Flex应用程序读取。
例如,假设您要传递用户名和要从HTML页面中订购的苏打水类型。 您可以像这样在HTML页面中设置flashVars
:
<object id='SodaSample' classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000' codebase='http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab' height='100%' width='100%'>
<param name='src' value='SodaSample.swf'/>
<param name='flashVars' value='username=ryan&type=coke'/>
<embed name='mySwf' src='SodaSample.swf' pluginspage='http://www.adobe.com/go/getflashplayer' height='100%' width='100%' flashVars='username=ryan&type=coke'/>
</object>
然后,在Flex应用程序中,您可以通过获取应用程序参数来读取这些变量:
var username:String;
if (Application.application.parameters.hasOwnProperty("username")) {
username = Application.application.parameters.username;
}
默认情况下,所有使用中的远程过程调用(RPC)均使用AMF二进制协议。 AMF是一种开放标准,速度非常快。 James Ward整理了一个示例,该示例显示了与其他远程解决方案的比较。 尽管像Dojo之类的其他异步JavaScript和XML(Ajax)解决方案都需要数百行,但是带有BlazeDS的Flex可以轻松处理数千行。 (有关各种RIA数据加载技术的基准,请参阅James Ward的人口普查 。)
最新版本的BlazeDS包括Java AMF类,您可以使用该类使Java客户端调用BlazeDS服务器。 能够以这种方式调用BlazeDS对于单元测试和负载测试非常有用。
Adobe和Spring联手实现了两个项目之间的紧密集成,并且Spring-BlazeDS集成的初始版本显示出很大的希望。 通过允许Spring Bean成为远程服务,将消除重复的配置文件。 有关更多信息,请访问项目的主页 。
由于BlazeDS是开放源代码并基于Java,因此它是新的和现有Java服务器项目的理想选择。 通过Flex和Java之间的高性能远程通信和对象映射,Flex和BlazeDS技术是RIA开发的理想选择。 Flex和BlazeDS的新手Java开发人员将发现开发过程非常高效且易于学习。
BlazeDS的Flex也是大型Java企业应用程序的理想选择。 在上一个项目中,我的团队编写了一个包含50多个不同屏幕的应用程序,该应用程序将定期在服务器和客户端之间传输数千行数据。 使用传统的Ajax技术几乎是不可能的。 借助Flex和BlazeDS,我们可以在不到一年的时间内发布初始版本。 看看这个动态二人组可以为您的应用程序开发项目做什么。
注意:您应该具备这些技术的一些基本背景。 有几个教程可帮助您入门BlazeDS,包括“使用BlazeDS和AMF构建Web和桌面应用程序”和“ BlazeDS 30分钟测试驱动器” 。
flex和blazeds