在ApacheGeronimo上开发和部署ApachePluto门户应用程序

简介: 即使 Apache Geronimo 的功能集中缺少预先集成的门户服务器支持, 您仍可以使用 Geronimo 作为门户应用程序的测试和部署环境。本文将引导您逐步完成在 Geronimo 部署 Apache Pluto 驱动器和 容器的过程,为您的门户应用程序提供百分之百的开放源码环境。然后了解如何 在 Pluto 和 Geronimo 中开发、部署和测试样例门户应用程序。

Apache Pluto 和 Apache Geronimo:快速入门

Apache Pluto 是 Java™ Portlet Specification (JSR 168) 的参考实 现。Pluto 将提供 JSR 168 中指定的基本轻量级容器接口实现和带有用于开发标准 portlet 的其他实用 程序的门户驱动器。 Pluto 用作一个基本的 portlet 容器,用于实现 portlet API 并为开发人员提 供一个可以托管 portlet 的工作示例平台。Pluto 的简单门户组件只是基于 portlet 容器和 JSR 168 的 要求构建的。

Apache Geronimo 1.1 是 Java 2 Platform, Enterprise Edition (J2EE) 1.4 认证的开源应用 服务器。不同于其他 J2EE 应用服务器,Geronimo 预先集成了外部资源组件,例 如数据库、消息传递服 务器和目录服务器。Geronimo 是基于具有高定制性且模块化的架构构建的。它用 作支持现有组件的框架 来构成包含 30 多个最优供给(best-of-breed)开源项目的完整 J2EE 应用服务 器包。Geronimo 预先集 成了 Apache Tomcat 或 Apache Jetty;本文使用的是配有 Tomcat 的 Geronimo 版本。

虽然 Apache Pluto 本身就是基于 J2EE 标准构建的 Web 应用程序,但是它 不能按原样直接部署。此 外,开发的所有 Pluto 门户应用程序都不能被直接安装到 Pluto 门户容器中。 开发人员通常把 Pluto 部署到 Apache Tomcat Web 容器中,但这并不是您的惟一选择。Geronimo 也可 以托管 Pluto 应用程序 。本文将展示如何把 Pluto 门户服务器与 Geronimo 结合使用,为后台配有功能 丰富的常用应用服务器 的门户应用程序提供一个完整的开源测试和部署环境。

门户、portlet 和 API

门户是用作在 Internet 或内部网上获得信息和应用程序的起点的 Web 站点 。它们通常提供个性化、 单点登录、来自多个资源的内容聚合以及托管信息系统的表示层。为了适应聚合 并显示各种内容,门户服 务器提供了一种把不同的门户组件划分为 portlet 的框架。

portlet 是门户中的一个窗口,用于提供一项特定的服务或信息。portlet 负 责从它自己的资源访问 内容(例如,Web 站点、数据库或电子邮件服务器)并对内容进行转换,以便呈 现给客户机。JSR 168 是 用于创建 portlet 的标准 API。它将在应用程序与门户之间提供集成组件,该集 成组件将允许通过门户 交付应用程序。如果没有这项标准,每个应用程序都可能需要自己的 portlet API。

在 Geronimo 中部署和执行 Web 应用程序的过程与在 Tomcat 中部署和执行 Web 应用程序的过程不 同。本文的其余部分将向您展示如何通过以下步骤在托管在 Geronimo 上的 Pluto 中部署和执行样例门 户应用程序:

通过 sharedlib 模块共享 Pluto 库和属性。

为 Pluto 容器和驱动器创建 Geronimo 部署计划。

在 Geronimo 中部署 Pluto。

开发样例门户应用程序。

为样例门户应用程序创建必需的部署计划。

在 Geronimo 上部署和测试样例门户应用程序。

开始时,需要先下载、安装并解压缩 Geronimo 和 Pluto。我将把 Geronimo 的安装目录引用为 GERONIMO_HOME。您可以下载源代码版本或二进制版本的 Pluto。根据 Pluto 安 装指南中的说明:“安装 源代码版本要求完成更多工作,并且仅建议那些有兴趣修改容器的个人安装”, 我将已下载的二进制版本 的位置引用为 PLUTO_HOME 并将源代码版本位置引用为 PLUTO_SRC(当我向您指 出 PLUTO_HOME 中的文件 位置时,如果您已经构建了源文件版本,则可以定位相同的文件)。

共享 Pluto 库和属性

