作者 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)所提供的新特性。
相关厂商内容
<p class="entrypdf">
<a href="http://www.infoq.com/infoq/url.action?i=507&t=f" target="_blank">
QClub:开源世界里谁需要标准?(12.13 北京)
</a>
</p>
<p class="entryarticle">
<a href="http://www.infoq.com/infoq/url.action?i=508&t=f" target="_blank">
使用JSF、Ajax和Seam开发Portlets(2/3)
</a>
</p>
<p class="entrypdf">
<a href="http://www.infoq.com/infoq/url.action?i=492&t=f" target="_blank">
InfoQ中文站电子杂志《架构师》试刊第二期发布了
</a>
</p>
<p class="entrypdf">
<a href="http://www.infoq.com/infoq/url.action?i=505&t=f" target="_blank">
通过DBA管理工具包优化数据环境
</a>
</p>
<p class="entrypdf">
<a href="http://www.infoq.com/infoq/url.action?i=344&t=f" target="_blank">
IDC:《软件商成长路线图》白皮书免费下载
</a>
</p>
<h3>相关赞助商</h3>
<a href="http://www.infoq.com/infoq/url.action?i=245&t=f" target="_blank">
<br>
</a>
<div class="entrysponsors">
<p><a href="http://www.infoq.com/infoq/url.action?i=244&t=f" target="_blank">InfoQ中文站Java社区</a>,关注企业Java社区的变化与创新,通过新闻、文章、视频访谈和演讲以及迷你书等为中国Java技术社区提供一流资讯。</p>
</div>
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}
* |
* |