站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2EE 专题增强你的J2EE表示层

增强你的J2EE表示层

摘要:
--Flash远程调用提供了一种可选的J2EE表示层实现方法


翻译作者: yaojh302
原文作者: Joseph Shomphe
原文链接: Enhance your J2EE presentation layer

摘要:
对Macromedia公司的Flash的远程调用使得Java开发者除了JSP(JavaServer Pages)和Swing之外又有了一种全新的方式来构建J2EE(Java 2 Platform, Enterprise Edition)应用. 本文调查了Flash远程调用,解释了为何它有如此作用,并且提供了一个如何实现的例子
(1800字, January 17, 2003)

在任何多层体系中选择表示层技术时,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映射如下:

FlashGatewayServlet
/gateway


//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 Object Model)传递。如下的ActionScript代码解析一篇应用于2D图形中的包含x和y坐标的XML文档:


10
5


20
10


应用服务器上的一个产生图形文件文档的类:
public class FlashDemo
{
public FlashDemo()
{
}
public Document getReportData()
{
Document doc =null;
try
{
System.out.println("calling getReportData");
DocumentBuilder builder =
DocumentBuilderFactory.newInstance().newDocumentBuilder();
doc= builder.newDocument();

//Create a record as the root element
Element element = doc.createElement("graph");
Element child1=doc.createElement("point");
child1.setAttribute("xvalue", "February");
child1.setAttribute("yvalue", "20");
element.insertBefore(child1, null);
doc.appendChild(element);
这个简单的类将返回一个文档对象给Flash客户端解析; 下面的例子完成解析:
//Parse the XML document returned by the server,
//keeping the results in an array called nodes
function parseXML()
{
//Create a new array called nodes
nodes = new Array();

//Initialize the nodes array to
//contain all of the children of the reportXML document
nodes = reportXML.nodes;

// childCounter is used as a counter for the child Nodes
childCounter = 0;

//childNodes will contain the children of each node
childNodes = new Array();

//XAxisValue will contain the x-axis value to plot
xAxisValue = new Array();

//YAxisValue will contain the y-axis value of the data sets
yAxisValue = new Array();

//Iterate through the first level children of the XML Doc
for (j=0; j<=nodes.length; j++)
{
//Check if the node Name is report i.e., the data set
//belongs to graph
if (nodes[j].nodeName == "graph")
{
//Get the background color of the graph
bgcolor = "#000000";//snodes[j].attributes.bgcolor;
//Get the caption of the graph
caption = nodes[j].attributes.caption;
//Get the x-axis name
xaxisname = nodes[j].attributes.xaxisname;
//Get the y-axis name
yaxisname = nodes[j].attributes.yaxisname;
//Get the min value of the y-axis
yaxisminvalue = nodes[j].attributes.yaxisminvalue;
//Get the max value of the y-axis
yaxismaxvalue = nodes[j].attributes.yaxismaxvalue;
//Now, we get the childNodes
childNodes = nodes[j].nodes;

//Iterate through all of the child nodes, pulling out
//their x,y values and storing them in arrays

for (k=0; k<=childNodes.length; k++)
{
//If the node name is Set i.e., a graph data set, then we retrieve
//and collect the values
if (childNodes[k].nodeName == "point")
{
//Increment counter
childCounter= childCounter+1;
//Get the x-axis name
xAxisValue[childCounter] = childNodes[k].attributes.xvalue;
//Get the value
yAxisValue[childCounter] = childNodes[k].attributes.yvalue;
}
}
}
}
}
上面的例子简单地解析了XML文档并将它存储在各数组中共以后的应用使用。
世界上有很多Flash开发者。因而Macromedia的网站上有很多免费的ActionScript库可用。有几个库可用来以图形格式绘制数据数组。通过使用这种方法,可以创建一个简单的应用来绘制应用服务器产生的XML文档,如下图所示:
IMG http://www.matrix.org.cn/upload/forum/20031126180130.gif[/IMG]
由于Flash在处理丰富的媒体方面的优越性,你可以很容易地在上面的代码的基础上进行扩充,构想出一个更全面的图形应用。这个图形应用程序可以调用服务器上的方法来产生包含几个x-y坐标对的XML文档。将这些数据与一些可以自由使用的图形库结合在一起,Flash接口可以以一种令人愉快地方式为用户在图形上绘制出这些坐标。这个图形应用与基于HTML的图形应用是不同的,因为Flash应用程序只须一次以XML格式得到数据,不用对服务器进行其它的调用,它允许用户放大,钻取, 或者作用于未来的数据集。可以证明,这种方法在想要限制对服务器上CPU的占用率时是非常有用的。随着桌面电脑性能的变得越来越强大,应用程序将服务器端的负载分配给客户端的能力将愈发有用。Flash允许开发者将所有的XML解析和图形操作的工作交给客户端来做,从而将服务器解放出来处理其它的请求,以此来达到上述目的。

将Flash整合进你的J2EE应用
尽管对于J2EE开发者而言前端配置有多种选择,但不同的选择效果是不一样的。HTML和DHTML解决方案适合于处理文档驱动或简单的应用。而Swign/applet方案重量级应用中,配置环境已经安装了JVM的情况下有一定优势。然而,对于有些应用,Flash可能对客户端环境极有意义。Flash在含有少量脚本的多媒体应用中有优势。利用远端工具,开发者现在可以将Flash客户端整合进已有的J2EE体系结构中。

[本贴已被 yaojh302 于 2003-12-3 18:01:40 修改过]
↑返回目录
前一篇: 用Maven进行项目管理
后一篇: Java开发者XML基础(一)