1 序言
许多大型企业的网站, 渐渐采用了 portal server 作为开发的基础. 至于什么是 portal 呢, 中文翻译为 "门户网站"。 有人可能想.. 天杀的.. 门户网站不是就像 yahoo, pchome, yam 等等。不过, 我们现在讨论的 portal server, 不是那么地简单, 基本上 yahoo, pchome, yam 那些只能称为搜索引擎的门户网站。
如果你从来沒有用过 portal server 或是似懂非懂.. 大家可以连结到 MyNetscape 或 MyYahoo 去 注册一个帐号。因为 MyNetscape 的样式比较好看, 所以我接下来就以 MyNetscape 为介绍的范例。
如果你第一次接触到 portal,你会惊讶的发现... 哇.. 为何一个网站里面充满了这么多小窗口. 我们称这些小窗口叫做 "portlet",而且每个小窗口都存在着独立的信息与内容,可以放到最大化,缩小,还原,关闭等等。当你登陆之后,可以选择及调整自己 portlet 的配置,也可以设置自己喜爱的风格与样式,更可以设置每个 portlet 的资料配置。这种以客户为上帝的系统,就是我们将要介绍的 portal。
2 Portal 的组成
Portal 的组成可以分为三部份 (1) Portal Server (2) Portlet Container (3) Portlet
1) Portal Server 的定义是
一个 Portal(门户网站)就是指一个 Web-based 的系统,通常都会提供个人化设置、单一登陆、以及由各种不同来源或不同网站取得各式各样的信息,并且将这些信息放在网页之中组合而成的呈现平台,门户网站会有精巧的个人化设置去提供定制的网页,当不同等级的使用者来浏览该页面将获得不同的信息内容。2) Portlet Container 的定义是
portlet container 是提供 portlets 执行的环境,包含了许多 portlets 并且管理他们的生命周期,他也会永远保存着 portlets 的喜好设置,一个 portlet container 接收到来自 portal 的请求后,接着将这个请求传递给存在 container 的 portlet 执行。portlet container 没有义务去组合 portlets 产生的信息內容,这个工作必须由 portal 来处理。portal 和 portlet container 可以放在一起视为同一个系统的组件,或者分开成为两个独立的组件。3) Portlet 的定义是
一个 Portlet 是以 Java 技术为技术的 Web 组件,由 Portlet Container 所管理,专门处理客户的 request 以及产生各种动态的信息内容。Portlets 为可插式 ( pluggable ) 的客户界面组件,提供呈现层成为一个信息系统。这些由 portlet 产生的内容也被称为片段 (fragment),而片段是具有一些规则的Markup( HTML、XHTML、WML ),而且可以和其他的片段组合而成一个复杂的文件。而 Portlet 中的内容正常来说是与其他 Portlet 的内容聚合而成为一个 Portal 网页。而 Portlet 的生命周期是被 Portlet Container 所管理控制的。客户端和 portlets 的互动是由 portal 通过典型的 request/response 方式实现,正常来说,客户会和 portlets 所产生的内容互动,举例来说,根据下一步的连接或者是确认送出的表单,结果 portal 将会接收到 portlet 的动作,将这个处理状况转向到目标 portlet。这些 portlet 内容的产生可能会因为不同的使用者而有不同的变化,完全是根据客户对于这个 portlet 的设置。3 portlet 与 servlet 的关系
Portlet 和 Servlet 算是兄弟有那么一点点相似却又有那么一点点不同,因为 Servlet 和 Portlet 不尽然相同,所以研究小組決定将 portlets 定义成为一个新的组件,因此定义了 portlets 一个新的并且明确的界面与行为。为了尽可能与现有的 servlet 结合达到重复使用的目的,portlet 的规范利用了 servlet 的规范,许多观念都很相似的,结合 portlets、servlets 及 jsp 在同一个网站系统中,我们称为 portlet application 。在同一个 portlet application 中,他们将分享同一个 classloader,context 及 session。抽象类portlet是Portlet API的核心。 Portlet类扩展了Servelt API的HTTPServlet。所有的Portlet 都从HTTPServlet继承而来,间接地扩展了Portlet类,如下所示:
... +--javax.servlet.http.HttpServlet | +--org.apache.jetspeed.portlet.Portlet | +--org.apache.jetspeed.portlet.PortletAdapter | +--com.myCompany.myApplication.myPortlet
因此,Portlet是一类特殊的Servlet,能方便的插入Portal Server,并在其上运行。与 servlet 不同,portlet 无法直接发送重定向或错误信息到浏览器,以及转发请求或者写专用标记到输出流。
与 servlet 相比,Portlet有更强的动态性,可在不重新启动 Portal Server 的情况下进行更新:
- 可以使用门户网站管理界面安装和除去portlet 应用程序
- portlet 的设置可由拥有适当访问权的管理员进行更改
- 可以使用管理 portlet 动态创建和删除 portlet
Portlet容器依赖于J2EE体系结构。Portlet 被打包成类似于J2EE Web应用的WAR文件,并按类似于 servlet 的方式部署。与其它 servlet 相似,使用 servlet 部署描述符(web.xml)把 portlet 定义到应用程序服务器,这个文件定义 portlet 的类文件和只读初始化参数。除此之外,portlet还必须提供一个portlet的部署描述符(portlet.xml)来把portlet定义到portal server
1) Portlet 和 Servlet 的相似之处
@ portlets 也是 Java 技术的 web 组件@ portlets 也是有特定的 container 在管理
@ portlets 可以动态产生各种内容
@ portlets 的生命周期由 container 所管理
@ portlets 和客户端的互动是通过 request/response 的机制
2) Portlet 和 Servlet 也有一些不同
@ portlets 只产生 markup 信息片段,不是完整的网页文件。而 Portal 会将所有的 Portlet markup 信息片 段放到一个完整的 Portal 网页。@ portlets 不会和 URL 有直接的关系
@ 客户端必须通过 portal 系统才能和 portlets 互动
@ portlets 有一些定义好的 request 处理,action request 以及 render request。
@ portlets 默认定义 portlet modes 及窗口状态可以指出在网页中该 portlet 的哪个功能正在执行及现在的 状态。
@ portlets 可以在同一个 portal 网页之中存在多个。
3) Portlet 有一些附加的功能是 Servlet 所没有的
@ Portlets 能够存取及储存永久配置文件及定制资料。@ portlets 可以存取使用者数据
@ portlets 具有 URL 的重写功能在文件中去动态建立连结,允许 portal server 不用去知道如何在网页的片 段之中建立连结及动作。
@ portlets 可以储存临时性的数据在 portlet session 之中,拥有两个不同的范围 :
application-wide scope 及 portlet private scope 。
4) Portlet 不具有一些功能, 但是 Servlet 却有提供
@ servlet 具有设置輸出的文字编码( character set encoding)方式@ servlet 可以设置 HTTP 输出的 header
@ servlet 才能夠接收客户对于 portal 发出的 URL 请求
4 RI - pluto 冥王星计划
JSR 是由 JCP ( www.jcp.org ) 这个 Java 组织所定义出来的规范。几乎每个 JSR 都会产出 TCK* 及 RI**
*TCK ( Technology Compatibility Kit ) 兼容性测试组件
*RI ( Reference Implementation ) 实现参考
2003/10/27 JSR#168 Portlet Spec 1.0 已经正式公布。以后, 大家就可以开始根据这个规范开发兼容性的产品。而这个标准规范书的 RI 就是采用 Apache Jakarta Pluto 冥王星计划。至于为何叫做冥王星,我猜是 Sun 想要把光芒射到冥王星都会发光吧 :P
目前 pluto 尚未有正式的版本释放, 将来有兴趣的人可以从 jakarta 网站下载。不过目前我由 CVS 取得版本已经可以正常运行了。安装的方法十分简单.. 只需要执行 %pluto%/bin/install 就可以安装了,安装过程会询问你 tomcat 的目录,假设你 tomcat 根目录是 c:\tomcat4.1.27 ,你输入 c:\tomcat4.1.27 就可以了。
接着 http://localhost:8080/pluto/portal 就可以看到很漂亮的 portal 界面,至于操作模式与方法非常简单,请多加操控就可以慢慢了解 portlet 的控制方法了。
在 portlet spec 中定义的控制有分为
1) 基本的 Portlet Modes
VIEW - 你没有做任何动作仅仅做内容显示
EDIT - 编辑相关的设置
HELP - 寻求帮助
2) 基本的 Window States
NORMAL - 还原 portlet 窗口
MAXIMIZED - 最大化 portlet 窗口
MINMIZED - 最小化 portlet 窗口
其实, 这些动作都已经由 portal 所实现,portlet container 将接收与回应相关的动作。真正在程序开发上并不会考虑到这些细节,除非你要做一個 portlet container。而开发上要考虑的是什么人能夠做什么事情。例如说尚未登陆的人应该只能夠 doView / doHelp,而不能夠 doEdit 这种权限管控机制的开发。
5 css 定义
每个通过认证的使用者,就可以使用相关的 portlet 外观 ( Look&Feel )设置,而这些设置就是通过 css 来 编辑。在没有 portlet spec 之前,各家厂商都自行规定或由 ISV 各自完成,造成了許多 portlet 无法共用同一份 CSS 来实现,移植上将会有许多问题发生。因此 css 的定义对于具有定制功能的 portal 是相当重要的。
0) Anchor
这个并没有定义 :P
1) Fonts ( font )
portlet-font
portlet-font-dim
2) Message ( paragraph .. )
portlet-msg-status
portlet-msg-info
portlet-msg-error
portlet-msg-alert
portlet-msg-success
3) Sections ( table, div, span ... )
portlet-section-header
portlet-section-body
portlet-section-alternate
portlet-section-selected
portlet-section-subheader
portlet-section-footer
portlet-section-text
4) Forms ( form )
portlet-form-label
portlet-form-input-field
portlet-form-button
portlet-icon-label
portlet-dlg-icon-label
portlet-form-field-label
portlet-form-field
5) menus ( popup menu )
portlet-menu
portlet-menu-item
portlet-menu-item-selected
portlet-menu-item-hover
portlet-menu-item-hover-selected
portlet-menu-cascade-item
portlet-menu-cascade-item-selected
portlet-menu-description
portlet-menu-caption
基本上, 你要了解什么地方该用什么 css,这些 css 名称套用在你开发的 portlet 之中,你就可以移植到其他支持 jsr#168 的系统,不需要在花时间去更改成为他们的 Look&Feel。
6 信息片段 ( fragment markup ) 的限制
每个 portlet 输出都是一个信息片段,之前有提到, 这些 markup 有些限制。如果你是生成 HTML 格式的信息片段,就*不可以*拥有以下这些 tag :
base, body, iframe, frame, frameset, head, html, 及 title
如果生成是 XHTML 或 XHTML-basic 格式的信息片段,就*不可以*拥有以下这些 tag :
base, body, iframe, head, html 及 title
7 其他细节
最后, portlet 需要考虑的还有 security, caching, taglib 等等..Portal 是连结后端 EAI 处理的信息整合平台,提供了企业完整的解决方案,提供了单一登陆的机制,贴心的个人化页面设置,更可以提供各式各样平台如 pda, 手机等等的统一窗口。因此, 政府与大企业都 *应该* 采用这种解决方案,通过 Webservice 达成信息流/金流/物流 的效果....