級(jí)別: 中級(jí) |
架構(gòu)師,Websphere Portal Server Development, IBM
2004 年 2 月
本文詳細(xì)說(shuō)明了 Java TMJava TMStandardization Request for the Java Portlet 規(guī)范(以下稱為 JSR 168)和 IBM WebSphere Portal Version 5.0 支持的 IBM Portlet API之間的相似點(diǎn)和不同點(diǎn)。文中解釋了 JSR 168 的一些基本概念和特征,并將它們與 IBM Portlet API 進(jìn)行了比較,并且為兩個(gè) Portlet 編程接口中的每一個(gè)都提供了一個(gè)示例 Portlet。本文是為那些對(duì) Java 編程、Servlet 或Portlet 編程有良好理解并具備 portal 方面的基本知識(shí)的 Portlet 開(kāi)發(fā)人員和 Portal 架構(gòu)師準(zhǔn)備的。
引言
隨著越來(lái)越多的企業(yè)Portal 的出現(xiàn),不同的廠商已經(jīng)創(chuàng)建了各種用于 Portal 組件的 API(稱為 Portlet)。存在多種不兼容的接口產(chǎn)生了應(yīng)用程序提供者、Portal 消費(fèi)者和Portal 服務(wù)器廠商之間的問(wèn)題。Java Community Process(JCP)定義的Java Portlet 規(guī)范(JSR 168)提供了 Portlet 和 Portal之間的互操作性的標(biāo)準(zhǔn)。它將及時(shí)解決這些問(wèn)題。
本文檔的目的是比較 JSR 168 和 WebSpherePortal V5.0 Portlet API,并且給出了一些示例。
重要:為了給顧客和合作伙伴提供一個(gè)方便的移植窗口,WebSphere Portal的下一個(gè)版本仍將支持 IBM Portlet API。
JSR168 簡(jiǎn)介
Java Standardization Request 168(JSR 168)定義了一個(gè)Portlet規(guī)范,包括 Portlet 容器和 portlet 之間的合約。JSR 168 是由Java Community Process(JCP)定義的。JSR 168 是由 IBM 和 Sun共同領(lǐng)導(dǎo)的,并且有一個(gè)很大的 Expect Group以幫助創(chuàng)建目前可用的最終版本。這個(gè)專家組由 Apache Software Foundation、Art Technology Group Inc.(ATG)、BEA、Boeing、Borland、Citrix Systems、Fujitsu、Hitachi、IBM、Novell、Oracle、SAP、SAS Institute、Sun、Sybase、Tibco和 Vignette 組成。關(guān)于這個(gè) JSR 的更多信息可以在 http://jcp.org/en/jsr/detail?id=168上找到。
重要:在本分析中提供的信息不承擔(dān)任何性質(zhì)的保證之責(zé)。本分析旨在為讀者提供一個(gè)指示性的工具。
JSR 168定義
這部分提供了基本的 JSR 168定義,目的是幫助您理解 JSR 168 如何融入整個(gè) Portal體系結(jié)構(gòu)中。
Portal 和 Portlet 容器
portal是一個(gè) Web應(yīng)用程序,它通常提供不同來(lái)源的個(gè)性化、單點(diǎn)登錄的內(nèi)容集合,并且托管不同后端系統(tǒng)的表示層。
Portal的主要任務(wù)是將不同的應(yīng)用程序集合到一個(gè)頁(yè)面,這個(gè)頁(yè)面的外觀是Portal 用戶共有的。Portal也可以有復(fù)雜的個(gè)性化特征,這些特征能夠給用戶提供自定義內(nèi)容。Portal頁(yè)可以有不同的 Portlet 集,以便為不同的用戶創(chuàng)建內(nèi)容。
圖1展示了 Portal 的體系結(jié)構(gòu),比如一個(gè)由 WebSphere Portal 提供服務(wù)的Portal??蛻舳苏?qǐng)求由 PortalWeb 應(yīng)用程序進(jìn)行處理,它為當(dāng)前用戶檢索當(dāng)前頁(yè)上的 Portlet。然后,Portal Web應(yīng)用程序?yàn)槊總€(gè) Portlet 調(diào)用 Portlet 容器來(lái)通過(guò) Container Invoker API 檢索它的內(nèi)容。Portlet 容器通過(guò) Portlet API 調(diào)用Portlet。Container Provider Service Provider Interface(SPI)允許 portlet 容器通過(guò)Portal 檢索信息。
圖 1. 基本的 Portal 體系結(jié)構(gòu)
Portlet 容器運(yùn)行 Portlet,給它們提供所需的運(yùn)行時(shí)環(huán)境,并且管理它們的生命周期。它為Portlet 首選項(xiàng)項(xiàng)提供持久性存儲(chǔ),這使得能夠?yàn)椴煌挠脩羯勺远x輸出。
Portal 頁(yè)和 Portlet
圖2展示了基本的 Portal 頁(yè)組件。Portal 頁(yè)表示一個(gè)完整的標(biāo)記文檔并且聚集若干 Portlet 窗口;也就是說(shuō),它將不同的應(yīng)用程序用戶界面組合到一個(gè)統(tǒng)一的表示中去。Portal 頁(yè)使用戶能夠通過(guò)登錄對(duì)話框向 Portal 驗(yàn)證自己的身份以便訪問(wèn)個(gè)性化的 Portal 視圖。大部分 Portal 頁(yè)包括一些導(dǎo)航機(jī)制以允許用戶導(dǎo)航到其他的 Portal 頁(yè)。
Portlet 窗口包括:
- 標(biāo)題欄,帶有 Portlet 的標(biāo)題
- 修飾,包括用于更改 Portlet 的窗口狀態(tài)的按鈕(比如最大化或最小化 Portlet)和用于更改 Portlet 的模式的按鈕(比如顯示幫助或編輯預(yù)定義的 Portlet 設(shè)置)
- 由 Portlet 產(chǎn)生的內(nèi)容(也稱為一個(gè)標(biāo)記段)。
圖 3在不同的瀏覽器上展示了一個(gè) Portlet 窗口。如您所見(jiàn),該 portlet 產(chǎn)生的標(biāo)記段并不局限于 HTML,而可以是任何標(biāo)記。
圖 3:在 HTML 瀏覽器(頂部)和 WML 瀏覽器(底部)中顯示的 Portlet
Portlet 生命周期
基本的 portlet 生命周期必須:
- 初始化,使用初始化類初始化 Portlet 并將其放入服務(wù)中。
- 處理請(qǐng)求,處理不同種類的動(dòng)作并呈現(xiàn)內(nèi)容。
- 完成,使用銷毀類除去 Portlet。
Portlet 基于用戶與 Portlet 或 Portal頁(yè)的交互來(lái)接收請(qǐng)求。請(qǐng)求處理分為兩個(gè)階段:
- 動(dòng)作處理
如果用戶單擊 Portlet上的鏈接,就會(huì)觸發(fā)動(dòng)作。動(dòng)作處理必須在頁(yè)面上的任何Portlet 呈現(xiàn)開(kāi)始之前結(jié)束。在動(dòng)作階段,Portlet可以改變 Portlet 的狀態(tài)。
- 呈現(xiàn)內(nèi)容
在呈現(xiàn)階段,Portlet 會(huì)產(chǎn)生要發(fā)送回客戶端的標(biāo)記。呈現(xiàn)不應(yīng)該改變?nèi)魏螤顟B(tài)。它允許一個(gè)頁(yè)面重新刷新而不需要改變Portlet 的狀態(tài)。一個(gè)頁(yè)面上的所有 Portlet的呈現(xiàn)都可以并行執(zhí)行。
圖 4描述從客戶端到 Portlet的請(qǐng)求流,并且更詳細(xì)地展示了動(dòng)作和呈現(xiàn)階段。在這個(gè)示例中,Portlet A接收了一個(gè)動(dòng)作。在該動(dòng)作執(zhí)行之后,頁(yè)面(A、B、C)上的所有Portlet 的呈現(xiàn)方法都被調(diào)用。
Portlet 模式
Portlet執(zhí)行不同的任務(wù)并根據(jù)它們的當(dāng)前函數(shù)來(lái)創(chuàng)建內(nèi)容。Portlet模式指示 Portlet 何時(shí)將執(zhí)行函數(shù)。Portlet模式指定 Portlet應(yīng)該執(zhí)行哪一類任務(wù)和應(yīng)該生成什么樣的內(nèi)容。當(dāng)調(diào)用 Portlet時(shí),Portlet 容器提供當(dāng)前對(duì) Portlet 的請(qǐng)求的模式。在處理動(dòng)作請(qǐng)求時(shí),Portlet可以程序化地改變它們的 Portlet 模式。
JSR 168 定義了三類 Portlet 模式:
- 必須支持的模式(語(yǔ)義同上)
- Edit
- 顯示一個(gè)或多個(gè)視圖以讓用戶自定義個(gè)性化的 Portletsettings.Help
- Help
- 顯示幫助視圖。
- View
- 顯示 Portlet 輸出。
- 可選擇的客戶模式
- About
- 顯示 Portlet 的目的、來(lái)源、版本和其他信息。
- Config
- 顯示一個(gè)或多個(gè)配置視圖以讓管理員配置對(duì)所有用戶有效的Portlet 設(shè)置。
- Edit_defaults
- 設(shè)置可修改的首選項(xiàng)的缺省值,這些首選項(xiàng)通??梢栽贓DIT 屏幕中進(jìn)行更改。
- Preview
- 呈現(xiàn)輸出而不需要后端連接或特定于用戶的可用數(shù)據(jù)。
- 顯示適于打印的視圖。
- 特定于 Portal 廠商的模式
這些模式只適用于特定的廠商Portal。
窗口狀態(tài)
窗口狀態(tài)是分配給 Portlet 生成的 Portal 頁(yè)面空間的指示器。Portlet容器提供當(dāng)前的窗口狀態(tài)給 Portlet,而 Portlet 通過(guò)窗口狀態(tài)來(lái)決定它應(yīng)該呈現(xiàn)多少信息。然而,在處理動(dòng)作請(qǐng)求時(shí),Portlet也可以程序化地改變它們的窗口狀態(tài)。
JSR 168 定義了如下窗口狀態(tài):
- Normal
- Portlet 與其他 Portlet共享空間,在產(chǎn)生它的輸出時(shí)應(yīng)該對(duì)考慮這種狀態(tài)。
- Maximized
- 與處于正常的窗口狀態(tài)相比,窗口有更真實(shí)的狀態(tài)來(lái)提供它的輸出。
- Minimized
- Portlet 應(yīng)該只呈現(xiàn)最小的輸出或沒(méi)有輸出。
除了這些窗口狀態(tài)之外,JSR 168 允許 Portal 定義自定義窗口狀態(tài)。
數(shù)據(jù)模式
JSR 168為 Portlet定義了不同的機(jī)制以訪問(wèn)瞬態(tài)數(shù)據(jù)和持久性數(shù)據(jù)。
Portlet 可以設(shè)置和獲取下列作用域內(nèi)的瞬態(tài)數(shù)據(jù):
請(qǐng)求 | 請(qǐng)求有附加的數(shù)據(jù),比如請(qǐng)求參數(shù)和屬性,與Servlet類似。請(qǐng)求可以包含一些特性,以允許進(jìn)行擴(kuò)展;也可以包含從Portal 傳送到 Portlet 的客戶端頭字段(反之亦然)。 |
會(huì)話 | Portlet可以將數(shù)據(jù)存儲(chǔ)在具有全局作用域的會(huì)話中,以讓 Web應(yīng)用程序中的其他組件訪問(wèn)這些數(shù)據(jù);也可以將數(shù)據(jù)存儲(chǔ)在Portlet作用域中,這個(gè)作用域是 Portlet 私有的。 |
上下文 | Portlet可以將數(shù)據(jù)存儲(chǔ)在 Web 應(yīng)用程序上下文中,與 Servlet類似。 |
Portlet 可以訪問(wèn)這些作用域內(nèi)的持久性數(shù)據(jù):
每個(gè) Portlet | Portlet可以將配置和個(gè)人數(shù)據(jù)存儲(chǔ)在 Portlet引用中,以允許 Portlet 創(chuàng)建個(gè)性化的輸出。Portlet可以定義允許用戶在編輯模式下更改那些數(shù)據(jù)(例如股票報(bào)價(jià))以及哪些數(shù)據(jù)是只能由管理員在配置模式下進(jìn)行更改的配置設(shè)置(例如股票報(bào)價(jià)服務(wù)器)。 |
每個(gè)用戶 | Portlet可以讀取用戶概要信息來(lái)針對(duì)用戶調(diào)整它的輸出(例如顯示用戶所在城市的天氣情況)。 |
Portlet 應(yīng)用程序
所有資源、Portlet 和配置描述符一起打包成一個(gè) Web應(yīng)用程序檔案文件(WAR)。有兩個(gè)配置描述符:
- 所有不是 Portlet 的 Web 應(yīng)用程序資源必須在 web.xml配置描述符中指定。
- 所有 Portlet 和 Portlet 相關(guān)的設(shè)置必須在 portlet.xmldeployment 描述符中指定。
比較 JSR 168 與 IBM Portlet API
這一部分大概地比較了 JSR 168 Portlet API 與 IBM Portlet API。首先講解了一些相似的概念,接著說(shuō)明了兩者之間的不同之處。
相似點(diǎn)
下列概念在 JSR 168和 IBM Portlet API 中是非常相似的。
特征 | 相似點(diǎn) | 不同點(diǎn) |
Portlet 模式 | 兩者都支持基本的 Portlet 模式:Edit、Help 和 View。 | 這種配置模式在 JSR 168中是可選的。IBM Portlet API 不支持其他可選的 JSR 168模式(About、Edit_defaults、Preview、Print)。 |
窗口狀態(tài) | 支持如下窗口狀態(tài):Maximized、Normal和 Minimized。 | Solo 窗口狀態(tài)只有 IBM Portlet API支持。 |
Portlet 生命周期 | 生命周期是相同的:初始化、處理請(qǐng)求、毀壞。 | 沒(méi)有 |
請(qǐng)求處理 | 請(qǐng)求處理分為處理用戶動(dòng)作的動(dòng)作階段和產(chǎn)生標(biāo)記的呈現(xiàn)階段。 | 沒(méi)有 |
URL 編碼 | 兩者都支持創(chuàng)建指向 Portlet或資源的 URL。 | 沒(méi)有 |
包含 Servlet/JSP | Servlet 和 JSP 可以包括在 Portlet中。 | 沒(méi)有 |
Portlet 會(huì)話 | Portlet可以存儲(chǔ)瞬態(tài)信息,這些信息應(yīng)該都在會(huì)話中的請(qǐng)求內(nèi)。 | 沒(méi)有 |
Portlet 應(yīng)用程序打包 | 兩者都通過(guò)附加的部署描述符(名為 portlet.xml )來(lái)將 Portlet 應(yīng)用程序打包成 WAR文件。 |
portlet.xml 格式有所不同。 |
基于到期時(shí)間的緩存 | Portlet可以支持基于到期時(shí)間的緩存。 | API使用不同的機(jī)制來(lái)實(shí)現(xiàn)這一功能。 IBM Portlet API使用輪詢機(jī)制,在這種機(jī)制中, Portal 查詢 Portlet以獲取標(biāo)記的有效時(shí)間,而在 JSR 168 中,Portlet可以將到期時(shí)間附加到創(chuàng)建的每個(gè)標(biāo)記上。在用戶之間共享緩存條目只有在IBM Portlet API 中才是可能的。 |
不同點(diǎn)
JSR168 和 IBM Portlet API 在以下幾個(gè)方面有所不同。
特征 | IBM Portlet API | JSR 168 |
Portlet 應(yīng)用程序?qū)嶓w | 使您可以通過(guò)部署描述符將抽象的Portlet 應(yīng)用程序及其不同的實(shí)例定義為具體的 Portlet應(yīng)用程序。這允許重用抽象的 Portlet應(yīng)用程序的設(shè)置,而只重寫(xiě)對(duì)于每個(gè)具體的 Portlet應(yīng)用程序惟一的部分。 | 該部署描述符緊跟在 web.xml 部署描述符之后,它定義一個(gè)應(yīng)用程序及其 Portlet定義。 |
Portlet 實(shí)體 | Web 部署描述符中的每個(gè) Portlet配置都有一個(gè) Portlet 對(duì)象實(shí)例。根據(jù) Flyweight模式,可以有許多 PortletSettings 對(duì)象來(lái)參數(shù)化相同的 Portlet對(duì)象(基于每個(gè)請(qǐng)求)。 PortletSettings 中的改變會(huì)應(yīng)用到這個(gè)具體的 Portlet 中的所有 Portlet實(shí)例。用戶也可以具體 Portlet的個(gè)人視圖,它是通過(guò)使用自定義輸出的 PortletData 呈現(xiàn)的。 |
PortletSettings 和 PortletData 合并成一個(gè)名為 PortletPreferences 的對(duì)象。 |
請(qǐng)求/響應(yīng)對(duì)象 | Portlet在呈現(xiàn)調(diào)用中接收到的請(qǐng)求/響應(yīng)對(duì)象與動(dòng)作調(diào)用接收到的相同。 | 在 JSR 168中,有兩個(gè)不同的對(duì)象。 |
JSR 168 獨(dú)有的特征
這些項(xiàng)只適用于 JSR 168。
特征 | 描述 |
呈現(xiàn)參數(shù) | 呈現(xiàn)參數(shù)允許 Portlet存儲(chǔ)它的導(dǎo)航狀態(tài)。 呈現(xiàn)參數(shù)在隨后的呈現(xiàn)請(qǐng)求中保持不變,而只是在Portlet接收到一個(gè)新的動(dòng)作時(shí)才發(fā)生改變。這啟用了書(shū)簽功能,并且解決了瀏覽器后退按鈕問(wèn)題。 |
全局 HttpSession 作用域 | Portlets 不僅可以存儲(chǔ)具有 Portlet可見(jiàn)性的數(shù)據(jù),而且可以存儲(chǔ)具有整個(gè) Web 應(yīng)用程序可見(jiàn)性的數(shù)據(jù)。 |
重定向 | Portlet可以重定向到動(dòng)作階段中的其他 Web 資源。 |
IBM Portlet API 獨(dú)有的特征
以下概念只適用于 IBM?Portlet API。
特征 | 描述 |
事件 | 事件可以在?Portlet之間發(fā)送。 |
附加的生命周期偵聽(tīng)器 | 除了動(dòng)作和呈現(xiàn)之外,生命周期偵聽(tīng)器(比如首頁(yè))也不適用于 JSR168 的第一個(gè)版本。 |
Portlet 菜單 | 讓 Portlet可以提供內(nèi)容到菜單欄,以便通過(guò) Portal頁(yè)使導(dǎo)航更加容易。 |
基于無(wú)效時(shí)間的緩存 | 讓 Portlet可以顯式使緩存的內(nèi)容無(wú)效。 |
示例 Portlet
這一部分展示一個(gè) HelloWorld Portlet,在兩個(gè) API的每一個(gè)中都有它的實(shí)現(xiàn)。其主要的不同之處突出顯示在第二個(gè)Portlet 中。
這兩個(gè)示例 Portlet 實(shí)現(xiàn)了相同的功能:
- 將 JSP 用于呈現(xiàn)輸出
- 根據(jù)特定于用戶的數(shù)據(jù)自定義 Portlet 輸出
- 處理動(dòng)作以允許用戶改變這些動(dòng)作
這個(gè)示例展示了一個(gè)個(gè)性化的 HelloWorld Portlet。它通過(guò)名稱識(shí)別用戶,并且允許用戶進(jìn)入編輯模式以設(shè)置一個(gè)新的名稱。在 action方法(在 IBM Portlet API 中稱為 actionPerformed
,而在 JSR 168中稱為 processAction
)中,Portlet持久化存儲(chǔ)用戶輸入的新用戶名。
首先看一看通過(guò) IBM Portlet API 實(shí)現(xiàn)的 Portlet。
|
現(xiàn)在,看一看已修改為使用 JSR 168 的同一 Portlet。更改過(guò)的文本用粗體標(biāo)記。
|
IBM Portlet API 版本的 Portlet 的主要區(qū)別在于:
- 請(qǐng)求分配器使用
JSR 168 和 IBM Portlet API之間的請(qǐng)求分配器使用略有不同。JSR 168使用相同的機(jī)制以從上下文中取得一個(gè)請(qǐng)求分配器作為 servlet API 的參數(shù)。JSR168使用相同的機(jī)制從帶有路徑的上下文中獲取請(qǐng)求分配器,以作為與Servlet API 一樣的參數(shù)。
- 持久性 Portlet 數(shù)據(jù)
JSR 168 的持久性數(shù)據(jù)
PortletPreferences
有一個(gè)類似于 JDK 1.4Preferences
的API,并且允許為 get方法指定缺省值。不再需要檢查零返回值并且顯式設(shè)置缺省值的代碼。JSR168 只允許 String 和 String 數(shù)組作為首選項(xiàng)的值;IBMPortlet API 可以支持任意對(duì)象。 - 動(dòng)作處理
在 JSR 168 中的動(dòng)作處理被簡(jiǎn)化,并且不需要?jiǎng)?chuàng)建特定的動(dòng)作對(duì)象被創(chuàng)建。自動(dòng)創(chuàng)建動(dòng)作 URL會(huì)觸發(fā)調(diào)用
processAction
方法。
結(jié)束語(yǔ)
由于 JSR 168 的定義,最終有了一個(gè)標(biāo)準(zhǔn)的 Portlet API,它提供獨(dú)立于 Portal 廠商的編程 Portlet,并且使您可以在不同的 Portal 上不加改變地運(yùn)行相同的 Portlet。
JSR 168 的概念與 IBM Portlet API 有密切的聯(lián)系。與 IBM Portlet API 相比,JSR 168的功能是有限的,因?yàn)樗?Portlet 規(guī)范的 第一個(gè)版本。熟悉 IBM Portlet API 的開(kāi)發(fā)人員應(yīng)該能夠毫無(wú)困難地盡快學(xué)會(huì)使用JSR 168 API。
- Java Portlet Specification JSR 168
- Java Community Process
- Web Services for Remote Portlets Specification
- Portlet API Javadoc for WebSphere Portal 5.0