eXo平台概览


作者
Benjamin Mestrallet and Tugdual Grall译者
张龙
发布于
2008年12月5日 上午9时14分

<dl class="tags2"><dt class="community">社区</dt><dd><a href="http://www.infoq.com/cn/java;jsessionid=82A45966CD7B7711B998F26B4139A924" name="java" id="739" onclick="try {CategoryPopup.showPopup(this);} catch(e) {}; return false;">Java</a></dd><dt class="topics">主题</dt><dd><a href="http://www.infoq.com/cn/portalcms;jsessionid=82A45966CD7B7711B998F26B4139A924" name="portalcms" id="787" onclick="try {CategoryPopup.showPopup(this);} catch(e) {}; return false;">门户/内容管理系统</a></dd><dt class="topics">标签</dt><dd><a href="http://www.infoq.com/cn/portlets;jsessionid=82A45966CD7B7711B998F26B4139A924" name="portlets" id="789" onclick="try {CategoryPopup.showPopup(this);} catch(e) {}; return false;">Portlets</a></dd></dl><p>我们很高兴地宣布,eXo平台发布了新的Portlet Container 2.0和Portal

2.1。eXo是第一个对生产者和消费者提供全面支持的Portal——支持新的Java Portlet 2.0 API(JSR 286)和Web
Service Remote Portlet 2.0(WSRP)。该宣布给我们提供了一个机会来了解eXo
Portal、Portlet-Container及企业内容管理(Enterprise Content
Management,即ECM)所提供的新特性。

eXo平台架构概览

在详细了解eXo平台提供的Portal、Portlet Container及ECM组件前,我们需要了解一下该平台的架构。

从eXo平台的首个版本开始,它就使用了一个叫做Pico的控制反转容器(IoC),以降低服务间依赖的耦合。这样,组件的实例化以及将其注入到依赖它的组件中就是容器的职责了。

eXo平台所有的组件都以插件形式开发,并且使用IoC容器将其包装在一起。下图从下到上展示了eXo平台栈的各个组件:

The Web 2.0 Portal

新版本的eXo Portal构建于旧版本之上,同时我们去除了一些扩展模块附加的使用复杂性,这要归功于Web 2.0技术,如AJAX。

事实上,eXo最先引入了动态布局的概念,而大多数其他的Portal依旧在使用静态布局。两者的主要区别在于:通过动态布局你可以管理嵌套的容器
树,树中的每个叶子都是Portlet。容器负责孩子的布局,就像操纵Swing
UI对象一样,如下图所示。开箱即可用的容器渲染器会在行、列或者标签上显示其孩子。

这样,将容器从一个地方移到另一个地方就像数据结构中对树的操作一样。在客户端,我们使用了JavaScript来创建拖拽库,这样可以简化树的操作。因此,如下图所示,我们不仅可以在页面中拖拽容器和Portlets,还可以将一类容器或者Portlet拖到页面中。

每个Portlet都有一套元数据,这使得Portal可以在页面中渲染它。该元数据不仅包括标题、大小、图标及边框样式(参见下图),还包括是否显示边框及图标的选项(最小化或者最大化Portlet)。

一旦获得了所有信息,Portal就可以渲染不同类型的页面了。用户登录时,各种类型都会集成到用户的菜单中(参见下图)。页面类型包括:

  • Portal页面,这是每个用户都会看到的页面。一些页面甚至可被匿名用户访问,这可以作为外网或者Internet站点(就像我们自己)的基础

  • ;
  • 用户页面,这可看作一套面板,用户可以增加新的页面和自己的内容(只要公司政策允许就行)
  • 组页面,它会将用户所在组的页面增加到用户菜单中,比如市场或者销售组

在上面的截图中你还会看到,用户登录后左边有一个可折叠列。它包括不同页面和管理菜单之间的导航,以及用户可自行配置的一组Widgets。正如我
们所说的,Widgets是完全的JavaScript组件,它们使用REST协议与服务器进行通信。在未来的版本中,我们将基于Google的
OpenSocial标准。

eXo Portal 2.0也是一个完全的AJAX
Portal,这意味着当你从一个页面移到另一个页面时,屏幕只会部分刷新。为了达到这个目的,每当页面改变或者需要对页面上的一个或者几个
Portlets的内容进行修改(就如同一个Portlet使用JSR
286标准调用向另一个portlet发送消息)时,我们都使用JavaScript的XMLHttpRequest对象去异步调用服务器。这当然会极大
地改善服务器的调用,因为除非发送了事件,否则只需调用render()一次就够了。这与通常情况截然相反,在通常情况下,每个Portlet都需要渲染
其片段,而这会花费大量时间(即便采用缓存也是如此)。

每次请求时,Portal都会返回一个XML文件,该文件包装了所有需要在页面中进行更新的不同HTML片段。该XML文件的结构如下:

 {PortalResponse}
|
* |