IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope: Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  WebSphere  >

使用 WebSphere Studio 开发 Servlet 并从 Portlet 调用 Servlet

developerWorks
文档选项

未显示需要 JavaScript 的文档选项


级别: 初级

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 代码

  1. 启动 WebSphere Studio。
  2. 请选择 File => New => Other 来打开 Select 向导。
    图 1. 创建一个新工程
    在 WebSphere Studio 中选择了 File => New => Other 以创建新工程的屏幕截图
  3. 在 New 向导的 Select 页中,请选择 Portlet development, 然后在右边选择 Portlet application project
    图 2. 选择 portlet 应用程序工程
    在 New - Select 向导中选择了 portlet 应用程序工程的屏幕截图
  4. 单击 Next。Create a Portlet Project 向导将被打开。
  5. 在 Project Name 域输入 MortgageCalculator ,并在 Enterprise Application project name 域中输入 MortgageCalculatorEAR
    图 3. 输入工程名
    在 Define the a portlet project 向导中输入了工程名的屏幕截图
  6. 单击 Next。Create a Portlet Project 向导的 Portlet Selection 页将被打开。
  7. 请选择 Basic portlet
    图 4. 选择 portlet 类型
    在 Portlet selection 向导中选择了 portlet 类型的屏幕截图
  8. 单击 Next。向导的 Basic Portlet Parameters 页将被打开。
  9. 在 Portlet class name 域中输入 com.ibm.dr.MortgagePortlet
    图 5. 基本 portlet 参数
    在 Basic portlet parameters 向导中基本 portlet 参数的屏幕截图
  10. 请单击 Finish。现在, portlet.xml 文件将在 WebSphere Studio 的 Portlet 视图中被打开。
  11. 请选择 Portlet application。在 UID 域中输入 com.ibm.dr.MortgageCalculatorPortlet
    图 6. 修改 portlet 应用程序的 UID
    修改 portlet 应用程序的 UID 的屏幕截图
  12. 请选择 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 的 UID 的屏幕截图
  13. 展开 Concrete portlet application并选择 Portlet_1
  14. 在 Description 域输入 This portlet calculates mortgage
  15. 在 Short title 域输入 Mortgage
    图 8. 定义标题和描述
    定义标题和描述的屏幕截图
  16. 保存文件。




回页首


创建 JSP 页面来显示表单

在这个部分,您将修改 view.jsp 文件来显示一个 HTML 表单。您必须使用 encodeNameSpace 标记元素对表单的所有变量名进行编码。这个 HTML 表单将显示 Loan AmountMortgage Rate 以及 Years to Pay 的文本域。

  1. 在 WebSphere Studio 的 Navigator 视图中展开 MortgageCalculator => webApplication => jsp。删除 html 目录,因为在这里您不需要使用这个目录。

    图 9. 删除 html 目录
    突出显示的要被删除的 html 目录的屏幕截图
  2. 单击 Yes确定。
  3. jsp 文件夹下双击 view.jsp来打开文件。
  4. 选择 Source视图。
  5. 用下列代码替换 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 的内容
    替换 view.jsp 的内容的屏幕截图




回页首


生成 servlet 代码

在这个部分,您将使用 WebSphere Studio 创建一个 servlet。您将修改 doPost() 方法从类型为 HttpServletRequest 的对象提取 loan_amountmortgage_rate 以及 years_to_pay 的值。计算出的每月按揭还款额就被显示出来了。

  1. 在 Navigator 视图选择 MortgageCalcutor 工程。单击工具栏中的 Create a servlet 图标
    Create a servlet 图标的屏幕截图
    。Create the Servlet Class 向导将被打开。
  2. 在 Servlet Name 域输入 MortgageCalculatorServlet , 然后在 Package 域内输入 com.ibm.dr
  3. 单击 Next
    图 11. 定义 servlet
    在 Create a servlet class 向导中定义 servlet 的屏幕截图
  4. 单击 Finish
  5. 单击 Yes确认。
  6. 编辑 MortgageCalculatorServlet.java 文件。
  7. 在 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>" );
    

  8. 在编辑器中右键单击 MortgageCalculatorServlet.java 文件并从上下文菜单中选择 Organize imports。这将添加使用诸如 PrintWriter 等类所需的包的导入语句。
  9. 保存文件。

