引言
經(jīng)常有人問我這個(gè)問題:“如果從頭開始的話,人們能夠通過 WebSphere Portal Version 5 創(chuàng)建的最簡(jiǎn)單的 portlet是什么?”。固定不變的答案是“hello world”。本文將花較長(zhǎng)的篇幅來詳細(xì)回答這個(gè)問題。我準(zhǔn)備帶您了解如何創(chuàng)建 WebSphere PortalV5 的最簡(jiǎn)單的 protlet。您將從一些 Java 代碼開始,接著對(duì)其進(jìn)行編譯,然后打包。接下來,您將創(chuàng)建把有關(guān) portlet的信息告訴應(yīng)用程序服務(wù)器和門戶網(wǎng)站所需的部署描述符。最后,我們將其打包在一起,并將新的 portlet 部署到門戶網(wǎng)站內(nèi)。
創(chuàng)建目錄結(jié)構(gòu)
首先創(chuàng)建一個(gè)目錄結(jié)構(gòu),您將在這個(gè)目錄結(jié)構(gòu)中創(chuàng)建 portlet。下面是我將用于這個(gè)簡(jiǎn)單的 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)建一個(gè)名為 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)建好了源文件,就可以對(duì) Java 代碼進(jìn)行編譯了。在一個(gè)批處理文件中可以使用下面的腳本來編譯 portlet。您首先定義一些環(huán)境變量(例如,Java 主目錄的位置)。用 WebSphere Application Server 附帶的 JDK對(duì)此進(jìn)行編譯通常是一個(gè)好主意,因?yàn)檫@是您將要運(yùn)行應(yīng)用程序的環(huán)境。您還要設(shè)置 PATH 以便訪問 Java 編譯器。此外還需要將變量LIBPATH 設(shè)置為指向 WebSphere JAR 文件所在的目錄。
接下來,您為我們的編譯類路徑構(gòu)建一個(gè)名為 CP 的變量。CP變量可以構(gòu)建在一行上,但是為了說明所需的不同 JAR 文件,我們將其拆開分行顯示。然后,您調(diào)用 Java 編譯器來對(duì)代碼進(jìn)行編譯。這假定您位于helloWorld 目錄下。請(qǐng)將目錄路徑調(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ù)之前修正錯(cuò)誤。一些常見的錯(cuò)誤是:
- 輸入錯(cuò)誤 -- 類名稱、路徑、變量名稱輸入錯(cuò)誤
- 文件名稱 -- 文件名稱必須和類名稱匹配。在我們的例子中,文件名是
HelloWorld.java ,類名稱是 HelloWorld 。如果您已經(jīng)改變了一個(gè)名稱,另一個(gè)名稱也要改變。
- 編輯器錯(cuò)誤 --確定編輯器確實(shí)將文件存儲(chǔ)為文本。像寫字板這樣的編輯器,不會(huì)將文件默認(rèn)存儲(chǔ)為文本。
創(chuàng)建 JAR 文件
在完成了 Java 源文件的編譯以后,您就需要在 WEB-INF\lib 目錄下創(chuàng)建一個(gè) JAR 文件。再次假設(shè)您位于 helloWorld 目錄下。如果您在 編譯代碼一節(jié)創(chuàng)建了一個(gè)批處理文件,就可以將這些語句作為該文件的一部分包含在其中。這取決于您已經(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)在,您需要?jiǎng)?chuàng)建兩個(gè) 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./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。每個(gè) portlet 通過 portlet 元素的 href 屬性映射到 Web 部署描述符中定義的一個(gè) Servlet 上。以 粗體表示這些引用。portlet必須定義一個(gè)惟一的 id,每個(gè)具體的 portlet 都能引用該 id。每個(gè)具體的 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文件時(shí),許多地方會(huì)出錯(cuò)。只有在您試圖將 portlet 部署到門戶網(wǎng)站時(shí)才會(huì)發(fā)現(xiàn)這些錯(cuò)誤。這里有一些需要特別注意的地方:
- 檢查每一個(gè) XML 元素,確保它們都有一個(gè)閉元素。
- 檢查類名是否輸入錯(cuò)誤,對(duì)于本例來講,檢查您給類起的名稱是否是
HelloWorld 。
- 確保 id 和 href 相匹配。
- 確保編輯器確實(shí)將文件保存成文本。
創(chuàng)建 WAR 文件
最后,我們就可以創(chuàng)建供分發(fā)的 WAR文件了。我們將使用標(biāo)準(zhǔn) jar 命令來構(gòu)建 WAR 文件。在 helloWorld 目錄下運(yùn)行以下命令:
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. 文件選擇對(duì)話框
- 單擊
。這可能要花費(fèi)一些時(shí)間,請(qǐng)耐心等待它完成。
- 驗(yàn)證 Portlet是否為 HelloWorld。單擊
。再次等待直到安裝完成。
圖 4. Portlet 安裝驗(yàn)證屏幕
- 最后,您將看到這條確認(rèn)消息:
。
如果在部署過程中碰到某類出錯(cuò)信息,這通常意味著您在某個(gè) XML文件中出錯(cuò)了。仔細(xì)分析安裝頁面呈現(xiàn)給您的出錯(cuò)信息,您通常能夠從中找到出錯(cuò)的原因。這些信息也會(huì)記錄在最新的日志文件中:
%WPS_HOME%/log/wps_YYYY.MM.DD-HH.MM.SS.log
創(chuàng)建部署描述符列出了 XML 文件的常見錯(cuò)誤。您還應(yīng)該檢查下列內(nèi)容:
- XML聲明必須位于文件的第一行(沒有空格)。
- 在正確的大小寫情況下,xml 文件有正確的名稱。
將 portlet 添加到某一頁面中
- 在左邊選擇 Portal User Interface頁面。
- 點(diǎn)擊 Manage Pagesportlet。
圖 5. 管理頁面 portlet
- 然后選擇 My Portal頁面。
- 單擊
。
- 為新頁面鍵入一個(gè)標(biāo)題。
- 單擊
。
- 看到
以后單擊 。
- 單擊新頁面邊上的編輯頁面圖標(biāo)
。
- 單擊
。
- 搜索
Hello ,單擊 。
- 選中 Hello World portlet 并單擊
。
圖 6. 查找 portlets
- 單擊
來完成頁面版面設(shè)計(jì)。
圖 7. 編輯版面設(shè)計(jì)
- 在右上角單擊 My Portal 鏈接,然后選擇您創(chuàng)建的頁面。
圖 8. 顯示我們創(chuàng)建的 portlet 的門戶網(wǎng)站
結(jié)束語
現(xiàn)在您已經(jīng)創(chuàng)建了一個(gè)新的 portlet,您應(yīng)該為此而感到高興!您現(xiàn)在知道了如何從頭開始創(chuàng)建一個(gè)簡(jiǎn)單的 portlet。首先編寫、編譯并打包Java 代碼。然后創(chuàng)建部署描述符,并將 portlet 打包以便分發(fā)和部署。最后,將 portlet 部署到您的門戶網(wǎng)站中。
從現(xiàn)在開始,編寫任何 portlet 對(duì)您來說都是可能的。祝您好運(yùn),玩得開心!
|