聚合——优点何在?
我对Web 2.0的很多事情都非常感兴趣。我相信,在一片议论消失之后,这些正在兴起的概念和技术将在如何构建应用程序这一方面起到重要作用。聚合和“情境应用(situational app)”都是很伟大的概念,但目前为止,关于这一方面的很多示例只是技术上的,并且缺乏物质支持。业务用户不喜欢别人询问他一个地图与地址组合的方式有多少种,这与他们的工作无关。他们也不会去考虑使用最新的、人工智能辅助的、与上下文有关的鱼眼(fish-eye)列表(如果无法将它用于其公司数据的话)。目前,许多聚合应用可能都会孤独而终,因为没有人会发现它的奇妙之处。
那么我们如何才能确保创建的应用程序真的有用呢?好了,如果您将使用WebLogic和AquaLogic产品来创建SOA、web应用程序和企业计算,那么您已经解决了许多难题。有许多方法可用来获得企业用户完成其任务所需要的进程、数据、内容和服务,可能您已经将构建好了Web 1.0应用程序。但是Web 2.0又如何呢?您将如何完成上述那些实现呢?这有很多种可能,您也许多会感到迷惑。但是在尘埃落定之前,有一条建议您应该牢记于心:那就是REST。
表象状态传输(Representational State Transfer,REST)
有许多关于REST的文章、讨论和blog等,因此本文并不会过多地介绍其基本原理。如果您了解REST的基本原理,那么本文会更具意义,我建议您阅读以下参考资料:
Representational State Transfer - Wikipedia
RESTful Web Services by Leonard Richardson, Sam Ruby
Representational State Transfer (REST) - Chapter 5 of Roy T. Fielding's Dissertation
奇迹
我的一个同事对企业与Web 2.0之间的隔阂有一个很好的描述:“奇迹发生了。”如果已经构建了Web 1.0应用程序,那么您可能使用诸如JSP、JSF、Struts、Beehive之类的技术为企业应用程序提供用户界面。如果您了解J2EE,那么这些就很好用,并且非常适合传统的请求-响应架构。随着对Web 2.0功能的需求的增加,您必须考虑添加这些功能,同时不必扔掉任何东西或从头开始。
尽管这一节使用“奇迹”作为标题,但我并没有暗示REST本身就是将Web 2.0带入企业的奇迹。我相信,在与诸如Ajax、Flex和Silverlight之类的RIA(Rich Internet Application,富Internet应用程序)技术相结合时,REST将成为解决方案的一个重要组成部分。RIA工具包和产品有助于使应用程序更加有用;而REST有助于确保应用程序真的有用。通过使用REST,您可以解锁企业数据,以便在Web 2.0应用程序中使用这些数据,同时不必放弃各种期望的工具。
快速演示
如果您已经研读过REST方面的资料,或者已经使用过它,那么您会知道它的一个基本特性是HTTP可访问性。已配置在wlp.bea.com之上的原型REST服务有很多,在后续blog中,我将启发性地介绍其中的多数服务,并提供一些示例代码。现在,如果想实际查看REST,只需打开Web浏览器并输入以下URL即可:
http://wlp.bea.com/rest-web-lib/api/content.nodelist?repositoryName=BEA%20Repository
这将返回一个看起来类似以下代码片段的XML文档:
<?xml version="1.0" encoding="utf-8" ?>
<rsp stat="ok">
<name>null</name>
<nodePath>null</nodePath>
<id>null</id>
<type>null</type>
<nodes>
<name>Demo</name>
<path>/BEA Repository/Demo</path>
<id>/BEA Repository/2001</id>
<type>folder</type>
<workflowStatus>published</workflowStatus>
</nodes>
...
<rsp>
这些节点表示指定存储库的最高层次,各种文件夹类型都可以通过将其路径追加到URL上的nodePath参数之后来进行浏览。例如,可以使用以下路径查看Demo文件夹下的内容:
http://wlp.bea.com/rest-web-lib/api/content.nodelist?repositoryName=BEA%20Repository&nodePath=Demo
如果将文件层次结构改为Demos/Images/Logos,那么您将看到如下所示图像列表:
<?xml version="1.0" encoding="utf-8" ?>
<rsp stat="ok">
<name>Logos</name>
<nodePath>/BEA Repository/Demo/Images/Logos</nodePath>
<id>/BEA Repository/2009</id>
<type>folder</type>
<nodes>
<name>BEA</name>
<path>/BEA Repository/Demo/Images/Logos/BEA</path>
<id>/BEA Repository/2010</id>
<type>image</type>
<workflowStatus>published</workflowStatus>
</nodes>
...
<rsp>
那么如何做才能获得图像的细节信息呢?请使用content.node命令和以下路径:
http://wlp.bea.com/rest-web-lib/api/content.node?nodePath=/BEA%20Repository/Demo/Images/Logos/BEA
这将返回描述此节点的XML,以及将这些与特定内容类型匹配的属性。此原型服务将图像作为一种特殊情况对待,返回显示该图像和ShowProperty servlet的URL,而不是返回显示二进制数据的URL。要显示图像,可使用下面的URL:
http://wlp.bea.com/rest-web-lib/ShowProperty?nodeId=/BEA%20Repository/2010
以下是该图像:

使用客户端应用程序中的数据——求助于JSON
XML是表示数据的一种好方法,但它并不总是能够很好地在客户端上使用,特别是以JavaScript为中心的客户端。好在我们拥有JSON (JavaScript Object Notation) ,它是内在友好的JavaScript,经常与REST一起使用。通过使用format=json参数,我们可以获得JSON对任何REST请求的响应,如下所示:
http://wlp.bea.com/rest-web-lib/api/content.node?nodePath=/BEA%20Repository/Demo/Images/Logos/BEA&format=json
有趣的一个地方是,虽然JSON更容易与JavaScript一起使用,但它的读取却比XML还要难。尝试读取上面的URL,并查看文本编辑器中的响应。您会发现,Firefox在这方面比IE更好用。好在JSON的要点不是人类可读性,而在于它使用JavaScript中的数据是如此之容易。JSON响应可以转换为JavaScript对象和如下所示代码,其中,来自XMLHttpRequest的responseText的求值计算如下:
var result = eval('(' + xhmlHttpReq.responseText + ')');
得到的对象可与标准点符号一起使用,例如,使用“result.content.name”可以获得节点名称,使用“result.content.properties”可以获得属性数组,依此类推。这对许多JavaScript库和应用程序都很适用,我将在后续blog中描述和演示这一点,并将提供JavaScript库的源代码(包括基于Dojo的一些代码)。我还将演示如何将这些REST命令与各种类型的聚合工具和技术一起使用。
请保持关注!