在 Tomcat 中,Pluto 将把门户应用程序作为 Pluto 容器 Web 应用程序的子 部分进行部署。这种方 法在 Geronimo 并中不可行。部署新应用程序意味着创建新的 Web 应用程序和 Geronimo 部署计划。但 是,没有一种方法能够在部署应用程序后动态更新计划和部署配置。解决这个问 题的一种方法是把所有门 户应用程序作为外部应用程序来部署,并且在 Pluto 中,配置新门户应用程序并 被重定向到外部应用程 序。配置包括在 Pluto 注册库中定义 portlet 和门户。这将解决最初遇到的问 题,但是也会带来一大堆 新问题。

一个主要的问题是,由于应用程序都是分别部署的,因此它们全都使用不同的 类装入程序。这意味着 Portlet API 类、Pluto 容器类和常用服务类都是装入到 Pluto 应用程序和门户 应用程序的独立类装入 程序中,导致出现很多 ClassNotFoundException。

要解决此问题,需要把所有常用 Pluto 文件装入到同一个类装入程序中。 Geronimo 1.1 中名为 sharedlib 的服务使您可以完成此操作。使用此项服务,您可以把常见类文件和 库存储到共享文件夹中。 需要使用共享文件的应用程序可以把自身配置为依赖于 sharedlib 服务来使用它 。

要在 Pluto 中使用 sharedlib,请把以下文件从 PLUTO_HOME/webapps/pluto/WEB-INF/classes 复制 到 GERONIMO_HOME/var/shared/classes 文件夹:

pluto-admin.properties

casTor.properties

logging.properties

并把以下文件从 PLUTO_HOME/shared/lib 和 PLUTO_HOME/webapps/pluto/WEB-INF/lib 文件夹复制到 GERONIMO_HOME/var/shared/lib 文件夹:

pluto-1.0.1.jar

pluto-deploy-1.0.1.jar

pluto-descripTors-1.0.1.jar

pluto-portal-1.0.1.jar

portlet-api-1.0.jar

casTor-0.9.5.3.jar

commons-fileupload-1.1.jar

commons-io-1.1.jar

确保当 Geronimo 服务器启动时 geronimo/sharedlib/1.1.1/car 服务已处于 启动状态。

为 Pluto 创建 Geronimo 部署计划

如果 Geronimo 中的所有应用程序使用外部资源引用(例如安全配置或依赖性 因素),则需要使用 Geronimo 部署计划。正如您刚刚学到的那样,Pluto 容器和驱动器应用程序必须 部署到 Geronimo 中, 并且必须与 sharedlib 服务具有依赖性。Pluto 容器和驱动器应用程序以及 Pluto 服务器应用程序都是 Web 应用程序,因此它们的部署计划都将是 Geronimo Web 部署计划。

Geronimo 部署计划与 J2EE 部署描述符有些相像;不同之处在于 Geronimo 部署计划包含特定于服务 器的信息。清单 1 显示的是常用 Pluto 服务器应用程序的 Geronimo Web 部署 计划。

清单 1. Geronimo 的 Pluto 部署计划 —— geronimo-web-pluto.xml

         sharedlib     pluto-properties-file-realm                                  

您可以看到清单 1 中的部署计划有三个主要配置:

依赖性: 元素用于指定 Web 应用程序与任何其他模块 、应用程序或服务之间的 依赖性。它还可以指明与位于 Geronimo 存储库中的第三方库之间的依赖性。在 清单 1 中, 元素内的 sharedlib 将指定与 sharedlib 服务之间的依赖性。

安全性:Pluto Web 应用程序要求配置安全性。特别是,它要求使用 验证 用户登录和主要角色,并使用 映射在 Pluto 的 Web 部 署描述符 (web.xml) 中 定义的角色。在 清单 1 中,pluto-properties-file-realm 安全领域被配置为 强制执行特定于应用程序 的验证策略,它用作登录域的入口点。它被配置为使用 org.apache.geronimo.security.realm.providers.GeronimoGroupPrincipal。在 Pluto 应用程序的 web.xml 文件中定义的 tomcat 角色被映射为使用这个 security-realm。

跨上下文:Pluto 服务器要求使用的一项重要功能是能够调用部署在 Geronimo 服务器上的其他 Web 应用程序中提供的 portlet。默认情况下,这个功能 —— 允许一个 Web 应用程 序把请求分派给其他 Web 应用程序 —— 是禁用状态。您可以通过在部署计划中指定 元素来启用它 。清单 1 中出现的 将为 Pluto 服务器应用程 序激活此功能。

在 Geronimo 中部署 Pluto

如果已下载的是 Pluto 源代码版本,您可以将其构建为获得 Pluto Web 应用 程序 PLUTO_SRC/pluto/portal/target/pluto.war。如果使用的是 Pluto 的二进制版 本,请使用以下命令从 PLUTO_HOME/webapps/pluto 文件夹创建 pluto.war(其中 pluto_xxx 是您选定 的文件夹):

