当前页面位置: » 丰搜网 » 文档中心 » 详细内容
增强你的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小程序。这些是很耗费时间的,特别是会使inte
.net的连接变得非常慢。
除了这种解决方法外开发者有三种选择来在客户端/
服务器应用中使用丰富的前端: 动态
html(d
html),
applet/
swing, 或者第三方解决方法。每种解决方法都各有利弊。
dhtml: 使用d
html创建丰富的前端提供了如下优点:
1. d
html是开放的并且免费
2. 使用d
html所写的应用可以在支持d
html的任何
web浏览器中配置
3. 基于
web的应用其客户端通常都由文字和图片构成,这允许小的应用脚本的存在。
d
html也并不总是一个好的解决方案;当选择这一技术时你也必须要考虑到它的一些缺点:
1. d
html依赖用户的
web浏览器来切实地将用户的原意反映在应用中。由于浏览器的厂家和版本多种多
样,因此复杂的应用中必须嵌入工作区以使得应用能够在不同的浏览器中有着同样的表现
2. 尽管d
html使得开发者可以更好地控制客户端行为,但这种灵活性也是有限的
3. 由于不同的浏览器在表现
html和解释
javascript上有一些不同,必须为各个不同的
web浏览器创建
不同的平台。加入工作区并将每个浏览器的实现分开增加了维护应用的复杂性。另外,无论什么时候一
个新的浏览器发布后,应用(或应用的一个部分)就必须重新编码并
测试。
当开发者明确知道他在标准的客户端配置什么样的应用时,使用d
html的确有它的优势。如果企业内部网仅适用ie6.0,针对该浏览器的应用逻辑可以被处理得非常得当。
applet/swing: 对于
java开发者而言,基于
applet或
swing的解决方案是另外一种可行的解决方案。它有如下的优点:
1. 创建基于
java的应用无论对于用户还是开发者都是免费的
2.
applets可以通过大部分的浏览器进行配置
3.
applets允许用户创建丰富的用户界面
4. 使用
applets让客户端分担了一部分
服务器的负载
选择使用基于
applets的解决方案也必须衡量它的以下不足: 开发者不能确定用户是否安装了jre. 即便安装了,也不一定是所需要的版本。
applets为开发者在标准客户端配置他们的应用提供了很大的选择余地。对于标准客户端,开发者可以假定正确的jvm版本已经安装
除了使用
applet/
swing或d
html应用,开发者还有一个选择: 第三方解决方案。
第三方解决方案: mecromedia flash 为了达到d
html或
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>
flashgateway
servlet</
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 object model)传递。如下的actionscript代码解析一篇应用于2d图形中的包含x和y坐标的
xml文档:
<graph>
<point>
<xvalue>10</xvalue>
<yvalue>5</yvalue>
<point>
<point>
<xvalue>20</xvalue>
<yvalue>10</yvalue>
<point>
</graph>
应用服务器上的一个产生图形文件文档的类:
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 parse
xml()
{
//create a new array called nodes
nodes = new array();
//initialize the nodes array to
//contain all of the children of the report
xml document
nodes = report
xml.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文档,如下图所示:
由于
flash在处理丰富的媒体方面的优越性,你可以很容易地在上面的代码的基础上进行扩充,构想出一个更全面的图形应用。这个图形应用程序可以调用
服务器上的方法来产生包含几个x-y坐标对的
xml文档。将这些数据与一些可以自由使用的图形库结合在一起,
flash接口可以以一种令人愉快地方式为用户在图形上绘制出这些坐标。这个图形应用与基于
html的图形应用是不同的,因为
flash应用程序只须一次以
xml格式得到数据,不用对
服务器进行其它的调用,它允许用户放大,钻取, 或者作用于未来的数据集。可以证明,这种方法在想要限制对
服务器上cpu的占用率时是非常有用的。随着桌面电脑性能的变得越来越强大,应用程序将
服务器端的负载分配给客户端的能力将愈发有用。
flash允许开发者将所有的
xml解析和图形操作的工作交给客户端来做,从而将
服务器解放出来处理其它的请求,以此来达到上述目的。
将flash整合进你的j2ee应用 尽管对于
j2ee开发者而言前端配置有多种选择,但不同的选择效果是不一样的。
html和d
html解决方案适合于处理文档驱动或简单的应用。而swign/
applet方案重量级应用中,配置环境已经安装了jvm的情况下有一定优势。然而,对于有些应用,
flash可能对客户端环境极有意义。
flash在含有少量脚本的
多媒体应用中有优势。利用远端工具,开发者现在可以将
flash客户端整合进已有的
j2ee体系结构中。
[本贴已被 yaojh302 于 2003-12-3 18:01:40 修改过]
关键字 本文所属关键字
相关 与本文相关文章
分类 所有文章关键字导航
标准 网站致力的规范