修改 web.xml 文件

当把 WAR 文件安装到 WebSphere Portal 上, 请确保所有的 servlet 元素都有一个 id 属性。但是,创建 servlet 时 WebSphere Studio 并不生成 id 属性。为了使 WAR 文件能安装成功,您需要手工为所有的 servlet 添加 id 属性。请执行下列步骤来更新 web.xml 文件。清单 3 显示了一个样本 servlet 元素:

  1. 打开 web.xml 文件。
  2. 选择 Source视图选项卡。
  3. id="servlet_2" 添加到 MortgageCalculatorServlet 的 servlet 元素。
  4. 保存文件。

清单 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_amountmortgage_rate 以及 years_to_pay ,并使用 HttpServletRequest 类的 setAttribute 方法在该对象中将这些参数设置为属性。然后,您将使用类型为 RequestDispatcher 的对象从 portlet 调用 MortgageCalculatorServlet servlet。

  1. 打开 MortgagePortlet.java 文件。
  2. 添加 import javax.servlet.ServletException; 语句。
  3. 在 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){
    }
    

  4. 在编辑器中,右键单击 MortgageCalculatorServlet.java 文件并从上下文菜单选择 Organize imports
  5. 保存 MortgagePortlet.java 文件。




回页首


导出 WAR 文件

  1. 在 Navigator 视图中右键单击 MortageCalculator 并 从上下文菜单单击 Export WAR
  2. 在 Where do you want to export resources to? 域中输入 一个带有 WAR 文件名的目录结构,例如 D:\sampportlets\mortgageportlet.war
    图 12. 导出 WAR 文件
    选择了要导出的 WAR 文件的 WAR Export 向导的屏幕截图
  3. 单击 Finish




回页首


显示 portlet

  1. 使用 Install Portlet 安装导出的 WAR 文件。
  2. 创建一个页面并将其定制,使它包含 MortgageCalculator portlet
    图 13. MortgageCalculator portlet
    Web 浏览器中显示 MortgageCalculator portlet 的屏幕截图
  3. 在 Loan Amount、Mortgage Rate 以及 Years to Pay 域中输入相应的值。单击 Calculate

现在每月还款额显示为:


图 14. Mortgage calculator 的结果
Web 浏览器中显示 Mortgage Calculator 结果的屏幕截图




回页首


使用 WebSphere Studio 开发 portlet 的技巧

portlet 只是页面的一部分,因此 portlet 的 输出流绝对不能包含诸如 <body><html> 等标记。当您使用 WebSphere Studio 创建 JSP 页面时,它将在 JSP 文件中生成所有这些 HTML 标记。要在 WebSphere Studio 中禁用此功能,请完成下列步骤:

  1. 从菜单选择 Window => Preferences
  2. 展开 Webtools并选择 Files
  3. 取消对 Insert this DOCTYPE onInclude GENERATOR in HTML source复选框的选择。
  4. 单击 OK
    图 15. Preferences 窗口
    Preferences 窗口的屏幕截图

当您将表单的 action 属性指定为 <portletAPI:createURI> 时,WebSphere Studio 会提示它是一个无效链接。为了避免 WebSphere Studio 这样提示,请完成下列步骤:

  1. 在 Tasks 视图中单击 Filter 图标
    filter 图标的屏幕截图
    。Filter Tasks 向导将被打开。
  2. 取消 Problem 下对 Broken Links复选框的选择。
  3. 单击 OK
    图 16. Filter Tasks 窗口
    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与他联系。




对本文的评价










回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款