js|解决
IBM 开发人员解决方案:开发使用了 JavaBeans 和 JSP 组件的 portlet
使用 Portal Toolkit Plugin for WebSphere Studio Application Developer V4.0.3 轻松实现它。
Balu Ramachandran (balur@us.ibm.com)
高级软件工程师,IBM
2003 年 2 月
本文叙述了 WebSphere Studio Application Developer V4.0.3 能成为开发 portlet 的首选 J2EE 开发工具的缘由。文章简要地讨论了门户网站、WebSphere Portal Server V4.1.2、portlet 和 Portal ToolKit Plugin V4.x。作者将为您详细讲解如何使用 Portal Toolkit Plugin 一步一步地编写 portlet。文中的示例门户网站应用程序就是一个 portlet,这个 portlet 能调用一个 JavaBeans 组件把存储在 Java 属性文件中的特定于的客户信息聚集在一起。这个 portlet 将使用 JavaBeans 信息并通过 JavaServer Pages(JSP)页面将结果返回给请求者。当需要向用户显示时,这个 JSP 页面将被嵌入到 portlet 中。
引言
门户网站是一个通过把基于 Web 的资源聚集一处使用户可以单点访问那些资源的 Web 站点。用户不再需要单独登录每个他们想要使用的应用程序而只需要登录门户网站本身就可以了。
WebSphere Portal Server V4.1
IBM WebSphere Portal 是 WebSphere 软件平台的一个组成部分, 它主要完成下述三种功能:
通过一系列用户、设备和定制选项提供对信息的访问。
集成并自动执行业务过程。
构建、连接并管理应用程序。
WebSphere Portal Server 是一个高度可伸缩门户网站服务器,它实现了一个战略上的开放源代码门户网站框架。Portal Server V4.1 建立在 WebSphere Portal Family V2.1 的核心服务之上。Portal Server 提供以下服务:
对各类门户网站和商业服务进行访问,比如:访问用于电子交易(eCommerce)的 WebSphere Commerce Suite、访问用于信息分类(information categorization)的 EIP 和访问用于高级协作(advanced collaboration)与个人信息管理(personal information management (PIM))的 Lotus 工具(例如:Calendar、Mail 和 Sametime)。
通过工作流、EAI 等方法对旧系统的连接。
WebSphere Portal 也提供下列其它服务:
单点登录
安全性
Web 内容发布
搜索
个性化处理
协作服务
企业应用程序集成
支持移动设备
站点分析
Portlet
Portlet 是 IBM WebSphere Portal 的重要组成部分。作为一种特殊的可重用的 Java servlet,portlet 被作为已定义区域显示在门户网站页面上。portlet 可以访问许多不同的应用程序、服务和 Web 内容。WebSphere Portal 配有一个丰富的标准 portlet 集,它包括了用于显示辛迪加内容、用于转换 XML 和用于访问搜索引擎与 Web 页面的 portlet。您也可以使用一些第三方提供的 portlet ,例如企业资源计划(ERP)和客户关系管理(CRM)。 Portal Server 还提供您一个能用于创建自定义 portlet 的 API。通过把 portlet 聚集在一起并授予用户定义他们自己的桌面的权力,Portal Server 为商业伙伴、客户或者雇员提供了一条能更高效更满意地从事商务活动的捷径。
WebSphere Studio Application Developer V4.0.3
不久之后,WebSphere Studio 产品套件会取代现有的 Java 和 Web 应用程序开发工具(VisualAge for Java 和 WebSphere Studio-classic)。新的工具建立在一个开放的平台之上并且拥有最前沿的 Enterprise JavaBeans(EJB)技术和基于 J2EE 1.2 规范的 J2EE 加工技术。它还具有下列功能:
企业连接
内置单元测试环境(WebSphere Application Server 和 Tomcat)
增量编译
多种调试方法(包括远程调试)
集成小组开发环境
WebSphere Studio Development Environment 是建立在高度可插的 WebSphere Studio Workbench 开放源代码平台之上。在这个平台的顶层,IBM 实现了 WebSphere Studio Application Developer, 并且 IBM 还鼓励其他供应商将他们的工具也集成到这个平台上。这个开发环境适合基于角色的开发,并且开发过程带有适合于特定角色的用户界面功能。所有资源都存储在一个基于文件的资源库中。在不久的将来,VisualAge for Java 和 WebSphere Studio-classic 所有的功能将都能在 Application Developer 中实现。新的工具已经能支持 Web 服务。
Portal Toolkit Plugin
Portal Toolkit 是 Application Developer V4.0.3 的一个插件,用于开发 portlet 应用程序。Portal Toolkit 提供:
Portlet 项目,您能在这个项目中创建抽象 portlet、 JSP portlet、servlet invoker portlet、 XML/XSL portlet 和多 - 设备/视图(multi-device/view)portlet。
Portal Server 项目,您能在这个项目中将你的 portlet 应用程序发布到你的目标 Portal Server 机器上。你的 portlet 将出现在你的 Portal Server 的调试页面上。
用于企业应用程序的 Portlet 应用程序示例。
开发并部署一个 JSP 会话 portlet
作为一个示例,我将为您讲解如何开发一个使用了名为 PortalBean 的 JavaBeans 组件的 portlet,使它能从属性文件中检索已存储的值。这个 portlet 实例化一个已存储的 JavaBeans 类并把这个 JavaBeans 实例存储在 portlet 会话的请求属性中。这之后,portlet 就调用一个 JSP 组件并传出请求属性与响应属性的值。然后该 JSP 组件将会使用被传来的 JavaBeans 类并在 portlet 中输出适当的值。
为 Application Developer 安装 Portal Toolkit Plugin
如果您还没有 Portal Toolkit Plugin,请在这里下载 Portal Toolkit Plugin。
根据提示将插件安装到 Application Developer V4.0.3 中。请注意安装的先决条件。
将 WebSphere Application Server JVM 添加到 Aplication Developer 的可用 JVM 列表中:
打开 Windows - Preferences。选择 Java - Installed JRE。
单击 Add New。
浏览并选择 X:\WebSphere\AppServer\java。
一旦它被显示在已安装 JRE 列表中, 选中 WAS JRE 旁的复选框将它设置为缺省的 JRE。
单击 OK 保存您所做的更改。
开发 MyJSPPortal Portlet
创建一个名为 JSPPortal 的新项目:
单击 Open new project wizard>Portlet Development>Portlet Application Project。
在 Project name 栏中输入 MyJSPPortal。
接受企业应用程序项目名称(Enterprse Application Project name)的缺省值
单击 Next.
安装一个基本的 portlet 基础架构,选择 Portlet Type None。单击 Finish。
创建一个名为 MyJSPPortal 的 Java 类:
单击 Open new project wizard>Java>Java class。
将包命名为 portal。
将类命名为 MyJSPPortal。
单击 Finish。
为 MyJSPPortal 类复制并粘贴代码:
请确认用于编辑 MyJSPPortal 的编辑器是打开的。
复制并粘贴下面的代码:
MyJSPPortal
package portal;
import java.io.*;
import java.util.*;
import org.apache.jetspeed.portlet.*;
public class MyJSPPortal extends AbstractPortlet {
public MyJSPPortal() {
super();
}
public void doView(PortletRequest request, PortletResponse
response) throws IOException,PortletException
{
// read the values from properties text file
getPropertiesFile(request);
PrintWriter writer = response.getWriter();
FileInputStream propFile = null;
// Use created session to retrieve values
PortletSession session = request.getPortletSession(false);
// when valid session is returned, get the values from
the session
String lName = "";
String fName = "";
String eMail = "";
if (session!=null)
{
lName = (String)session.getAttribute("LName");
fName = (String)session.getAttribute("FName");
eMail = (String)session.getAttribute("Email");
}
PortalBean bean = new PortalBean();
bean.setlName(lName);
bean.setfName(fName);
bean.setEMail(eMail);
request.setAttribute("MyBean",bean);
getConfig().getContext().include("MyPortal.jsp",request,
response);
}
public void init(PortletConfig portletConfig)
throws UnavailableException
{
super.init(portletConfig);
}
public void getPropertiesFile(PortletRequest
request) throws PortletException
{
// Intialize method variables
String fname = "";
String lname = "";
String email = "";
FileInputStream fi = null;
// Create a new Session
PortletSession session =
request.getPortletSession();
// Initialize a properties file with no default
properties
Properties myProp = new Properties();
// Load the properties class with key-value
pairs from // the text file
try{
fi = new FileInputStream
("C:\\temp\\myProperties.txt");
myProp.load(fi);
fi.close();
}catch (FileNotFoundException fe)
{
System.out.println("File Not Found");
}
catch (IOException fe)
{
System.out.println("IO Exception");
}
// Retreive the individual key - value pairs and
store them in the session
if (myProp.containsKey("FirstName"))
{
fname = myProp.getProperty("FirstName");
session.setAttribute("FName", fname);
}
if (myProp.containsKey("LastName"))
{
lname = myProp.getProperty("LastName");
session.setAttribute("LName", lname);
}
if (myProp.containsKey("Email"))
{
email = myProp.getProperty("Email");
session.setAttribute("Email", email);
}
}
public void service(PortletRequest portletRequest,
PortletResponse portletResponse) throws PortletException,
IOException
{
doView(portletRequest,portletResponse);
}
}
编译上述代码(CTRL-S)。
创建如下所示的一个名为 MyProperties.txt 的文本文件,并将它保存在 C:\temp 目录中。
MyProperties.txt
FirstName=Joe
LastName=Generic
Email=com
创建另一个名为 PortalBean 的 Java 类:
就象您先前所做的那样,创建另一个名为 PortalBean 的新 Java 类,并将它打开。
将下面的代码剪切并粘贴到 PortalBean 中:
PortalBean
package portal;
/**
* Insert the type's description here.
* Creation date: (1/12/2002 6:34:35 PM)
* @author: Administrator
*/
public class PortalBean {
/**
* PortalBean constructor comment.
*/
public String fName;
public String lName;
public String eMail;
public PortalBean() {
super();
}
/**
* Insert the method's description here.
* Creation date: (1/14/2002 10:28:20 PM)
* @return java.lang.String
*/
public String eMail() {
return null;
}
/**
* Insert the method's description here.
* Creation date: (1/14/2002 10:28:20 PM)
* @return java.lang.String
*/
public String getEMail() {
return eMail;
}
public String getfName()
{
return fName;
}
/**
* Insert the method's description here.
* Creation date: (1/14/2002 10:35:04 PM)
* @return java.lang.String
*/
public String getlName() {
return lName;
}
/**
* Insert the method's description here.
* Creation date: (1/14/2002 10:29:41 PM)
* @param email java.lang.String
*/
public void setEMail(String email) {
eMail = email;
}
public void setfName(String myName)
{
fName = myName;
}
public void setlName(String myName)
{
lName = myName;
}
}
在控制台屏幕的下半部分会出现两条错误信息 — 其中一条信息表明您需要将一个 servlet 引用添加到 portlet.xml 文件中而另一个信息则表明存在对 portlet.xml 文件中 portlet 的一个错误引用。 按下列步骤进行操作您将能修正这些错误。
将 portlet 添加到 Web 部署描述符中:
双击 web.xml,打开 web.xml 进行编辑。
单击 servlet 选项卡并选择 Add。
在 Add Servlet 中,找到 MyJSPPortal servlet 并单击 OK。
单击 Servlet 窗口并单击 Add 进行 URL 映射。
编辑新的 URL 并将它的值设置为: /MyJSPPortal/*。
单击 CTRL-S 保存您所做的更改。
单击 web.xml 的 source 选项卡查看添加了 servlet 后相应的更改。
添加 MyJSPPortal.jsp 文件:
右单击 webApplication 并添加 New>JSP File。
输入文件名 MyPortal.jsp。
单击 Finish。
双击新近创建的 MyPortal.jsp,将下面的代码复制到文件中,然后单击 CTRL-S 保存这些代码。
MyPortal.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
< %@ page session="false" %;>
<jsp:useBean id="MyBean" class="portal.PortalBean" scope="request"/>
<META http-equiv="Content-Type" content="text/html">
<META http-equiv="Content-Style-Type" content="text/css">
<TABLE class="Portlet" width="100%" border="0"cellspacing="0"
cellpadding="0">
<TR>
<TD>
<b>Last Name: <%=MyBean.getlName()%></b>
</TD>
<TD>
<b>First Name: <%=MyBean.getfName()%></b>
</TD>
<TD>
<b>EMail: <%=MyBean.getEMail()%></b>
</TD>
</TR>
</TABLE>
将参考 servlet 添加到 portlet.xml 文件中:
双击 portlet.xml, 打开 portlet.xml 进行编辑。
单击 portlet 选项卡。
双击 Portlet Applications 并右单击 Portlet_2。
单击 servlet 旁的 Browse 并找到 MyJSPPortal servlet。它的状态应该是未被使用。
突出显示 servlet 并单击 OK。
使用 CTRL-S 保存并提交您刚才所做的更改。
当您完成上述步骤后,您就不会在控制台屏幕上看到错误信息了。
重新编译 MyJSPPortal 项目:
右单击 MyJSPPortal 并选择 Rebuild Project。
导出完整的 WAR 文件:
右单击 MyJSPPortal 并选择 Export WAR。
对于导出文件的存放位置,浏览并选择 C:\temp(或其他任何合适的位置)作为导出文件位置,并输入 MyJSPPortal 作为文件名。
单击 Finish。
编译代码(CTRL-S)。
部署 MyJSPPortal Portlet
要部署 MyJSPPortal portlet,请按下列步骤进行操作:
以门户网站管理员身份登录门户网站:
打开 Internet Explorer 并输入以下地址:http://portal.ibm.com/wps/portal(或合适的 URL)。
单击右上角的 key 图标登录。
使用 wpsadmin/wpsadmin 作为用户标识/密码,从而以管理员身份登录。
访问 Administration Portlet:
单击左上角的下拉菜单,它包含一个表示当前所显示 Home 页的条目,并选择 Portal Administration。
单击 Browse 找到您在前面一节中导出的 MyJSPPortal.war 文件(C:\temp\MyJSPPortal.war),然后单击 Next。
单击 Install 安装 portlet。您应该看见一条表明 portlet 已被成功安装的消息。
将 MyJSPPortal portlet 添加到 Home - Welcome 页面:
单击屏幕左上角带有 Portal Administration 条目的下拉菜单。
选择 Work with Pages。
单击 Page Group 下拉菜单并选择 Home。
单击 Page 下拉菜单并选择 Welcome。
单击屏幕上方的 Get Portlets
选择 Show all portlets 并单击 Go。
现在您将能看见一个已部署好的 portlet 的列表。向下滚动并找到 MyJSPPortal portlet。单击该行最左一栏的 + 符号选择 MyJSPPortal portlet 进行部署。
向上滚动页面并单击页首左上端的 OK。
一旦你返回到原先的页面,找到并突出显示 MyPortal portlet。单击 + 符号将 MyPortalportlet 添加到 Welcome 页面。
最后,单击屏幕左下端的 Activate 图标激活添加了 MyPortal portlet 的 Welcome 门户网站页面.
查看 Home 页面,看看您所作的更改:
找到并单击左上角的下拉菜单并选择查看 Home 页面。