天天看點

JSR#168 Portlet 說明

ch1 序言

許多大型企業的網站, 漸漸采用了 portal server 作為開發的基礎. 至于什麼是 portal 呢, 中文翻譯為 "門戶網站"。 有人可能想.. 天殺的.. 門戶網站不是就像 yahoo, pchome, yam 等等。不過, 我們現在讨論的 portal server, 不是那麼地簡單, 基本上 yahoo, pchome, yam 那些隻能稱為搜尋引擎的門戶網站。

如果你從來沒有用過 portal server 或是似懂非懂.. 大家可以連結到 MyNetscape 或 MyYahoo 去 注冊一個帳号。因為 MyNetscape 的樣式比較好看, 是以我接下來就以 MyNetscape 為介紹的範例。

如果你第一次接觸到 portal,你會驚訝的發現... 哇.. 為何一個網站裡面充滿了這麼多小視窗. 我們稱這些小視窗叫做 "portlet",而且每個小視窗都存在着獨立的資訊與内容,可以放到最大化,縮小,還原,關閉等等。當你登陸之後,可以選擇及調整自己 portlet 的配置,也可以設定自己喜愛的風格與樣式,更可以設定每個 portlet 的資料配置。這種以客戶為上帝的系統,就是我們将要介紹的 portal。

ch2 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 的設定。

ch3 portlet 與 servlet 的關系

Portlet 和 Servlet 算是兄弟有那麼一點點相似卻又有那麼一點點不同,因為 Servlet 和 Portlet 不盡然相同,是以研究小組決定将 portlets 定義成為一個新的元件,是以定義了 portlets 一個新的并且明确的界面與行為。為了盡可能與現有的 servlet 結合達到重複使用的目的,portlet 的規範利用了 servlet 的規範,許多觀念都很相似的,結合 portlets、servlets 及 jsp 在同一個網站系統中,我們稱為 portlet application 。在同一個 portlet application 中,他們将分享同一個 classloader,context 及 session。

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 請求

ch4 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 這種權限管控機制的開發。

ch5 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。

ch6 資訊片段 ( fragment markup ) 的限制

每個 portlet 輸出都是一個資訊片段,之前有提到, 這些 markup 有些限制。

如果你是生成 HTML 格式的資訊片段,就*不可以*擁有以下這些 tag :

base, body, iframe, frame, frameset, head, html, 及 title

如果生成是 XHTML 或 XHTML-basic 格式的資訊片段,就*不可以*擁有以下這些 tag :

base, body, iframe, head, html 及 title

ch7 其他細節

最後, portlet 需要考慮的還有 security, caching, taglib 等等..

Portal 是連結後端 EAI 處理的資訊整合平台,提供了企業完整的解決方案,提供了單一登陸的機制,貼心的個人化頁面設定,更可以提供各式各樣平台如 pda, 手機等等的統一視窗。是以, 政府與大企業都 *應該* 采用這種解決方案,通過 Webservice 達成資訊流/金流/物流 的效果....