级别: 初级 Sukumar Konduru (konduru@us.ibm.com), 软件咨询工程师, Developer Technical Support Center,IBM 达拉斯
2003 年 4 月 01 日 这篇文章向您演示如何为 Web 应用程序创建一个 servlet和 portlet,然后使用 WebSphere Studio 和 Portal Toolkit 插件把它们打包到一个单独的 Web 归档文件(Web archive,WAR)中。
© Copyright International Business Machines Corporation 2003. All rights reserved.
引言
IBM® WebSphere®
Portal 4.1.2 for Multiplatforms 提供 Portal Toolkit
插件,它可以与
IBM
WebSphere Studio Application Developer,版本 4.0.3(以下
称为 WebSphere Studio)结合起来使用。您可以使用 WebSphere Studio 与
Portal Toolkit 插件一起来创建 portlet。Portal Toolkit 生成
打包 portlet 应用程序所需的 XML 文件,并生成基本的 portlet(例如 MVCPortlet 等等)的框架代码。为了调试 portlet
代码,您将需要在 WebSphere Application Server 高级单服务器版本 4.0.2 上安装 WebSphere Portal。
这篇文章向您演示如何为 Web 应用程序创建一个 servlet
和 portlet,然后使用 WebSphere Studio 和 Portal Toolkit 插件把它们打包到
一个单独的 Web 归档文件(Web archive,WAR)中。本文接着讨论如何通过 portlet 代码显示 HTML 表单,以及如何传递用户提交的表单值从 portlet 调用 servlet。您将创建的样本代码会计算每月按揭还款额;您可以
使用您在这里开发的 servlet 代码来进行您自己的 servlet 开发。您可以使用 WebSphere Studio 来开发 portlet 和 servlet,然后您可以在 WebSphere Application Server 上安装的 WebSphere Portal上运行 WAR 文件。本文
假设您已经基本了解如何在 WebSphere Portal 上部署 WAR 文件,以及如何定制页面以获得 portlet。如果想了解如何安装 WAR 文件以及定制页面来获得 portlet 的详细信息,请参阅 Ron Lynn 的文章,
Hello World - The simplest portlet for WebSphere Portal, Version 4.1。
如果您想获得如何把 Portal
Toolkit 安装在 WebSphere Studio Application Developer 上的指导,请参阅 Doug
Phillip 的文章,
Installing
Prerequisite Software for the IBM Portal Toolkit Plug-in for WebSphere
Studio Application Developer。本文将不会演示如何调试 portlet 代码。如果想了解调试 portlet 的详细信息,请参阅 Doug Phillip 的文章,
Developing and Debugging Portlets using the IBM Portal Toolkit Plug-in for WebSphere Studio Application Developer。
先决条件
- WebSphere Studio Application Developer,版本 4.0.3
- WebSphere Portal 4.1 和 Portal Toolkit 插件
注意:如果您想调试 portlet 代码,您还需要
在 WebSphere Application Server 高级单服务器版本 4.0.2 上安装 WebSphere Portal。
样本概况
样本应用程序演示如何创建一个
portlet 来计算每月按揭还款额。portlet 显示
一个表单,它让用户提交本金、利率和
年数。提交之后,portlet 就调用 servlet,
并使用一个类型为
RequestDispatcher 的对象把这些值传递给 servlet。
然后 portlet 从 servlet 接收每月还款额,并在 portlet 窗口中显示结果。
生成 portlet 代码
- 启动 WebSphere Studio。
- 请选择
File => New => Other 来打开 Select
向导。
图 1. 创建一个新工程
- 在 New 向导的 Select 页中,请选择
Portlet development,
然后在右边选择
Portlet application project。
图 2. 选择 portlet 应用程序工程
- 单击
Next。Create a Portlet Project 向导将被打开。
- 在 Project Name 域输入
MortgageCalculator ,并在 Enterprise Application project name 域中输入
MortgageCalculatorEAR 。
图 3. 输入工程名
- 单击
Next。Create a Portlet Project 向导的 Portlet Selection 页将被打开。
- 请选择
Basic portlet。
图 4. 选择 portlet 类型
- 单击
Next。向导的 Basic Portlet Parameters 页将被打开。
- 在 Portlet class name 域中输入
com.ibm.dr.MortgagePortlet 。
图 5. 基本 portlet 参数
- 请单击
Finish。现在,
portlet.xml 文件将在 WebSphere Studio 的 Portlet 视图中被打开。
- 请选择
Portlet application。在 UID 域中输入
com.ibm.dr.MortgageCalculatorPortlet 。
图 6. 修改 portlet 应用程序的 UID
- 请选择
Concrete portlet application。在 UID 域中输入
com.ibm.dr.MortgagePortlet.concrete 。
您不需要改变 portlet application 和 concrete portlet application 的 UID。但是,通常使用
全限定类名作为 portlet 应用程序的 UID。
在这种情况下,添加这个带有
concrete 的全限定类名作为 concrete portlet application 的 UID。
图 7. 修改 concrete
portlet application 的 UID
- 展开
Concrete portlet application并选择
Portlet_1。
- 在 Description 域输入
This portlet calculates
mortgage 。
- 在 Short title 域输入
Mortgage 。
图 8. 定义标题和描述
- 保存文件。

 |