c:/pluto_xxx>jar cvf pluto.war

拥有 pluto.war 之后,请使用 Web 控制台或命令行部署工具(在一行中键入 以下命令)部署它:

c:/geronimo-1.1.1/bin>deploy --user system deployc:/pluto_xxx/pluto.war c:/pluto_xxx/geronimo-web-pluto.xml

开发样例门户应用程序

作为一个演示门户应用程序的开发及部署的样例场景,您将开发一个购票应用 程序。由于要开发的是 基于 JSR 168 和 J2EE 的应用程序,因此对于部署在 Geronimo 中的 Pluto 的 门户应用程序的服务器设 置与所有其他服务器设置完全相同。要创建样例门户应用程序,需要创建四个文 件:

Portlet 类

Portlet 描述符

Web 应用程序描述符

Portlet 视图页面

这些文件内容的详细说明不在本文讨论范围内。有关更多信息,请阅读 “使 用 Apache Pluto 构建和 测试 JSR 168 兼容的 portlets”(developerWorks,2006 年 4 月)。

portlet 类

门户类中的每个 portlet 都有一个用于实现 javax.portlet.Portlet 接口的 portlet 类。为了便于 操作,JSR 168 为 javax.portlet.Portlet 定义了一个默认实现 —— javax.portlet.GenericPortlet 类。清单 2 显示了 org.sample.geronimo.buyticket.BuyTicketPortlet 类,它 将扩展 BuyTicket portlet 的 GenericPortlet。同样地,本文的样例代码将包括 org.sample.geronimo.buyticket.TShirtPortlet(请参阅 下载 部分)。

清单 2. portlet 类 —— org.sample.geronimo.buyticket.BuyTicketPortlet

package org.sample.geronimo.buyticket;import java.io.*;import javax.portlet.*;import  org.apache.pluto.portlet.admin.util.PlutoAdminContext;public class BuyTicketPortlet extends GenericPortlet {   private static String VIEW_JSP = "/view.jsp";   protected void doView(RenderRequest request,  RenderResponse response)    throws PortletException, IOException {   response.setContentType(request.getResponseContentType ());   PortletContext context = getPortletConfig ().getPortletContext();   context.getRequestDispatcher(VIEW_JSP).include(request,  response);   }   public void processAction(ActionRequest request,  ActionResponse response)     throws PortletException, java.io.IOException {   String game = request.getParameter("game");   String name = request.getParameter("name");   String card = request.getParameter("card");    String errorMessage = null;   if(game != null && name != null &&  card != null     && !game.equals("") && !name.equals("")     && !card.equals("")){    response.setRenderParameter("game", game);    response.setRenderParameter("name", name);   }else    response.setRenderParameter("errorMessage",    "You entered invalid data, please check the name and  credit information");   }}

portlet 描述符

清单 3 中显示的 portlet.xml 文件将为门户应用程序中包含的所有 portlet 提供诸如 portlet 名 称、标题、类和模式之类的信息。

清单 3. portlet 描述符 —— portlet.xml

       BuyTicket    Buy Ticket Portlet          org.sample.geronimo.buyticket.BuyTicketPortlet              text/html      view              Buy Ticket Title              TShirt    TShirt Portlet          org.sample.geronimo.buyticket.TShirtPortlet              text/html      view              TShirt      

Web 应用程序描述符

web.xml 是用于提供关于 Web 应用程序组件信息(例如 servlet 和 taglib )的 J2EE 指定的标准 XML 描述符。清单 4 将显示 buyticket 门户应用程序的 WEB-INF/web.xml 文件 。

