对Macromedia公司的Flash的远程调用使得Java开发者除了JSP(JavaServer Pages)和Swing之外又有了一种全新的方式来构建J2EE(Java 2 Platform, Enterprise Edition)应用. 本文调查了Flash远程调用,解释了为何它有如此作用,并且提供了一个如何实现的例子
在任何多层体系中选择表示层技术时,Java开发者通常有两种选择: JSP或者Swing/AWT(Abstract Windowing Tookit)。借助JSP,开发者可以创建非常容易发布的动态内容。但同时也使得当应用程序在不同的浏览器中发布时开发者不易控制他们的运行情况。使用Swing,开发者可以轻易控制应用程序的行为,但要求用户安装Java运行时环境。当开发者需要既以比较小,基于浏览器的方式发布同时又对用户的交互有较高的可控性时也存在这种情况。对于这些情况,Macromedia Flash提供了一种可供选择的解决方法。
一般来说,Macromedia Flash比发布界面丰富,带有脚本程序的应用程序要优越。不幸的是,直到最近都没有出现标准的方法可以将Flash应用整合进J2EE体系。这种状况随着Flash Remoting MX的引入才得以改变。Flash Remoting MX提供了标准的通信层使Flash应用程序与Java, .NET和ColdFusion之间进行通信。利用Flash Remoting,开发者得以在J2EE体系中发布小的,基于浏览器的表示层,同时可以对应用的行为进行足够的控制。
本文将解释为何Macro Flash适合于作为n层体系中应用层的解决方法。我将首先调查应用层如何得以改变,然后比较Flash和现有标准,最后解释Flash如何应用于J2EE体系。
应用层的演化: 从Berners-Lee创建第一个基于Web的系统至今,n层体系的表示层经历了一次变化。在那之前,开发者不得不开发与服务器紧密结合的客户端系统。所能利用的只有基本的HTTP协议,Web服务器和HTML,开发者可以为用户发布基于文档的应用系统,不管他们使用的是何种硬件或软件平台。这种方法对于应用层开发者有一些基本问题: 虽然HTML可以成功地被传送基于文档的数据,但它不适合有多种表现的应用—可与用户进行实时的交互。
为了解决这些不足,开发者开始在现代的浏览器(Netscape Navigator 2.0以后)中开发一些新的特性,即Java和javascript。开发者第一次能够利用Web浏览器平台发布丰富的,与平台无关的应用。实际上Java小程序的使用从没有达到它的期望值。Java小程序要求用户已经安装Java运行时环境(Java Runtime Environment, JRE),并且Web浏览器安装了Java插件。除了需要安装客户端系统来运行Java小程序外,客户端还需下载Java小程序。这些是很耗费时间的,特别是会使Internet的连接变得非常慢。
除了这种解决方法外开发者有三种选择来在客户端/服务器应用中使用丰富的前端: 动态HTML(DHTML), applet/Swing, 或者第三方解决方法。每种解决方法都各有利弊。
DHTML: 使用DHTML创建丰富的前端提供了如下优点:
1. DHTML是开放的并且免费
2. 使用DHTML所写的应用可以在支持DHTML的任何Web浏览器中配置
3. 基于Web的应用其客户端通常都由文字和图片构成,这允许小的应用脚本的存在。
DHTML也并不总是一个好的解决方案;当选择这一技术时你也必须要考虑到它的一些缺点:
1. DHTML依赖用户的Web浏览器来切实地将用户的原意反映在应用中。由于浏览器的厂家和版本多种多
样,因此复杂的应用中必须嵌入工作区以使得应用能够在不同的浏览器中有着同样的表现
2. 尽管DHTML使得开发者可以更好地控制客户端行为,但这种灵活性也是有限的
3. 由于不同的浏览器在表现HTML和解释javascript上有一些不同,必须为各个不同的Web浏览器创建
不同的平台。加入工作区并将每个浏览器的实现分开增加了维护应用的复杂性。另外,无论什么时候一
个新的浏览器发布后,应用(或应用的一个部分)就必须重新编码并测试。
当开发者明确知道他在标准的客户端配置什么样的应用时,使用DHTML的确有它的优势。如果企业内部网仅适用IE6.0,针对该浏览器的应用逻辑可以被处理得非常得当。
Applet/Swing: 对于Java开发者而言,基于applet或swing的解决方案是另外一种可行的解决方案。它有如下的优点:
1. 创建基于Java的应用无论对于用户还是开发者都是免费的
2. Applets可以通过大部分的浏览器进行配置
3. Applets允许用户创建丰富的用户界面
4. 使用Applets让客户端分担了一部分服务器的负载
选择使用基于applets的解决方案也必须衡量它的以下不足: 开发者不能确定用户是否安装了JRE. 即便安装了,也不一定是所需要的版本。
Applets为开发者在标准客户端配置他们的应用提供了很大的选择余地。对于标准客户端,开发者可以假定正确的JVM版本已经安装
除了使用applet/Swing或DHTML应用,开发者还有一个选择: 第三方解决方案。
第三方解决方案: Mecromedia Flash
为了达到DHTML或applet应用同样的效果,第三方产品需要具备以下特性:
1. 任何标准浏览器都可以使用它
2. 应用程序的运行几乎不需要用户的干涉
3. 客户端的运行时间必须是免费或者至少很便宜
4. 客户端应当可以与已有的业务逻辑结合在一起
有一些第三方解决方案在此领域共同竞争,包括Apple的QuickTime, Microsoft的ActiveX,和Macromedia的Flash Suite。所有这三种解决方案在许多用户的系统上都得到了使用。它们都能应用在基于Web浏览器的应用程序之中,而用户不需付出任何代价。然而相比于ActiveX和QuickTime,Flash为Java开发者提供了一个重大的助益:它允许客户端应用调用任何J2EE应用服务器上的方法。这就意味着已经存在的EJB, servlets, Web services, 和类中的业务逻辑可以不作任何改变地被基于Flash的前端调用。
服务器端产品Flash Remoting使得Flash客户端可以调用J2EE Server上的方法。Flash Remoting由两个重要的部分组成:用于将本地的Flash对象和方法映射到Java对象和方法的网关服务器和客户端支持。网关应用在标准的war文件中,可在任何J2EE应用服务器中配置。客户端支持组成为ActionScript(被Flash运行和配置工具所使用的编程语言)增加的功能。
要让Flash Remoting工作,Flash应用必须连接到J2EE Server,获取它想要利用的服务(Java对象)的句柄并调用方法。这通过使用ActionScript库(NetServices)来做到。如下的例子与名为MX的Web应用中的网关连接,web.xml文件servlet映射如下:
<servlet-mapping>
<servlet-name>FlashGatewayServlet</servlet-name>
<url-pattern>/gateway</url-pattern>
</servlet-mapping>
//Load the NetServices ActionScript Library
#include "NetServices.as"
//Create a connection to the mx webapp running on port 80 on the local
//machine
NetServices.setDefaultGatewayUrl("http://localhost/mx/gateway";);
//Invoke the createGatewayConnection to initialize the Flash Remoting //functionality
gatewayConnnection = NetServices.createGatewayConnection();
//Bind the Java Object: com.tallan.data.providers.FlashDemo
//to a service called tallanDataService.
tallanDataService = gatewayConnnection.getService
("com.tallan.data.providers.FlashDemo", this);
//Invoke a method called getReportData on the service named
//tallanDataSerevice
tallanDataService.getReportData();
如上例子说明了连接到J2EE Server和调用一个方法的过程。
为了处理实际的工作,必须在Flash客户端和J2EE Server上的企业资源之间相互传递参数。所有的远端调用都在异步方法中调用。为了支持从服务器上返回值,必须在Flash客户端添加回调函数。只要网关从J2EE服务器上的函数返回值该回调函数就被调用。为了支持函数回调,ActionScript函数的函数名必须与被调用的Java方法名一致。在如下的例子中,方法是getReportData(), 因此ActionScript回调函数应当命名为getReportData_result;
function getReportData_Result(result)
{
//Print the results from the app server to the
//debug window
trace(result);
}
所有的方法调用信息,包括参数和返回值,都在客户端和服务器端以Action Message Format(AMF)的格式传递。AMF是二进制信息格式,通过HTTP以一种类似于SOAP(Simple Object Access Protocol)的方式传送。在网络中,AMF信息比SOAP信息要小得多,因而允许函数以更快的速度被调用。Flash Remoting透明地处理Java对象和ActionScript对象之间的所有映射。
使得Flash成为J2EE前端的一个重要的特性是它的内嵌的XML解析功能。Flash生来就能够在全部在客户机上处理XML解析和DOM(document.nbspObject Model)传递。如下的ActionScript代码解析一篇应用于2D图形中的包含x和y坐标的XML文档:
<graph>
<point>
<xvalue>10</xvalue>
<yvalue>5</yvalue>
<point>
<point>
<xvalue>20</xvalue>
<yvalue>10</yvalue>
<point>
</graph>
应用服务器上的一个产生图