引言
經(jīng)常有人問我這個問題:“如果從頭開始的話,人們能夠通過 WebSphere Portal Version 5 創(chuàng)建的最簡單的 portlet是什么?”。固定不變的答案是“hello world”。本文將花較長的篇幅來詳細(xì)回答這個問題。我準(zhǔn)備帶您了解如何創(chuàng)建 WebSphere PortalV5 的最簡單的 protlet。您將從一些 Java 代碼開始,接著對其進(jìn)行編譯,然后打包。接下來,您將創(chuàng)建把有關(guān) portlet的信息告訴應(yīng)用程序服務(wù)器和門戶網(wǎng)站所需的部署描述符。最后,我們將其打包在一起,并將新的 portlet 部署到門戶網(wǎng)站內(nèi)。
創(chuàng)建目錄結(jié)構(gòu)
首先創(chuàng)建一個目錄結(jié)構(gòu),您將在這個目錄結(jié)構(gòu)中創(chuàng)建 portlet。下面是我將用于這個簡單的 portlet 的目錄結(jié)構(gòu):
helloWorld\com\ibm\portlets\sample
-- 存放源代碼的位置 helloWorld\WEB-INF
-- 部署描述符所在的位置 helloWorld\WEB-INF\lib
-- JAR 文件存放的位置
創(chuàng)建 Java文件
sample 目錄是您將存放 Java 源代碼的位置。在 sample 目錄中創(chuàng)建一個名為 HelloWorld.java
的文件,然后用您喜歡的文本編輯器打開該文件。下面是您需要輸入(或者復(fù)制、粘貼)到 HelloWorld.java
文件中的類:
package com.ibm.portlets.sample; //portlet APIs import org.apache.jetspeed.portlet.*; //Java stuff import java.io.*; public class HelloWorld extends PortletAdapter { public void service(PortletRequest request, PortletResponse response) throws PortletException, IOException { PrintWriter writer = response.getWriter(); writer.println(" hello, world"); } }
|
編譯代碼
一旦您已經(jīng)創(chuàng)建好了源文件,就可以對 Java 代碼進(jìn)行編譯了。在一個批處理文件中可以使用下面的腳本來編譯 portlet。您首先定義一些環(huán)境變量(例如,Java 主目錄的位置)。用 WebSphere Application Server 附帶的 JDK對此進(jìn)行編譯通常是一個好主意,因為這是您將要運行應(yīng)用程序的環(huán)境。您還要設(shè)置 PATH 以便訪問 Java 編譯器。此外還需要將變量LIBPATH 設(shè)置為指向 WebSphere JAR 文件所在的目錄。
接下來,您為我們的編譯類路徑構(gòu)建一個名為 CP 的變量。CP變量可以構(gòu)建在一行上,但是為了說明所需的不同 JAR 文件,我們將其拆開分行顯示。然后,您調(diào)用 Java 編譯器來對代碼進(jìn)行編譯。這假定您位于helloWorld 目錄下。請將目錄路徑調(diào)整為適合安裝的路徑。
set JAVA_HOME=C:\WebSphere\AppServer\java set PATH=%JAVA_HOME%\bin set LIBPATH=C:\WebSphere\AppServer\lib set CP=. set CP=%CP%;%LIBPATH%\j2ee.jar set CP=%CP%;%LIBPATH%\dynacache.jar set CP=%CP%;C:\WebSphere\PortalServer\shared\app\portlet-api.jar javac -classpath %CP% com\ibm\portlets\sample\HelloWorld.java
|
如果由于某些原因這不能編譯,您必須在往下繼續(xù)之前修正錯誤。一些常見的錯誤是:
- 輸入錯誤 -- 類名稱、路徑、變量名稱輸入錯誤
- 文件名稱 -- 文件名稱必須和類名稱匹配。在我們的例子中,文件名是
HelloWorld.java
,類名稱是 HelloWorld
。如果您已經(jīng)改變了一個名稱,另一個名稱也要改變。 - 編輯器錯誤 --確定編輯器確實將文件存儲為文本。像寫字板這樣的編輯器,不會將文件默認(rèn)存儲為文本。
創(chuàng)建 JAR 文件
在完成了 Java 源文件的編譯以后,您就需要在 WEB-INF\lib
目錄下創(chuàng)建一個 JAR 文件。再次假設(shè)您位于 helloWorld
目錄下。如果您在 編譯代碼一節(jié)創(chuàng)建了一個批處理文件,就可以將這些語句作為該文件的一部分包含在其中。這取決于您已經(jīng)將 PATH 設(shè)置為指向 jar
程序。
set JAVA_HOME=C:\WebSphere\AppServer\java set PATH=%JAVA_HOME%\bin jar -cv0f .\WEB-INF\lib\HelloWorld.jar com/ibm/portlets/sample/*.class
|
創(chuàng)建部署描述符
現(xiàn)在,您需要創(chuàng)建兩個 XML 文件:
helloWorld/WEB-INF/web.xml
— Web 部署描述符。 helloWorld/WEB-INF/portlet.xml
— portlet 部署描述符。
web.xml— Web 部署描述符
Web 部署描述符是 WebSphere Portal 所需要的?,F(xiàn)在 Portlet 擴(kuò)展了 Servlet,所以需要使用 Web 部署描述符來聲明 Servlet(portlet)類。
<?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="HelloWorldWebApp"> <display-name>HelloWorldPortlet< /display-name> <servlet id="Servlet_1"> <servlet-name>HelloWorld< /servlet-name> <servlet-class>com.ibm.portlets.sample.HelloWorld< /servlet-class> </servlet> <servlet-mapping id= "ServletMapping_1"> <servlet-name>HelloWorld< /servlet-name> <url-pattern>/HelloWorld/*< /url-pattern> </servlet-mapping> </web-app>
|
portlet.xml— portlet 部署描述符
portlet 部署描述符向門戶網(wǎng)站定義 portlet。每個 portlet 通過 portlet
元素的 href
屬性映射到 Web 部署描述符中定義的一個 Servlet 上。以 粗體表示這些引用。portlet必須定義一個惟一的 id,每個具體的 portlet 都能引用該 id。每個具體的 portlet 使用 concrete-portlet
元素的 href
屬性的特定 id 來引用 portlet。以藍(lán)色表示這些引用。
<?xml version= "1.0" encoding= "UTF-8"?> <!DOCTYPE portlet-app-def PUBLIC "-//IBM//DTD Portlet Application 1.1//EN" "portlet_1.1.dtd"> <portlet-app-def> <portlet-app uid= "com.ibm.portlets.sample.HelloWorld.1" major-version="1" minor-version="0"> <portlet-app-name>HelloWorld0Portlet< /portlet-app-name> <portlet href= "WEB-INF/web.xml#Servlet_1"id="Portlet_1" major-verion="1" minor-verion="0"> <portlet-name>HelloWorld< /portlet-name> <cache> <expires>0< /expires> <shared>no< /shared> </cache> <allows> <maximized/> <minimized/> </allows> <supports> <markup name= "html"> <view/> </markup> </supports> </portlet> </portlet-app> <concrete-portlet-app uid= "com.ibm.portlets.sample.HelloWorld.1.2"> <portlet-app-name>Concrete HelloWorld< /portlet-app-name> <context-param> <param-name>Author< /param-name> <param-value>tcat@us.ibm.com< /param-value> </context-param> <concrete-portlet href="#Portlet_1"> <portlet-name>HelloWorld< /portlet-name> <default-locale>en< /default-locale> <language locale= "en"> <title>Hello World</title> <title-short></title-short> <description></description> <keywords></keywords> </language> </concrete-portlet> </concrete-portlet-app> </portlet-app-def>
|
創(chuàng)建這些 XML文件時,許多地方會出錯。只有在您試圖將 portlet 部署到門戶網(wǎng)站時才會發(fā)現(xiàn)這些錯誤。這里有一些需要特別注意的地方:
- 檢查每一個 XML 元素,確保它們都有一個閉元素。
- 檢查類名是否輸入錯誤,對于本例來講,檢查您給類起的名稱是否是
HelloWorld
。 - 確保 id 和 href 相匹配。
- 確保編輯器確實將文件保存成文本。
創(chuàng)建 WAR 文件
最后,我們就可以創(chuàng)建供分發(fā)的 WAR文件了。我們將使用標(biāo)準(zhǔn) jar
命令來構(gòu)建 WAR 文件。在 helloWorld
目錄下運行以下命令:
set JAVA_HOME=C:\WebSphere\AppServer\java set PATH=%JAVA_HOME%\bin jar -cf HelloWorld.war WEB-INF
|
部署 WAR文件
- 以門戶網(wǎng)站管理員的身份(
wpsadmin
)登錄到門戶網(wǎng)站。 - 在缺省主題的右上角選擇 Administration鏈接。
圖 1. 管理員鏈接
- 在左邊選擇 Portlets頁面,并選擇 Installportlet。
圖 2. 安裝 portlet 管理頁面
- 單擊 。
- 找到 WAR文件的位置,選定,然后單擊 。
圖 3. 文件選擇對話框
- 單擊 。這可能要花費一些時間,請耐心等待它完成。
- 驗證 Portlet是否為 HelloWorld。單擊 。再次等待直到安裝完成。
圖 4. Portlet 安裝驗證屏幕
- 最后,您將看到這條確認(rèn)消息: 。
如果在部署過程中碰到某類出錯信息,這通常意味著您在某個 XML文件中出錯了。仔細(xì)分析安裝頁面呈現(xiàn)給您的出錯信息,您通常能夠從中找到出錯的原因。這些信息也會記錄在最新的日志文件中:
%WPS_HOME%/log/wps_YYYY.MM.DD-HH.MM.SS.log
創(chuàng)建部署描述符列出了 XML 文件的常見錯誤。您還應(yīng)該檢查下列內(nèi)容:
- XML聲明必須位于文件的第一行(沒有空格)。
- 在正確的大小寫情況下,xml 文件有正確的名稱。
將 portlet 添加到某一頁面中
- 在左邊選擇 Portal User Interface頁面。
- 點擊 Manage Pagesportlet。
圖 5. 管理頁面 portlet
- 然后選擇 My Portal頁面。
- 單擊 。
- 為新頁面鍵入一個標(biāo)題。
- 單擊 。
- 看到 以后單擊 。
- 單擊新頁面邊上的編輯頁面圖標(biāo) 。
- 單擊 。
- 搜索
Hello
,單擊 。 - 選中 Hello World portlet 并單擊 。
圖 6. 查找 portlets
- 單擊 來完成頁面版面設(shè)計。
圖 7. 編輯版面設(shè)計
- 在右上角單擊 My Portal 鏈接,然后選擇您創(chuàng)建的頁面。
圖 8. 顯示我們創(chuàng)建的 portlet 的門戶網(wǎng)站
結(jié)束語
現(xiàn)在您已經(jīng)創(chuàng)建了一個新的 portlet,您應(yīng)該為此而感到高興!您現(xiàn)在知道了如何從頭開始創(chuàng)建一個簡單的 portlet。首先編寫、編譯并打包Java 代碼。然后創(chuàng)建部署描述符,并將 portlet 打包以便分發(fā)和部署。最后,將 portlet 部署到您的門戶網(wǎng)站中。
從現(xiàn)在開始,編寫任何 portlet 對您來說都是可能的。祝您好運,玩得開心!