[引言] 早在2003年底,Portal这个名词第一次出现在了我的技术辞典中。当时对Portal的理解仅仅限于“页面上的几个可以随意摆放的小窗口”,觉得没 有什么特别的,也没有把这项技术放在心上了。2004年底,我参与了一个基于Portal的项目开发。在过去将近一年的时间里,一直都在和IBM WebShpere Portal打交道,这给了我认识并学习Portal的好机会。Daily Portal这一系列的文章算是我这一年来对Portal认识的小小一个总结吧。
Portal是一个内涵很丰富的名词,其中文意思是“大门,正门,入口或者进入的手段”。而这项技术也确实人如其名,它为用户提供了一种简单而且统一的访问Web Application的入口。在这个定义中,统一是最为重要的方面,因为在一个企业中,其IT Support可能是由很多很多相对独立的系统组成,而它们都有各自的访问入口。在没有使用Portal技术之前,不管是企业内部员工,企业的合作伙伴以及企业用户都不得不在几个系统中来回跳转以获得对自己有用的信息,对效率有很大的影响。更糟糕的是,跨系统对信息进行采集和总括的时候,散布在各个系统的相关信息将会以不同的呈现方式出现在用户面前,要迅速从中获得所需要的信息集将是一项十分艰巨的任务。而Portal的统一意味着集成(integrate),它所提供的不仅仅是将几个系统的信息采集过来在一张页面上显示出来,还要提供安全,权限,统一的登陆服务,个性化设置等等。利用Portal来进行Legacy系统的整合是一个十分重要而且有意义的课题,可惜这一年来所做的项目仅仅是对一个系统升级,还没有机会亲身体验Portal在系统整合方面的强大优势,希望有经验的朋友可以不吝赐教。
说完Portal的定义,我们来看一下Portal的组成结构:
从图中我们可以看出,Horizontal Portals Infrastructure部分为建立不同的Portal系统提供了最基础的服务,通常它由以下几个方面组成:
1、Presentation:提供了在不同的client端显示的服务;
2、Personalization:基于User Profile的个性化设置服务;
3、Collaboration:提供与其他系统,如果Mail,IM等的协作服务;
4、Portlets:这个名词是不是很熟悉呢?Portlet提供了访问Web Application的服务;
5、Search and Workflow:提供与Legacy系统集成的服务;
6、Publish and subscribe:提供内容发布与订阅服务;
7、Administration and Security: 管理及安全服务;
8、Integration:提供与数据库连接以及元数据共享服务。
而在这八个方面当中,Portlets是最为核心的,通常我们对Portal的第一步感性认识也是从Portlet开始。简单的说,从页面上看到的一 个个小窗口就是portlet。我们可以把Portlet看成是Web世界中的可重用的Component,它为用户提供了访问Web Application,Web Service或者Web Content的服务。一个Portal Page通常会包含几个Portlet,而这些Portlet之间是相互独立且互不影响的,也就是当一个Portlet无法正常工作的时候,另外的 Portlet并不会因此而罢工,仍会正常地进行处理。
最后大致说一下,使用Portal技术会给企业带来怎样的益处。首先,以 可重用的Portlet作为核心的开发方式使得企业可以更快速的响应商业上的需求;Portal提供了强大的系统集成功能,降低了系统维护以及使用的成 本,同时也降低了员工培训的成本;Portal提供了统一的访问入口使得用户访问各个系统的时候有更好的用户体验以及更好的安全性。
在昨天的Post中,偶已经对Portal进行了简单的介绍,不知道各位对Portal是不是有一点点认识了呢?如果还是云里雾里的话也没有关系,毕竟Portal所涵盖的内容是很广博的,掌握它需要时间,了解也是需要时间的。在初步介绍了Portal的概念之后,今天我们来探讨一下Portal的核心——Portlet。
首先,Portlet在表现形式上就是我们所看到的页面上一个个小窗口,但是它绝不仅限于将Web Content以模块化的方式显示出来。实际上,每一个Portlet就是一个完整的Web Application,拥有完整的MVC。而Portlet的开发,部署,管理和显示都是完全独立的,不受其他Portlet的影响,从而其functionality(功能性)也是独立的,也就是说一个Portlet就是一个处理特定义务逻辑的Component。正是Portlet这种独立性与功能性,使得Portal的Administrator或者是End User能够很方便地配置符合自己要求的页面,充分提高信息采集与概括的效率。
做完了表面功夫之后,我们将注意力集中到Portlet的底层实现中来。从Portlet的类继承关系上,我们可以看到Portlet的Superclass仍然是HttpServlet。事实上,虽然Portlet相对Servlet而言进行了很大程度上的扩展并有很大的优越性,但是其本质与Servlet并无二致,都是一个处理HttpRequest并返回HttpResponse的过程,只是这个过程已经不是Servlet中的doGet、doPost或者service那么简单了,而是分成了两个方面:Event Phase和Content Rendering Phase。这就是Portlet的Two-phase Portlet Request Processing了。也许你会对这样的划分产生了兴趣,为什么需要这样去划分呢?其实,这样做是为了保持Portlet之间独立性。你可以设想一下,在一个Portal Page中包含了两个Portlet,而你在其中的一个Portlet输入了数据并提交,那么该Portlet将会处理你的请求并返回相应的结果,而另外一个Portlet则需要保持原来的样子。在这样的一个过程,对于处理了你的请求的Porlet,其Processing包含了两个phase,而另外一个Portlet则仅是进行了Content Rendering Phase的处理并将cache的内容返回。写到这里,我不禁想到了Ajax。以上的case,可以看作是页面的部分更新,如果使用了Ajax,是不是可以简化Portlet Request的处理过程呢?我相信这是一个有趣并值得深入探讨的问题。[1]
说完了比较底层的东西,我们最后再来看看Portlet比较特殊的一个地方:Portlet Mode。一个Portlet通常会包含几种display mode,最常见的莫过于Minimize和Maxmize的display mode,除此之还会有Help Mode和Edit Mode。Help Mode为用户提供关于该Portlet的帮助信息,而Edit Mode则为用户提供了设置Portlet属性的界面。用户可以通过点击Portlet的title bar上的图标(图中黑色椭圆框住的部分)来切换不同的display mode,如下图所示:
以上对Portlet作了简单的介绍,希望能够给各位以初步的印象。讲了那么多理论上的东西,大家是不是有点厌烦了呢?不要急,在接下来的Post中就要动手实践了,敬请关注哦! 🙂
在上一篇Post中,我提到要开始实践了,但是酝酿一篇与实践密切相关的Post还真的很费劲。毕竟建立一个portlet的方法有很多种,而且还会因使用的工具不同而方法迥异。平常在工作当中都是使用IBM提供的Portal Toolkit进行Portlet开发,打开Create New Portlet Wizard,跟着提示点几下按钮,一个漂亮的Portlet就在弹指之间完成了。如果我把这样的过程step by step地写下来,似乎意义不大,毕竟这些内容在IBM的红皮书中都写得清清楚楚了,况且由Portal Tookit搭建起来的开发环境也不是唾手可得的,看来还得从Open Source的东西入手了。
在Apache的Portals项目中有一个名叫Pluto的子项目,它致力于构建一个简单的Portlet Container,让程序员可以Deploy并运行所开发的Portlet。Pluto相对于BEA、IBM等大公司提供的Portal Server而言,尽管显得功能简陋,但是作为Portlet API的一个参考实现还是挺有权威的,其简单性也正好让我们更加关注Portlet的本质。更重要的是,它是开源的,大家都很容易从网上找到它。于是,Pluto就成为我们进行实践的不二之选了。OK,想好了就开始动手咯!
首先,我们从Pluto下载页面中把最新版本1.0.1-rc4的Pluto给download下来。由于Portlet Container并不是一个可以独立运行的container,它是离不开Web Server和Servlet Container的,所下载的Pluto中就包含了Tomcat5.5.9。由于Tomcat5.5.9所要求的JRE是5.0或以上,如果你的机子上装有5.0以上版本的JRE,那么你只需要将Pluto解压到某一个目录下(<PLUTO-HOME>),然后在console中进入<PLUTO-HOME>/bin目录,运行startup即可。这样Tomcat连同Pluto都启动了,接着我们访问http://localhost:8080/pluto/portal,就会出现如下界面,准备工作就大功告成了。
如果你的机子上只有JRE1.4的话,要让Tomcat跑起来我们就还得从Tomcat5.5.9的下载页面下载一个名为compat的zip file。然后把这个zipfile解开,里面包含着bin和common两个目录,bin目录下包含着jmx.jar文件,common目录下还包含着一个endorsed目录,该目录下包含着xml-apis.jar和xercesImpl.jar文件。我们只需要把jmx.jar复制到<PLUTO-HOME>/bin目录下,改掉<PLUTO-HOME>/common/endored目录下的两个jar文件的后缀,并将xml-apis.jar和xercesImpl.jar复制到该目录下即可。
准备工作完成以后,我们就开始咱们的第一个Portlet了——HelloWorld Portlet,具体的步骤请参考OnJava上的文章:What Is a Portlet, 在这里我就不罗嗦了。与这篇文章所介绍的不同,由于我们使用的是1.0.1-rc4,发布Portlet就不再像文章所说的那样复杂了,你也不需要有 Maven的基础,只需要通过Pluto的Admin页面将war文件上传并根据页面提示进行少许配置,就轻而易举地完成Portlet的发布了。发布完 成以后,需要重新启动Pluto,这是一个非常不方便的地方,但据说在一个版本的Pluto将支持Hot Deploy,发布Portlet就不需要重新启动了。
最后,我们通过浏览器访问http://localhost:8080/pluto/portal,你会发现在左边的Portal Page列表中多了一项——HelloWorld。点击该项,我们就可以看到这个最简单的Portlet了。