Apache Pluto 是 Java? 開發(fā)人員可以自由使用的工具,用來測(cè)試他們的 portlets 是否遵循 JSR 168 Portlet 規(guī)范。開發(fā)人員 Mark Talbot 和 Kulvir Singh Bhogal 帶領(lǐng)您學(xué)習(xí) portlet 測(cè)試。您將安裝 Pluto,構(gòu)建、編譯和打包一個(gè)簡(jiǎn)單的 portlet,并將它部署到 Pluto 以測(cè)試它的 JSR 168 兼容性。您還將了解到 Portlet 規(guī)范的下一個(gè)版本將保留哪些內(nèi)容。
2003 年 10 月,Java Community Process 發(fā)布了 Java Specification Request (JSR) 168的最終版本:Portlet Specification(參見 參考資料)。JSR 168 闡述的是第一個(gè) Java portlet 開發(fā)的編程標(biāo)準(zhǔn)。以前,為 WebSphere Portal Server 開發(fā)的 portlet 不能在另外的 portlet 容器(例如 BEA WebLogic Portal)中運(yùn)行。Portlet 容器不是 J2EE 應(yīng)用服務(wù)器所必需的組件。然而,這種可移植性的缺少是與標(biāo)準(zhǔn) J2EE 企業(yè)級(jí)應(yīng)用程序相背離的,標(biāo)準(zhǔn) J2EE 企業(yè)級(jí)應(yīng)用程序(當(dāng)根據(jù)規(guī)范構(gòu)建時(shí))可以部署到任何與 J2EE 兼容的應(yīng)用服務(wù)器中。缺少 portlet 可移植性和相關(guān)廠商的鎖定阻止企業(yè)購買門戶服務(wù)器。通過結(jié)束 portlet 開發(fā)的混亂狀態(tài),JSR 168 平息了那些企業(yè)的擔(dān)憂。
|
JSR 168 Portlet API 是相當(dāng)廣泛的。本文不打算成為 JSR 168 的教程,因此我們將不去深入鉆研這些 API。如果您不熟悉 JSR 168 API, 建議您花一些時(shí)間去熟悉 參考資料 中的一些材料。 |
|
Java 開發(fā)人員具有一個(gè)可以自由獲得的工具,用來測(cè)試他們編寫的 portlets 是否與 Portlet 規(guī)范相一致。Apache Pluto 是 JSR 168 的參考實(shí)現(xiàn),是實(shí)現(xiàn)了 Portlet API 的 portlet 容器。像 Pluto 和 IBM WebSphere Portal Server 這樣的 portlet 容器充當(dāng) portlets 的運(yùn)行時(shí)環(huán)境,與 web 應(yīng)用服務(wù)器的 servlet 容器的運(yùn)行時(shí)環(huán)境支持 servlet 的情形非常相似。但是,portlet 容器不是獨(dú)立的,它存在于 servlet 容器的頂部并依賴于它的服務(wù)。在本文中,我們將為您演示如何編寫簡(jiǎn)單的 portlet 并使用 Pluto portlet 容器測(cè)試它。
安裝 Pluto
Apache Pluto 需要 Java SE 5。如果您還沒有安裝此版本的 JDK,下載并安裝它以繼續(xù)進(jìn)行本文的練習(xí)(參見 參考資料)。
|
如果 JAVA_HOME 已經(jīng)設(shè)置為在您的系統(tǒng)上安裝的先前版本的 JVM, 更改它會(huì)使已有的依賴 JVM 的應(yīng)用程序崩潰。如果已經(jīng)安裝了老版本的 JVM,您應(yīng)該直接在 Pluto 啟動(dòng)腳本中更新 JAVA_HOME 變量: Windows 系統(tǒng)上的 startup.bat 或者 Linux 上的 startup.sh。
|
|
接下來,需要設(shè)置和更改 JAVA_HOME
環(huán)境變量,Pluto 引用它來查找 JVM(默認(rèn)情況下,Sun 的安裝程序不設(shè)置 JAVA_HOME
的值)。如果在系統(tǒng)上沒有安裝以前版本的 JVM,則執(zhí)行以下步驟(這些說明假定您運(yùn)行的是 windows):
- 右擊我的電腦,并從上下文菜單選擇屬性。
- 單擊高級(jí)選項(xiàng)卡。
- 在窗口的底部,單擊環(huán)境變量按鈕。
- 在系統(tǒng)變量窗格中,單擊新建。
- 為變量名輸入
JAVA_HOME
。為變量值輸入 Sun JVM 的安裝目錄。
圖 1 展示了選擇把 Java 5.0 SDK 安裝到 C:\Program Files\IBM\Java50 目錄下時(shí) JAVA_HOME
的值:
圖 1. 更改 JAVA_HOME 環(huán)境變量
現(xiàn)在已經(jīng)正確地設(shè)置了 Java 環(huán)境,就來從 Apache 的 Web 站點(diǎn)(參見 參考資料)下載包含 Pluto 的二進(jìn)制內(nèi)容的 ZIPet 文件(pluto-current.zip)。
驗(yàn)證下載文件
假定您和我們的安全意識(shí)一樣強(qiáng),就會(huì)希望保證下載的 ZIP 文件確實(shí)來自 Apache Software Foundation。文件使用 PGP 和 MD5 進(jìn)行了數(shù)字簽名。使用 GnuPG(參見 參考資料)和 ASCII armor 文件(pluto-current.zip.asc),可以驗(yàn)證此下載文件的真實(shí)性。
首先,通過輸入清單 1 頂部一行所示的命令,把 Apache Pluto 的公共密鑰添加到您的公共密鑰環(huán)。在 Pluto 下載頁面可以獲得 KEYS 文件。
清單 1. 導(dǎo)入 KEYS 文件
C:\>gpg --import KEYS
gpg: key E41EDC7E: public key "Carsten Ziegeler <cziegeler@apache.org>" importe
gpg: key 320B4FB4: public key "Nick Lothian (Apache) <nlothian@apache.org>" imp
rted
gpg: key DD4200EA: public key "David H. DeWolf <david@daviddewolf.com>" importe
gpg: Total number processed: 3
gpg: imported: 3
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u
gpg: next trustdb check due at 2011-03-08
|
接下來,輸入清單 2 頂部一行所示的命令來驗(yàn)證您從 Apache 接收的已簽名的 ZIP 文件:
清單 2. 驗(yàn)證 pluto-1.0.1.zip.asc
C:\>gpg --verify pluto-1.0.1.zip.asc
gpg: Signature made 10/19/05 09:11:31 using DSA key ID DD4200EA
gpg: Good signature from "David H. DeWolf <david@daviddewolf.com>"
gpg: aka "David H. DeWolf <ddewolf@apache.org>"
gpg: aka "David H. DeWolf <ddewolf@rocketmail.com>"
gpg: aka "David H. DeWolf <ddewolf@gmail.com>"
gpg: aka "David H. DeWolf <david.dewolf@digitalfocus.com>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg: There is no indication that the signature belongs to the owner.
Primary key fingerprint: 6AA5 5850 9A7B 275C E0BC 2851 B217 63FA DD42 00EA
|
如果 gpg --verify
命令生成的輸出與清單 2 顯示的相似,就可以確信 Pluto 歸檔文件確實(shí)來自 Apache??梢院雎员砻骱灻豢尚诺木?。保證公共密鑰簽名來自所有者的惟一方法是,密鑰的所有者親自把磁盤上的密鑰交給您。但是,采取這些步驟以后,可以在某種程度上確定從 Apache 下載的 ZIP 文件是不用懷疑的。(有關(guān)驗(yàn)證 Apache 下載文件的更多信息,請(qǐng)參見 參考資料 。)
解壓 Pluto 下載文件
現(xiàn)在準(zhǔn)備把 ZIP 文件解壓到您的機(jī)器上。我們假定您把 Pluto 解壓到 C:\ 盤的根目錄上:
C:\>unzip pluto-current.zip
|
這就創(chuàng)建了一個(gè)包含 bin 子目錄的 C:\pluto-1.0.1 目錄。導(dǎo)航到 bin 子目錄并在命令提示符下輸入 startup.bat
以啟動(dòng) Pluto 服務(wù)器。
如圖 2 所示,您可以從 Pluto 主頁管理和查看 portlets。啟動(dòng) Web 瀏覽器并導(dǎo)航到 http://localhost:8080/pluto/portal。
圖 2. Pluto 主頁
注意:如果 Pluto 主頁沒有出現(xiàn),請(qǐng)確保防火墻沒有阻止 Pluto 接受連接。
現(xiàn)在已經(jīng)啟動(dòng)和運(yùn)行 Pluto,您將創(chuàng)建一個(gè)簡(jiǎn)單的 portlet,然后使用 Pluto 測(cè)試它的 JSR 168 兼容性。
開發(fā) JSR 168 portlet
為了查看如何使用 Pluto 作為 portlet 的 JSR 168 兼容性測(cè)試平臺(tái),需要一個(gè) portlet 來進(jìn)行測(cè)試。在此練習(xí)中,您將創(chuàng)建一個(gè)簡(jiǎn)單的 portlet,它根據(jù)用戶的輸入,把文本框中的內(nèi)容轉(zhuǎn)換為全是大寫字符或全是小寫字符(見圖 3):
圖 3. Change Case portlet
我們從查看清單 3 所示的 portlet.xml 文件開始。portlet.xml 文件是包含關(guān)于 WAR 文件中捆綁的 portlet 的配置細(xì)節(jié)的描述符文件。
清單 3. portlet.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<portlet-app xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"
version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd
http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"
id="com.ibm.changecase.ChangeCasePortlet">
<portlet>
<portlet-name>ChangeCase</portlet-name>
<display-name>Change Case Portlet</display-name>
<portlet-class>com.ibm.changecase.ChangeCasePortlet</portlet-class>
<supports>
<mime-type>text/html</mime-type>
<portlet-mode>view</portlet-mode>
</supports>
<portlet-info>
<title>ChangeCasePortlet</title>
</portlet-info>
</portlet>
</portlet-app>
|
清單 3 中的 <portlet-app>
標(biāo)記定義了 XML 模式定義和 portlet 應(yīng)用程序 的 ID。一個(gè) portlet 應(yīng)用程序可以包含零個(gè)或多個(gè) portlet。使用 <portlet>
標(biāo)記來定義 portlet 應(yīng)用程序中的單個(gè) portlet:
-
<portlet-name>
—— 提供一個(gè)名稱,在內(nèi)部或由程序使用該名稱來引用 portlet。
-
<display-name>
—— portlet 的縮寫名,用來在 GUI 工具中顯示 portlet 名稱,它隨 portlet 容器的不同而不同。
-
<portlet-class>
—— 充當(dāng) portlet 控制器的類。
-
<supports>
—— 這些標(biāo)記定義 portlet 支持的 portlet 模式和 mime 類型。
-
<title>
—— 可以在 portlet.xml 中定義 portlet 的首選標(biāo)題。但是,如何使用該標(biāo)題取決于 portlet 容器。
清單 4 顯示的是 portlet.xml 中引用的 com.ibm.changecase.ChangeCasePortlet
portlet 類。此類必須實(shí)現(xiàn) javax.portlet.Portlet
接口,但幸運(yùn)的是,您不必直接實(shí)現(xiàn) Portlet
接口。JSR 168 為 javax.portlet.Portlet
接口定義了一個(gè)稱為 javax.portlet.GenericPortlet
類的默認(rèn)實(shí)現(xiàn)。com.ibm.changecase.ChangeCasePortlet
類繼承 GenericPortlet
類。
清單 4. ChangeCasePortlet 類
package com.ibm.changecase;
import java.io.*;
import javax.portlet.*;
/**
*
* A sample portlet based on GenericPortlet
*
*/
public class ChangeCasePortlet extends GenericPortlet {
private static String VIEW_JSP = "/view.jsp";
protected void doView(RenderRequest request, RenderResponse response)
throws PortletException, IOException {
response.setContentType(request.getResponseContentType());
PortletContext context = getPortletConfig().getPortletContext();
context.getRequestDispatcher(VIEW_JSP).include(request, response);
}
public void processAction(ActionRequest request, ActionResponse response)
throws PortletException, java.io.IOException {
//Do Action Handling here.
}
}
|
注意重寫 doView()
和 processAction()
方法的選擇。每當(dāng)出現(xiàn) portlet 操作時(shí)都會(huì)調(diào)用 processAction()
方法。當(dāng)用戶處于 portlet 的視圖模式時(shí)調(diào)用 doView()
方法。JSR 168 支持其他的模式,例如幫助模式和編輯模式。但是,如果回過頭看一下 清單 3,在 <supports>
部分可以看到 portlet 只支持視圖模式。
現(xiàn)在仔細(xì)地看一下清單 4 中的 doView()
方法。與 Java servlet 編碼中一樣,portlet 編碼中也經(jīng)常使用模型-視圖-控制器 (MVC) 設(shè)計(jì)模式。因此,在 portlet 中,把表示的職責(zé)轉(zhuǎn)交給了 view.jsp?;蛘?,也可以使用 prinltn
邏輯在 doView()
方法中實(shí)現(xiàn)視圖。
response.getWriter().println("<p>Hello World</p>()");
|
這種方法的問題是,圖形用戶界面的設(shè)計(jì)者需要具有 portlet 技術(shù)的知識(shí)來編寫 doView()
方法。JSP 開發(fā)人員從復(fù)雜的 Java 開發(fā)中解放出來,能夠集中精力開發(fā)前端界面。清單 5 顯示的是 view.jsp:
清單 5. view.jsp
<%@ taglib uri="http://java.sun.com/portlet" prefix="portlet"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1" session="false"%>
<portlet:defineObjects />
<%String textBox = renderRequest.getParameter("textBox");
if (textBox == null)
textBox = "";
String caseString = renderRequest.getParameter("case");
boolean isUpperCase = true;
if ((caseString != null) && (caseString.equals("false"))) {
isUpperCase = false;
}
String errorMessage = renderRequest.getParameter("errorMessage");%>
<%if (errorMessage != null) {%>
<p><%=errorMessage%></p>
<%}%>
<FORM name="<portlet:namespace/>caseform" action="<portlet:actionURL/>">
<INPUT type="text" name="textBox" size="20" value="<%=textBox%>">
<p><INPUT type="radio" name="case" value="lowercase"
<%if (!isUpperCase) {%> checked="checked" <%}%>>To Lowercase</p>
<p><INPUT type="radio" name="case" value="uppercase"
<%if (isUpperCase) {%> checked="checked" <%}%>>To Uppercase</p>
<INPUT type="submit" name="<portlet:namespace/>submitCase"
value="Change Case"></FORM>
|
首先,注意在 view.jsp 中定義 portlet 標(biāo)記庫。這是 JSP 解析器識(shí)別 portlet 標(biāo)記所必需的。您使用的第一個(gè) portlet 標(biāo)記是 <portlet:defineObjects/>
。此標(biāo)記允許訪問 renderRequest
、renderResponse
和 portletConfig
對(duì)象。使用 renderRequest
對(duì)象使您具有訪問 requestParameters
的權(quán)利。portlet 類通過 request 參數(shù)向 view JSP 傳遞值。
接下來,在 view.jsp 中創(chuàng)建一個(gè)向 portlet 類發(fā)送表單數(shù)據(jù)的表單。為了發(fā)送表單數(shù)據(jù),必須創(chuàng)建一個(gè) actionURL
,它使 ChangeCasePortlet
portlet 類的 processAction()
方法被調(diào)用。使用 <portlet:actionURL/>
標(biāo)記創(chuàng)建 actionURL
。 注意,在 view.jsp 中將文本框和單選按鈕的值設(shè)置為服務(wù)器傳回 JSP 的值。因此,view.jsp 負(fù)責(zé)處理請(qǐng)求輸入和顯示 portlet 的響應(yīng)。
單擊表單的 Submit 按鈕會(huì)調(diào)用 portlet 的 processAction()
方法,如清單 6 所示。processAction()
從 view.jsp 接收一個(gè) ActionRequest
對(duì)象作為輸入。
清單 6. processAction 方法
public void processAction(ActionRequest request, ActionResponse response)
throws PortletException, java.io.IOException {
String newCase = request.getParameter("case");
String textBox = request.getParameter("textBox");
String errorMessage = null;
boolean isUpperCase = true;
if ((newCase!=null) && (newCase.equals(ChangeCaseConstants.LOWER_CASE)))
isUpperCase = false;
else if ((newCase == null) || (newCase==ChangeCaseConstants.UPPER_CASE))
errorMessage = "Error no case selected! Select a case.";
if (textBox !=null) {
if (isUpperCase)
textBox = textBox.toUpperCase();
else
textBox = textBox.toLowerCase();
response.setRenderParameter("textBox", textBox);
} else
errorMessage = "Error, text in the text box is invalid";
response.setRenderParameter("case", Boolean.toString(isUpperCase));
if (errorMessage != null) {
response.setRenderParameter("errorMessage",errorMessage);
}
}
|
ActionRequest
對(duì)象包含輸入到表單中的數(shù)據(jù)。為了檢索表單數(shù)據(jù),可使用 getParameter()
方法。在 processAction()
方法中,也要執(zhí)行業(yè)務(wù)邏輯,確定用戶是想要大寫形式還是小寫形式的輸出。根據(jù)該邏輯,把輸入的文本轉(zhuǎn)換成想要的大小寫形式并發(fā)送給用戶。使用 setRenderParameter()
方法把數(shù)據(jù)發(fā)送給視圖。
編譯并打包 JSR 168 portlet
現(xiàn)在已經(jīng)開發(fā)了 portlet,需要把它轉(zhuǎn)換成已編譯的形式,并為了部署到 Pluto 將它打包。首先,確保 portlet-api-1.0.jar 在 CLASSPATH
中。然后使用 javac 編譯器編譯 ChangeCaseConstants.java 和 ChangeCasePortlet.java:
javac ChangeCaseConstants.java
javac ChangeCasePortlet.java
|
接著需要為 WAR 文件創(chuàng)建所需要的文件夾結(jié)構(gòu),WAR 文件是歸檔文件,通過它把 portlet 部署到 portlet 容器。把剛才編譯的兩個(gè)類放在 classes\com\ibm\changecase 目錄中。
為了構(gòu)建 WAR 文件,需要以下的目錄結(jié)構(gòu),如清單 7 所示:
清單 7. 用于部署的目錄結(jié)構(gòu)
changeCaseWAR\
META-INF
MANIFEST.MF
WEB-INF
classes
com
ibm
changecase
ChangeCaseConstants.class
ChangeCasePortlet.class
lib
tld
portlet.tld
portlet.xml
web.xml
index.html
view.jsp
|
注意,清單 7 引入了 4 個(gè)我們還沒有討論過的文件:
-
portlet.tld:這是 portlet 標(biāo)記庫。如果回想一下,您曾經(jīng)用
<portlet:defineObjects />
之類的引用在整個(gè) JSP 中都用到過 portlet 標(biāo)記庫。portlet 標(biāo)記庫在 Apache-SVN 代碼庫中可以得到(參見 參考資料)。
-
MANIFEST.MF:因?yàn)檫@里不存在外部依賴,所以這個(gè)清單文件除了 Manifest-Version: 1.0 之外什么也不包含。
-
index.html:如果由于某些原因上下文根被直接訪問,則會(huì)顯示 index.html。在 index.html 中可以有任何正確格式的 HTML。
-
web.xml(如清單 8 所示):它定義包含單個(gè) portlet 的 Web 應(yīng)用程序。
清單 8. web.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app id="WebApp_ID">
<display-name>CasePortlet</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<taglib>
<taglib-uri>http://java.sun.com/portlet</taglib-uri>
<taglib-location>tld/portlet.tld</taglib-location>
</taglib>
<taglib id="PortletTLD">
<taglib-uri>http://java.sun.com/portlet</taglib-uri>
<taglib-location>/WEB-INF/tld/std-portlet.tld</taglib-location>
</taglib>
</web-app>
|
一旦生成了 MANIFEST.MF、portlet.tld、web.xml 和 index.html,就可以使用 JAR 實(shí)用工具將清單 7 所示的結(jié)構(gòu)歸檔到一個(gè) WAR 文件中:
C:\temp>jar -cvf changeCase.war
|
結(jié)果是一個(gè)叫做 changeCase.war 文件,用于部署到 JSR 168 兼容的門戶。
確保 portlet 是 JSR 168 兼容的
現(xiàn)在使用 Apache Pluto 來查明 portlet 是否能通過 JSR168 兼容性的最終測(cè)試。
確保 Apache Pluto 啟動(dòng)并運(yùn)行,然后導(dǎo)航到 Pluto 主頁(http://localhost:8080/pluto/portal)。單擊側(cè)欄上的 Admin。應(yīng)該看到 Deploy War portlet 顯示在管理頁面上,如圖 4 所示。單擊 Browse 并導(dǎo)航到在前一節(jié)中放置在一起的 changeCase.war 文件的位置,然后單擊 Submit。
圖 4. Pluto 的 Deploy War portlet
現(xiàn)在必須為 portlet 應(yīng)用程序輸入布局信息 —— 一個(gè)非常不重要的任務(wù),因?yàn)樵?portlet 應(yīng)用程序中只有一個(gè) portlet。正如在圖 5 中可以看到的,您告知 Pluto portlet 有一行和一列,然后單擊 Submit 向服務(wù)器提交此選擇:
圖 5.為 portlet 應(yīng)用程序輸入頁面布局信息
接下來,必須定義 portlet 出現(xiàn)在 portlet 應(yīng)用程序頁面布局的何處。通過把 portlet 應(yīng)用程序中的所有 portlet 映射到剛才定義的行和列來完成此任務(wù)。因?yàn)橹挥幸粋€(gè) portlet 需要部署并且您先前選擇了一行和一列的頁面布局,所以在該位置輸入 ChangeCase portlet 并單擊 Submit,如圖 6 所示:
圖 6. 映射 portlet 的位置
為了部署 portlet,您可以選擇重新啟動(dòng) Pluto 或者熱部署 包含 portlet 的 portlet 應(yīng)用程序,如圖 7 所示:
圖 7. 熱部署 portlet
一個(gè)具有 portlet 應(yīng)用程序名稱(Change Case)的鏈接出現(xiàn)在側(cè)欄。單擊該超鏈接,現(xiàn)在將看到 portlet 應(yīng)用程序,其中包含 portlet,如圖 8 所示。這時(shí)應(yīng)該與 Change Case portlet 交互并確保它的功能與預(yù)期的一樣。如果與預(yù)期的一樣,您就可以確定此 portlet 與 JSR 168 兼容。
圖 8. 部署到 Pluto 的 Change Case portlet
Change Case Portlet 將能夠運(yùn)行在任何支持 JSR 168 portlet 標(biāo)準(zhǔn)的 Portlet 容器中。
結(jié)束語
|
我可以在生產(chǎn)環(huán)境中使用 Pluto 嗎?
Apache Pluto 只適合作為 JSR 168 兼容性的測(cè)試平臺(tái),不推薦在生產(chǎn)環(huán)境中使用。對(duì)于生產(chǎn)來說,您應(yīng)該考慮使用更加可伸縮的容器。您可以考慮使用 Apache Software Foundation 的名為 Jetspeed 的開放源碼 portlet 容器(參見 參考資料)。IBM 的 WebSphere Portal Server Version 5.1 也是一個(gè)支持 JSR 168 標(biāo)準(zhǔn)的商業(yè)解決方案(參見 參考資料)。
|
|
Apache Pluto 使 portlet 開發(fā)人員能夠確定他們的 portlet 能夠運(yùn)行在任何 JSR 168 兼容的 portlet 容器中。大多數(shù) portlet 容器(包括 WebSphere Portal Server)都包括 Portlet 規(guī)范未提及的擴(kuò)展。例如,IBM WebSphere Portal Server 提供非標(biāo)準(zhǔn)的一點(diǎn)即動(dòng)(click-to-action)擴(kuò)展(即協(xié)作 portlet)。是否使用擴(kuò)展由使用 portal 技術(shù)的企業(yè)來決定。作為開發(fā)人員,您應(yīng)該牢記的是支持這種技術(shù)會(huì)損害 portlet 的可移植性 —— 但是有時(shí)這么做能滿足業(yè)務(wù)需要。Apache Pluto 使那些使用 portlet 的組織能夠知道他們偏離了 Portlet 規(guī)范有多遠(yuǎn),并決定是否采取一些措施來調(diào)整那些 portlet 符合標(biāo)準(zhǔn)。
展望未來:JSR 286
JSR 168 在走向使 portal 領(lǐng)域有序的過程經(jīng)過了很長的路。但是,portlet 的標(biāo)準(zhǔn)化工作并沒有停止。當(dāng)寫作本文的時(shí)候,Java Portlet API version 2.0 規(guī)范 (JSR 286) 仍舊在開發(fā)中,打算把對(duì) J2EE 1.4 的支持引入到 portlet 規(guī)范中(參見 參考資料)。許多曾由供應(yīng)商利用其自有實(shí)現(xiàn)通過非標(biāo)準(zhǔn)方式處理的 Portlet 技術(shù)(提一下其中的兩個(gè),portlet 過濾器和形式化的 portlet 間通信)現(xiàn)將采納 2.0 規(guī)范。Apache Pluto 的將來版本將充當(dāng) JSR 286 規(guī)范的參考實(shí)現(xiàn)。當(dāng) JSR 286 成為事實(shí)上的 portlet 標(biāo)準(zhǔn)時(shí),您將仍舊能夠使用 Pluto 測(cè)試兼容性。
在我們寫作本文時(shí),還不能得到 Pluto 1.1 的 alpha 版本。Pluto 1.1 將具有一個(gè)新的容器架構(gòu),并包含一些使 portlet 開發(fā)更容易的更改。但是,Pluto 1.0.1 仍然是一個(gè)很好的用于驗(yàn)證 portlet 是否 JSR 168 兼容的工具。
參考資料
學(xué)習(xí)
獲得產(chǎn)品和技術(shù)
posted on 2006-05-28 09:03
KingWell 閱讀(240)
評(píng)論(0) 編輯 收藏 所屬分類:
Web Service