|
创建 JSP 页面来显示表单
在这个部分,您将修改
view.jsp
文件来显示一个 HTML 表单。您必须使用
encodeNameSpace 标记元素对表单的所有变量名进行编码。这个
HTML 表单将显示
Loan Amount 、
Mortgage
Rate 以及
Years to Pay 的文本域。
- 在 WebSphere Studio 的 Navigator 视图中展开
MortgageCalculator
=> webApplication => jsp。删除
html
目录,因为在这里您不需要使用这个目录。
图 9. 删除 html 目录
- 单击
Yes确定。
- 在
jsp 文件夹下双击
view.jsp来打开文件。
- 选择
Source视图。
- 用下列代码替换
view.jsp 的内容并保存文件。
清单 1. view.jsp 的新内容
<%@ taglib uri='/WEB-INF/tld/portlet.tld' prefix='portletAPI'%>
<portletAPI:init/>
<FORM ACTION="<portletAPI:createURI/>" METHOD="POST">
<TABLE class="Portlet" width="100%" border="0"
cellspacing="0" cellpadding="0">
<TR>
<TD width="100%" align="left">Loan Amount:</TD>
</TR>
<TR>
<TD width="100%" align="left">
$<INPUT type="text" name="<portletAPI:encodeNamespace
value='loan_amount' />" size="10">
</TD>
</TR>
<TR>
<TD width="100%" align="left">
<BR>
Mortgage Rate: </TD>
</TR>
<TR>
<TD width="100%" align="left">
<INPUT type="text" name="<portletAPI:encodeNamespace
value='mortgage_rate' />" size="4">%
</TD>
</TR>
<TR>
<TD width="100%" align="left">
<BR>
Years to Pay: </TD>
</TR>
<TR>
<TD width="100%" align="left">
<INPUT type="text" name="<portletAPI:encodeNamespace
value='years_to_pay' />" size="2">
</TD>
</TR>
</TABLE>
<BR>
<INPUT type="submit" name="Save_Button"
value="Calculate" size=35>
</FORM>
|
图 10. 替换 view.jsp 的内容

 |