清单 4. Web 应用程序描述符 —— WEB-INF/web.xml

   GetPortlet       BuyTicket    BuyTicket Wrapper    Automated generated Portlet  Wrapper    org.apache.pluto.core.PortletServlet         portlet-guid     buyticket.BuyTicket             portlet-class     org.sample.geronimo.buyticket.BuyTicketPortlet              BuyTicket    /BuyTicket/*          TShirt    TShirt Wrapper    Automated generated Portlet  Wrapper    org.apache.pluto.core.PortletServlet         portlet-guid     buyticket.TShirt             portlet-class     org.sample.geronimo.buyticket.TShirtPortlet              TShirt    /TShirt/*          index.html          http://java.sun.com/portlet    tld/portlet.tld          http://java.sun.com/portlet    /WEB-INF/tld/portlet.tld  

portlet 视图页面

BuyTicketPortlet 包括一个视图页面以通过调用 context.getRequestDispatcher (“view.jsp”).include(request, response); 来解除视图部分与 portlet 代码 之间的耦合。清单 5 中 显示的 view.jsp 文件用于呈现实际的 HTML 页面。

清单 5. 初始页面 —— view.jsp

     

     

 Thank you , you purchased  ticket for 

      ticketform"  action="">          Select Game/Event              <option value= selected="true">               Name    Card    Exp. Date       <INPUT type="submit" name="submitTicket"   value="Buy"/>      

现在把 portlet.tld 文件从 PLUTO_HOME/webapps/pluto/WEB-INF/tld 复制 到 WEB-INF/tld 文件夹 中。编译 WEB-INF/classes 文件夹中的 Java 文件,并把以上所有文件打包成一 个 WAR 文件,如下所示 :

c:/buyticket>jar -cvf buyticket.war

为样例应用程序创建部署计划

当 Pluto 被部署到 Geronimo 上时,必须把将要部署到 Pluto 中的所有门户 应用程序作为 Web 应用 程序部署到 Geronimo 服务器中。您需要有一个 buyticket 门户应用程序的 Geronimo Web 部署计划, 就像需要有一个 Pluto 服务器应用程序 Web 部署计划一样。清单 6 中显示了 buyticket 的部署计划 —— geronimo-web-app.xml。

清单 6. 门户应用程序部署计划 —— geronimo-web-app.xml

               sharedlib       

Pluto 门户应用程序要求使用常见的 Pluto 文件,这些文件都是通过 Geronimo 中的 sharedlib 服 务共享的。门户应用程序与 sharedlib 服务的依赖性是在清单 6 所示的门户应 用程序部署计划中指定的 。

在 Geronimo 上部署和测试样例应用程序

门户应用程序必须执行两级部署。在第一级中,它将作为 Web 应用程序被部 署到 Geronimo 中。您可 以通过使用 Geronimo 部署工具轻松完成此操作:

在一行中键入以下命令:

c:/geronimo-1.1.1/bin>deploy --user system deploy c:/buyticket/buyticket.warc:/buyticket/geronimo-web-app.xml

此命令将把应用程序作为 Web 应用程序部署到 Geronimo 中,但是要使用 Pluto 服务和功能,必须 通过 Pluto 把应用程序重定向(第二个部署级别)。

为此,您必须把应用程序配置信息存储到 Pluto 注册库中。您可以手动更新 pluto/WEB- INF/data/pageregistry.xml、pluto/WEB-INF/data /portletcontexts.txt 和 pluto/WEB- INF/data/portletentityregistry.xml 文件,也可以执行下一步使用 Pluto admin 应用程序。

打开 http://localhost:8080/pluto/portal,并单击 Admin 链接。此操作将 打开图 1 中所示的 http://localhost:8080/pluto/portal/adminportletapp 应用程序。

图 1. Pluto admin 应用程序 —— 部署 buyticket portlet 应用程序

在此应用程序中,浏览到 buyticket.war 文件,并单击 Submit。此操作将部 署 buyticket 应用程序 并把门户应用程序的具体配置添加到 portletentityregistry.xml 中。

在 admin 部署的下一个页面中,请为新部署的门户应用程序提供标题、描述 和布局信息(参见图 2) 。

图 2. Pluto admin 应用程序 —— 门户布局

把行数和列数更改为显示门户应用程序所包含的行数和列数。

接下来,选择显示在每行每列的 portlet,如图 3 所示。

图 3. Pluto admin 应用程序 —— 定义页面布局

在此步骤中,使用门户应用程序中进行 portlet 定位的布局设置更新 pageregistry.xml。执行完此 步骤就完成了把门户应用程序部署到在 Geronimo 上运行的 Pluto 服务器中的任 务。

现在可以开始通过单击 buyticket 链接来测试和使用应用程序。图 4 将显示 已部署到 Pluto 服务器 中并且正在运行的 buyticket 应用程序。

图 4. buyticket 门户应用程序

结束语

Apache Pluto 是用于 JSR 168 兼容性测试的易于使用的小型门户测试环境。 门户服务器支持并未预 先集成到 Geronimo 中,但是任何门户服务器 —— 例如 Pluto、Jetspeed 或 Liferay —— 都可以作 为插件或外部应用程序安装到 Geronimo 中。即使您引入了重量级的 Jetspeed 或 Liferay 作为部署环 境,也只有 Pluto 能够满足轻量级开发和测试的要求。通过把 Pluto 和 Geronimo 集成到一起,您将获 得结合了开源门户服务器与应用服务器的精华的门户环境。

本文配套源码

累死累活不说,走马观花反而少了真实体验,

在ApacheGeronimo上开发和部署ApachePluto门户应用程序

相关文章:

你感兴趣的文章:

标签云: