引言
经常有人问我这个问题:“如果从头开始的话,人们能够通过 WebSphere Portal Version 5 创建的最简单的 portlet是什么?”。固定不变的答案是“hello world”。本文将花较长的篇幅来详细回答这个问题。我准备带您了解如何创建 WebSphere PortalV5 的最简单的 protlet。您将从一些 Java 代码开始,接着对其进行编译,然后打包。接下来,您将创建把有关 portlet的信息告诉应用程序服务器和门户网站所需的部署描述符。最后,我们将其打包在一起,并将新的 portlet 部署到门户网站内。
创建目录结构
首先创建一个目录结构,您将在这个目录结构中创建 portlet。下面是我将用于这个简单的 portlet 的目录结构:
helloWorld\com\ibm\portlets\sample -- 存放源代码的位置
helloWorld\WEB-INF -- 部署描述符所在的位置
helloWorld\WEB-INF\lib -- JAR 文件存放的位置
创建 Java文件
sample 目录是您将存放 Java 源代码的位置。在 sample 目录中创建一个名为 HelloWorld.java 的文件,然后用您喜欢的文本编辑器打开该文件。下面是您需要输入(或者复制、粘贴)到 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");
}
}
|
编译代码
一旦您已经创建好了源文件,就可以对 Java 代码进行编译了。在一个批处理文件中可以使用下面的脚本来编译 portlet。您首先定义一些环境变量(例如,Java 主目录的位置)。用 WebSphere Application Server 附带的 JDK对此进行编译通常是一个好主意,因为这是您将要运行应用程序的环境。您还要设置 PATH 以便访问 Java 编译器。此外还需要将变量LIBPATH 设置为指向 WebSphere JAR 文件所在的目录。
接下来,您为我们的编译类路径构建一个名为 CP 的变量。CP变量可以构建在一行上,但是为了说明所需的不同 JAR 文件,我们将其拆开分行显示。然后,您调用 Java 编译器来对代码进行编译。这假定您位于helloWorld 目录下。请将目录路径调整为适合安装的路径。
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
|
如果由于某些原因这不能编译,您必须在往下继续之前修正错误。一些常见的错误是:
- 输入错误 -- 类名称、路径、变量名称输入错误
- 文件名称 -- 文件名称必须和类名称匹配。在我们的例子中,文件名是
HelloWorld.java ,类名称是 HelloWorld 。如果您已经改变了一个名称,另一个名称也要改变。
- 编辑器错误 --确定编辑器确实将文件存储为文本。像写字板这样的编辑器,不会将文件默认存储为文本。
创建 JAR 文件
在完成了 Java 源文件的编译以后,您就需要在 WEB-INF\lib 目录下创建一个 JAR 文件。再次假设您位于 helloWorld 目录下。如果您在 编译代码一节创建了一个批处理文件,就可以将这些语句作为该文件的一部分包含在其中。这取决于您已经将 PATH 设置为指向 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
|
创建部署描述符
现在,您需要创建两个 XML 文件:
helloWorld/WEB-INF/web.xml — Web 部署描述符。
helloWorld/WEB-INF/portlet.xml — portlet 部署描述符。
web.xml— Web 部署描述符
Web 部署描述符是 WebSphere Portal 所需要的。现在 Portlet 扩展了 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 部署描述符向门户网站定义 portlet。每个 portlet 通过 portlet 元素的 href 属性映射到 Web 部署描述符中定义的一个 Servlet 上。以 粗体表示这些引用。portlet必须定义一个惟一的 id,每个具体的 portlet 都能引用该 id。每个具体的 portlet 使用 concrete-portlet 元素的 href 属性的特定 id 来引用 portlet。以蓝色表示这些引用。
<?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>
|
创建这些 XML文件时,许多地方会出错。只有在您试图将 portlet 部署到门户网站时才会发现这些错误。这里有一些需要特别注意的地方:
- 检查每一个 XML 元素,确保它们都有一个闭元素。
- 检查类名是否输入错误,对于本例来讲,检查您给类起的名称是否是
HelloWorld 。
- 确保 id 和 href 相匹配。
- 确保编辑器确实将文件保存成文本。
创建 WAR 文件
最后,我们就可以创建供分发的 WAR文件了。我们将使用标准 jar 命令来构建 WAR 文件。在 helloWorld 目录下运行以下命令:
set JAVA_HOME=C:\WebSphere\AppServer\java
set PATH=%JAVA_HOME%\bin
jar -cf HelloWorld.war WEB-INF
|
部署 WAR文件
- 以门户网站管理员的身份(
wpsadmin )登录到门户网站。
- 在缺省主题的右上角选择 Administration链接。
图 1. 管理员链接
- 在左边选择 Portlets页面,并选择 Installportlet。
图 2. 安装 portlet 管理页面
- 单击
。
- 找到 WAR文件的位置,选定,然后单击
。
图 3. 文件选择对话框
- 单击
。这可能要花费一些时间,请耐心等待它完成。
- 验证 Portlet是否为 HelloWorld。单击
。再次等待直到安装完成。
图 4. Portlet 安装验证屏幕
- 最后,您将看到这条确认消息:
。
如果在部署过程中碰到某类出错信息,这通常意味着您在某个 XML文件中出错了。仔细分析安装页面呈现给您的出错信息,您通常能够从中找到出错的原因。这些信息也会记录在最新的日志文件中:
%WPS_HOME%/log/wps_YYYY.MM.DD-HH.MM.SS.log
创建部署描述符列出了 XML 文件的常见错误。您还应该检查下列内容:
- XML声明必须位于文件的第一行(没有空格)。
- 在正确的大小写情况下,xml 文件有正确的名称。
将 portlet 添加到某一页面中
- 在左边选择 Portal User Interface页面。
- 点击 Manage Pagesportlet。
图 5. 管理页面 portlet
- 然后选择 My Portal页面。
- 单击
。
- 为新页面键入一个标题。
- 单击
。
- 看到
以后单击 。
- 单击新页面边上的编辑页面图标
。
- 单击
。
- 搜索
Hello ,单击 。
- 选中 Hello World portlet 并单击
。
图 6. 查找 portlets
- 单击
来完成页面版面设计。
图 7. 编辑版面设计
- 在右上角单击 My Portal 链接,然后选择您创建的页面。
图 8. 显示我们创建的 portlet 的门户网站
结束语
现在您已经创建了一个新的 portlet,您应该为此而感到高兴!您现在知道了如何从头开始创建一个简单的 portlet。首先编写、编译并打包Java 代码。然后创建部署描述符,并将 portlet 打包以便分发和部署。最后,将 portlet 部署到您的门户网站中。
从现在开始,编写任何 portlet 对您来说都是可能的。祝您好运,玩得开心!
|