|
生成 servlet 代码
在这个部分,您将使用 WebSphere Studio 创建一个 servlet。您将修改 doPost() 方法从类型为
HttpServletRequest 的对象提取
loan_amount 、
mortgage_rate 以及
years_to_pay 的值。计算出的每月按揭还款额就被显示出来了。
- 在 Navigator 视图选择
MortgageCalcutor 工程。单击工具栏中的 Create a servlet 图标
。Create the Servlet Class 向导将被打开。
- 在 Servlet Name 域输入
MortgageCalculatorServlet ,
然后在 Package 域内输入
com.ibm.dr 。
- 单击
Next。
图 11. 定义 servlet
- 单击
Finish。
- 单击
Yes确认。
- 编辑
MortgageCalculatorServlet.java 文件。
- 在 doPost() 方法中输入下列代码:
清单 2. doPost() 方法的内容
PrintWriter pw = response.getWriter();
int loanAmount =
Integer.parseInt( (String)request.getAttribute("loan_amount"));
float mortgageRate =
Float.parseFloat( (String)request.getAttribute("mortgage_rate"));
int yearsToPay =
Integer.parseInt( (String)request.getAttribute("years_to_pay"));
int monthsToPay = yearsToPay * 12;
float monthlyRate = mortgageRate/(100 *12);
double payment =
((loanAmount * Math.pow((1+ monthlyRate),monthsToPay)
*monthlyRate))/
(Math.pow((1+ monthlyRate),monthsToPay) -1);
java.text.DecimalFormat dfObj = new java.text.DecimalFormat("#.00");
pw.println("<b>Monthly payment is: $" +
dfObj.format(payment) + "</b>" );
|
- 在编辑器中右键单击
MortgageCalculatorServlet.java
文件并从上下文菜单中选择
Organize imports。这将添加使用诸如 PrintWriter 等类所需的包的导入语句。
- 保存文件。
修改 web.xml 文件
当把 WAR 文件安装到 WebSphere Portal 上,
请确保所有的
servlet 元素都有一个
id
属性。但是,创建 servlet 时 WebSphere Studio 并不生成
id 属性。为了使 WAR 文件能安装成功,您需要手工为所有的 servlet 添加
id 属性。请执行下列步骤来更新
web.xml 文件。清单 3 显示了一个样本 servlet 元素:
- 打开
web.xml 文件。
- 选择
Source视图选项卡。
- 把
id="servlet_2" 添加到 MortgageCalculatorServlet 的 servlet 元素。
- 保存文件。
清单 3. 样本 servlet 元素
<servlet id="Servlet_2">
<servlet-name>MortgageCalculatorServlet</servlet-name>
<display-name>MortgageCalculatorServlet</display-name>
<servlet-class>com.ibm.dr.MortgageCalculatorServlet</servlet-class>
</servlet>
|
您不需要为 portlet 添加 ID,因为 Portal Toolkit 自动为 portlet 的 servlet 元素分配 ID。
从 portlet 调用 servlet
在这个部分,您将修改 portlet 的
doView() 方法。您将从类型为
PortletRequest 的对象提取编码的参数
loan_amount 、
mortgage_rate 以及
years_to_pay ,并使用 HttpServletRequest 类的 setAttribute
方法在该对象中将这些参数设置为属性。然后,您将使用类型为
RequestDispatcher 的对象从 portlet 调用
MortgageCalculatorServlet servlet。
- 打开
MortgagePortlet.java 文件。
- 添加
import javax.servlet.ServletException;
语句。
- 在 doView()方法 的末尾添加下列代码:
清单 4. doView() 方法的内容
String loanAmount = request.getParameter("loan_amount");
String mortgageRate = request.getParameter("mortgage_rate");
String yearsToPay = request.getParameter("years_to_pay");
PrintWriter pw = response.getWriter();
if(loanAmount== null || loanAmount==""|| mortgageRate==null||mortgageRate==""||
yearsToPay==null || yearsToPay== "")
return;
request.setAttribute("loan_amount", loanAmount);
request.setAttribute("mortgage_rate", mortgageRate);
request.setAttribute("years_to_pay", yearsToPay);
try{
RequestDispatcher rd=this.getServletContext().getRequestDispatcher
("/MortgageCalculatorServlet");
rd.include(request,response);
}catch(ServletException se){
}
|
- 在编辑器中,右键单击
MortgageCalculatorServlet.java
文件并从上下文菜单选择
Organize imports。
- 保存
MortgagePortlet.java 文件。
导出 WAR 文件
- 在 Navigator 视图中右键单击
MortageCalculator 并
从上下文菜单单击
Export WAR。
- 在 Where do you want to export resources to? 域中输入
一个带有 WAR 文件名的目录结构,例如
D:\sampportlets\mortgageportlet.war 。
图 12. 导出 WAR 文件
- 单击
Finish。
显示 portlet
- 使用
Install Portlet 安装导出的 WAR 文件。
- 创建一个页面并将其定制,使它包含
MortgageCalculator portlet 。
图 13. MortgageCalculator portlet
- 在 Loan Amount、Mortgage Rate 以及 Years to Pay 域中输入相应的值。单击
Calculate。
现在每月还款额显示为:
图 14. Mortgage calculator 的结果
使用 WebSphere Studio 开发 portlet 的技巧
portlet 只是页面的一部分,因此 portlet 的
输出流绝对不能包含诸如
<body> 、
<html> 等标记。当您使用 WebSphere Studio 创建 JSP 页面时,它将在 JSP 文件中生成所有这些 HTML 标记。要在 WebSphere Studio 中禁用此功能,请完成下列步骤:
- 从菜单选择
Window => Preferences。
- 展开
Webtools并选择
Files。
- 取消对
Insert this DOCTYPE on和
Include GENERATOR in HTML source复选框的选择。
- 单击
OK。
图 15. Preferences 窗口
当您将表单的
action 属性指定为
<portletAPI:createURI> 时,WebSphere Studio 会提示它是一个无效链接。为了避免 WebSphere Studio 这样提示,请完成下列步骤:
- 在 Tasks 视图中单击 Filter 图标
。Filter Tasks
向导将被打开。
- 取消 Problem 下对
Broken Links复选框的选择。
- 单击
OK。
图 16. Filter Tasks 窗口
结束语
本文演示了如何使用 WebSphere Studio Application Developer 和 Portal Toolkit 插件开发 portlet 和 servlet。如果您已经有现成的 servlet,您可以把它们导入到 portlet 工程中,然后从 portlet 代码调用 servlet。如果需要,您可以在
WebSphere Application Server 高级单服务器版上安装 WebSphere Portal 来调试 portlet。
致谢
作者要感谢 Doug Phillips 和
William Trotman,感谢他们审阅了本文并提供了宝贵的建议和贡献。
参考资料
关于作者  | |  |
Sukumar Konduru是达拉斯 IBM Developer Technical Support Center 的一名软件咨询工程师。他持有休斯顿大学授予的计算机科学硕士学位。您可以通过
konduru@us.ibm.com与他联系。
|
对本文的评价
|