http://book.51cto.com/art/200808/86219.htm

OpenAjax Hub(以下简称Hub)主要处理Web应用开发者需要在同一个应用中同时使用多个AJAX运行库的场景。它提供标准的JavaScript,当被包含在用AJAX技术创建的Web应用中时,让多个AJAX工具包能够在同一个页面里一起协同工作。

AJAX应用开发者在开发过程中的需求往往存在着多样性,这种情况导致了如今市场上存在超过200个各种各样的AJAX产品,同时这些产品的架构和特性也存在很大的多样性。对于一些开发者而言,他们认为开发中最重要的因素是找到一种可以提供和后端服务器很好集成的AJAX工具包。
而对于其他一些开发者而言,最重要的因素则是是否存在可用的特定客户端组件(例如,富数据网格小部件或者交互式的图表小部件)。结果,AJAX生态系统发展到现在,开发者在大部分时间里都能找到满足他们每个特定需求的AJAX工具包,但是也存在问题,他们往往必须在同一个Web应用中混合和匹配使用由多个AJAX工具包才能满足所有的需求。

Hub应用的一个重要场景是门户和mashup,在这些场景中,应用开发者创建一个页面,页面里松散装配预先封装好的应用组件。Hub实际上是保证这些AJAX技术创建的复杂应用能够使用由多个不同的AJAX工具包创建的组件进行构建。

1 主要特性:Hub的发布/订阅管理器

Hub的主要特性是它的发布/订阅管理器(以下简称为“pub/sub管理器”)。pub/sub管理器允许mashup的部分功能能够广播事件到其他应用组件的订阅中。例如,假设存在一个日历小部件,这个小部件允许用户能够选取一个特定的日期。mashup中可能存在多个用户界面组件,这些组件都需要根据新选择的日历日期来更新它们的可视化外观。在这种情况下,日历小部件将发布一个“新日历日期”的事件,而其他可视化小部件将订阅这个事件。因此,pub/sub管理器的通用消息的优点是在由不同的AJAX工具包所构建的组件之间提供了一个主要的集成机制。
Hub的pub/sub管理器提供各种各样的高级特性,例如对事件名称通配符的强大支持,在下面的例子中我们没有展示这个特性。

1.1 示例

让我们假设现在有这样一个商业智能应用,该应用使用了以下几种AJAX运行库:

UTILS.js,对浏览器的JavaScript环境提供非常有用的扩展,例如XMLHttpRequest API
CALENDAR.js,提供一个日历小部件。
CHARTS.js,提供一个图表小部件。
DATAGRID.js,提供一个交互式数据网格小部件。

 

这个应用存在唯一的日历小部件,用户可以以图表小部件的形式(例如,每日状态、每周状态、每月状态和每年状态的柱状图)和数据网格小部件的形式(例如,区域数据和全国数据对比,两种数据都以用户选择的感兴趣的列展示)选择其中的一些数据视图。

当用户在日历小部件中选择了一个新的日期时,用户指定的各个可视化组件(例如,图表和/或者数据网格小部件)都需要被更新。

实现这个应用的一种方法是在加载其他AJAX库之前加载OpenAjax Hub的JavaScript。例如:

 
  
  1. <html> 
  2. <head> 
  3. ... 
  4. <script type="text/javascript" src="OpenAjax.js"/> 
  5. <script type="text/javascript" src="UTILS.js"/> 
  6. <script type="text/javascript" src="CALENDAR.js"/> 
  7. <script type="text/javascript" src="CHARTS.js"/> 
  8. <script type="text/javascript" src="DATAGRID.js"/> 
  9. ... 
  10. </head> 
  11. ...  

一些AJAX运行期包含了OpenAjax Hub,将Hub作为它们标准发布的组成部分,在这种情况下,只要特定的AJAX运行期的JavaScript 在其他兼容OpenAjax的运行期加载之前被加载,则无需为OpenAjax.js使用一个单独的<script>元素。

为了让应用正常工作,开发者需要注册一个回调函数,当用户在日历小部件中选择一个新的日期时,这个回调函数将被调用。这个回调函数接着使用OpenAjax Hub的publish()函数广播新日期事件:

 
  
  1. <script type="text/javascript"
  2. ... 
  3. function MyCalendarCallback(...) { 
  4. OpenAjax.hub.publish("myapp.newdate", newdate); 
  5. ... 
  6. </script> 

接着开发者需要开发一些代码,让所有的图表小部件和数据网格小部件都订阅这个新日期事件,并且提供回调函数。各个回调函数将相应地更新特定的可视化小部件:

 
  
  1. <script type="text/javascript"
  2. ... 
  3. function NewDateCallback(eventname, publisherData,subscriberData) { 
  4. ……更新特定的可视化小件…… 
  5. OpenAjax.hub.subscribe("myapp.newdate", NewDateCallback); 
  6. ... 
  7. </script>  

1.2 未来支持OpenAjax Hub的工具包

OpenAjax联盟正在和业内一起合作,以达到广泛支持OpenAjaxHub的目的。某个特定的AJAX工具包可以像下面这样支持OpenAjax Hub。

AJAX工具包可以把Hub包含在内(这是一种最好的方式)。Hub可以用小于3K的JavaScript实现,所以一些AJAX工具包简单地捆绑Hub,将它作为工具包的一个标准组件。

如果Hub在运行环境里可用,则使用它。其他一些AJAX工具包可能决定在发布版本中不包含Hub,它们会检查Hub是否早先已经被加载了,如果已经加载,那么它们将直接使用Hub的服务。

第三方的开发者可以开发适配器。对于大多数工具包而言,它们可能允许第三方的开发者编写少量的JavaScript,使得自己能够支持Hub。

当AJAX工具包包含对Hub的内置支持时,应用开发者的任务将变得更加容易,但是通过查找或者编写一个简单的适配器,Hub仍然可以与那些还未实现对Hub的支持的工具包一起使用。