最近在一个项目中用到了Portlet,总结下使用的感受。

1)页面的重用,类似于“多窗口应用程序”,对于一些复杂的业务,用户可能要在操作间做些参考,比如查看账单的时候显示客户的详细信息,我们可以在两个不同的“页面块”中显示:一个显示账单信息,一个显示用户信息,否则用户就要打开两个浏览器窗口。这种场景越多,越能显示Porlet的威力。

2)页面的交互。页面细分后这个就成了一个突出的问题,如何在Portlet间传递消息比一般的JSP更加复杂。只有解决这个问题才能达到页面级的重用,而这比一般的代码级的重用难多了。在Jboss PortalFeature List里面可以看到其提及IPC:Inter-Portlet Communication API来专门的管理Portlet间的通信。Version 2.0的Portlet规范JSR 286已经出台,其中有一章”Coordination between portlets” 。在IBM DW上有一个系列:JSR 286 Portlet 的新特性。IBM的实现中有个“cooperative portlet”的feature,提供了一个声明式的界面来组织Portlet间的契约,使用Observer的模式来定义消息的订阅者和发送者,这些契约是运行时的,较之写入代码中的方式有更好的后期维护性。而这个强大的功能有一个很大的局限性:消息是同步的,比如消息就很难在Page间进行传递,这对于一些复杂的场景下是致命的。同时这也对Portlet的布局有了更高的要求,尽量的,相关联的Portlet一个放在同一个Page中。

More about IPC, please visit here, there are a lot of useful links.

3)Session的单独管理:每个portlet都有自己独立的session,这减小了session的生存范围,较之一般的HTTPSession更容易管理。

5) 开源的Portlet产品有Apache的JetSpeed,IBM的IBM Portlet开发模式就是基于这个开源框架的。还有个叫“Liferay Portal”的产品,好像还是很流行的,有很多特征,比如加入了Social Networking的元素。如其名字,其不仅是Portlet,而是一个Portal容器。

5)适用于在定制化程度需要很高的地方,比如网站的门户首页。一些SNS站点如Facebook更需要类似的功能。后者像一个大而全的聚合器(或者粘合剂),将各方面的信息收集到一个位置,而这也是社会化站点的特征。

6)开发模式较之原有模式,局限性很多,这主要是由portlet container决定的,由于页面的随意性,也造成了测试的难度加大。而如果想用一些已有的技术比如JSF作为展示层的替代,则需要一个定制的中间层使JSF接入到Portlet容器中。