UML软件工程组织

 

 

使用 Apache Geronimo 和 Eclipse 构建 portlet
使用 Eclipse Web Tools Platform (WTP) 管理 Liferay 门户
作者:Bob Balfe 出处: IBM
 
本文内容包括:
Web 开发人员可以通过配置称为 portlet 的简单可重用的事件驱动组件来构建多功能门户。Eclipse 甚至会使此过程更加简单。首先,了解 Eclipse Web Tools Platform (WTP) 如何提供了一种完整的开发环境,可以用于编辑 portlet 项目所需的代码和配置文件。然后,通过集成 Apache Geronimo Eclipse 插件,了解如何能够通过访问 Geronimo 应用服务器从而在完整的门户内部署和显示这些 portlet。

开始之前

关于本教程

使用正确的开源工具,您可以构建一个类似于任何大型企业站点的功能强大的多功能 Web 门户。本教程将研究使用三种工具来创建此类门户的方法:

  • 用于开发项目的 Eclipse 集成开发环境 (IDE)
  • 用于部署它的 Apache Geronimo 应用服务器
  • 用于提供整体结构的 Liferay 门户

安装这些组件并解决版本不兼容问题需要花费一番功夫。但是在完成配置后,构建和部署门户的过程将十分简单。

目标

本教程将包含以下主题:

  • 使用 Eclipse WTP 组织和简化门户开发。
  • 在 Liferay 门户内构造 portlet。
  • 把基于 servlet 的 portlet 应用程序部署到 Geronimo 应用服务器上。
  • 使用 Geronimo 应用服务器部署基于 Java™Server Page (JSP) 的 portlet 应用程序。

先决条件

本教程适用于具有初级至中级技能和使用经验的企业 Java 开发人员。您应当非常熟悉 Java 技术、servlet 和 JSP 页面,并且基本了解 Eclipse 及其管理项目的方法。

系统要求

要开始学习本教程,您的系统中需要配备最新版本的 Eclipse 3.2 或更高版本。您将在学习本教程的过程中安装 WTP、Geronimo 服务器、Geronimo 服务器运行时和 Liferay 门户平台。

返回

门户、portlet 和 Geronimo

了解门户 与 portlet 之间的差别,并发现 Apache Geronimo 在两者的创建过程中所扮演的角色。

门户和 portlet 简介

Java Specification Request (JSR) 168 把门户 定义为 “一个 Web 应用程序,它通常提供个性化、单点登录、聚合来自多个资源的内容和托管信息系统的表示层”。它把 portlet 定义为 “由 portlet 容器管理的 Web 组件,用于处理请求和生成动态内容”。从功能上来说,portlet 将生成标记片段来响应请求,而门户将管理这些片段并把它们组织成一个框架。

大型组织经常使用门户为用户提供具有多项功能的单个页面。在许多情况下,这些门户还将用作组织级通信的内部网应用程序。使用单一的 servlet 将无法承受开发这些页面的任务,因此 portlet 被创建为可以动态添加和修改的可插入组件。幸好有通用 JSR 168 标准,门户开发人员可以混合搭配来自不同供应商的 portlet 而无需进行重大更改。因此,无需重新编写注册应用程序、证券报价机和 Really Simple Syndication (RSS) 摘要 —— 只需下载和部署就可完成。

值得庆幸的是,有许多开源工具可供任何人进行门户开发。在 Apache License 下发布的 Apache Jetspeed 项目,将提供包括数据库访问、基于角色的安全性及支持无线标记语言(Wireless Markup Language,WML)在内的大型功能集。Apache Pluto 是 JSR 168 的参考实现,这意味着它可以根据标准管理和显示 portlet,但是不能提供开发人员所需的附加功能。JBoss 门户也十分流行,而且是在 Lesser GNU Public License (LGPL) 下发布的。

本教程将使用 Liferay 门户平台来组织内容。此平台是在 MIT License 下发布的,这意味着您可以使用它用于个人目的而无需支付版税。除了提供框架以供显示 portlet 以外,它还集成了大量功能,包括:

  • 基于 Web 的分布式创作与版本控制(Web-based Distributed Authoring and Versioning,WebDAV)。
  • 完整的内容管理系统(Content Management System,CMS)。
  • 通过轻量级目录访问协议(Lightweight Directory Access Protocol,LDAP)修改目录。
  • 语言转换。
  • 支持包括 Geronimo 在内的多种不同应用服务器。
  • 许多免费的示例 portlet,包括聊天客户端、日历、时钟和 RSS 摘要。

此外,Liferay 包含一个大型框架,可用于把内部网应用程序部署到分散的位置。通过这种方法,大型机构中的管理员可以为机构的每个分支机构、办公地点和社区自定义门户。

Geronimo 应用服务器

在本教程中,您将把示例门户和 portlet 应用程序部署到 Geronimo 应用服务器中。(Geronimo 是由 Apache Software Foundation [ASF] 在 Apache License 下发布的)。Geronimo 应用服务器是经过完全认证的 Java 2 Platform, Enterprise Edition (J2EE) 1.4 应用服务器,并且尽管推出不久,却在功能、可靠性和性能等方面与商业产品不分伯仲。IBM® WebSphere® Application Server Community Edition 就是基于 Geronimo 的。

Geronimo 被构造为模块化的管理对象集,称为 Geronimo Bean (GBean)。每个组件都是包装在 GBean 中的,并且将公开其生命周期以供其他组件交互。Geronimo 中最重要的一些组件包括:

  • ActiveMQ Message Broker
  • OpenEJB Enterprise JavaBean (EJB) 容器
  • Tomcat 或 Jetty Web 容器
  • 基于远程方法调用(Remote Method Invocation,RMI)的命名服务
  • Apache Derby 关系数据库管理系统(Relational Database Management System,RDBMS)

Geronimo 可以使用 Tomcat 或 Jetty Web 容器来部署其应用程序,但是本教程依赖于安装了 Tomcat 的 Geronimo。如果单独使用过 Tomcat,则本文中描述的大部分操作看上去将十分熟悉。但是,您不能直接访问 Tomcat。相反,您将需要使用以下三种 Geronimo 部署方法中的一种来部署应用程序:

  • deploy 命令行工具
  • Geronimo Web 控制台
  • Hot Deployer

最后这一个选项涉及把 Web 应用程序发送给 $(GERONIMO)/deploy 目录,Geronimo 将检测到它。在本教程中,Eclipse 将自动执行热部署。

在部署过程中,Geronimo 将在其资源库中为应用程序创建一个新元素。此元素称为工件,是由特定的目录结构标识的。依赖于此元素的所有应用程序都必须了解此结构。在本文中,示例 portlet 应用程序将依赖于 Liferay 工件,并且我将向您展示如何把此依赖性通知给 Geronimo。但是首先,您必须知道如何获得和配置本教程需要使用的软件。

返回

创建 Eclipse 环境

为 portlet 应用程序编写代码并不困难。困难的部分是获得和安装所需的所有软件,这样才可以在 Eclipse 中为 portlet 编写代码并使用 Geronimo 部署 portlet。

必备的软件组件

您需要以下四个主要组件:

  • WTP 1.5.1此组件允许您为动态 Web 应用程序创建和编辑 Eclipse 项目。它还允许使用 Web 服务器或应用服务器直接部署这些应用程序。
  • Geronimo Server Runtime此 Eclipse 插件将启用 WTP 功能来访问 Geronimo 服务器并使用它来部署应用程序。
  • Geronimo 应用服务器Geronimo 服务器将在 Liferay 门户内部署 portlet 应用程序。
  • Liferay 门户Liferay Web 应用程序将提供用于保存和显示 portlet 的结构化框架。

安装 Web Tools Platform

Eclipse WTP 在本教程中扮演两个重要角色:

  • 它将提供一种简单的方法用于组织 Web 应用程序项目并把它们导出为 WAR 文件。
  • 使用适当的附加功能,它将成为用于启动、停止和与 Geronimo 服务器通信的控制面板。

简言之,WTP 使您可以通过指向和单击来完成从源代码到应用程序部署的过程。

要安装 WTP,请执行以下步骤:

  1. 打开 Eclipse,并单击 Help > Software Updates
  2. 选择 Find and Install,然后选择 Search for New Features to Install 选项。
  3. 单击 Next。将显示图 1 中所示的窗口。

    图 1. 选择 update site
    选择 update site


     
  4. 选择 Callisto Discovery Site 复选框,然后单击 Finish

    注:Callisto Discovery Site 包装了诸如 WTP 之类的大型功能项目并确保它们之间的版本兼容性。

  5. 当镜像站点的列表显示时,单击 OK。将显示图 2 中所示的页面。

    图 2. 选择 WTP 功能
    选择 WTP 功能


     
  6. 选中 Web and J2EE Development 复选框。这将告诉管理器下载与 Eclipse WTP 对应的功能。您将看到一条警告,说明此功能需要附加功能才能运行。为了确保配有所有必要的依赖关系,例如 Visual Editor、Graphical Editor Framework (GEF) 和 Eclipse Modeling Framework (EMF),单击 Select Required。当警告消失后,单击 Next 并接受许可协议。
  7. 单击 Next,然后单击 Finish

    注:如果您仍然看到依赖关系的警告,甚至在单击 Select Required 之后,则可能需要获得一个更新的或者可能更稳定的 Eclipse 版本。

  8. 选择安装所有功能,并重新启动 Eclipse。要检验已添加的功能,请转至 Help > About Eclipse SDK,并单击 Feature Details

返回

安装 Geronimo 应用服务器

现在您已经安装了 WTP,您将发现很多新类别的 Eclipse 项目,包括 EJB 项目、J2EE 项目和 Web 项目。在 Web 类别下,您可以创建动态 Web 项目和静态 Web 项目。本教程中的 portlet 项目是动态 Web 项目,但是要用 Geronimo 部署项目,您必须获得 Geronimo 运行时服务器。

为 Geronimo 应用服务器添加 WTP 支持

要为 Geronimo 应用服务器添加 WTP 支持,请执行以下步骤:

  1. 选择 Window > Preferences,打开 Server 类别,然后选择 Installed Runtimes。首选项页面应当类似图 3 的顶部所示。



    图 3. 向 Eclipse 添加服务器运行时
    添加服务器运行时

     
  2. 单击右侧的 Add 来添加一个新的服务器运行时。图 4 中所示的 New Server Runtime 窗口将显示 WTP 已经支持若干种服务器,包括 JBoss 和 Tomcat。但遗憾的是,并未列出 Geronimo。
  3. 单击 Don't see your vendor listed? Click here 链接以查看哪些附加服务器运行时可用。

    图 4. 可用的服务器运行时
    可用的服务器运行时


     
  4. 在 Install New Server 窗口中,选择首选版本的 Geronimo(本教程将使用 1.1 版),然后单击 Next。请记住版本号。
  5. 接受许可协议,单击 Finish,然后在显示的窗口中单击 OK
  6. Eclipse 将下载 Geronimo 运行时环境并询问是否需要重新启动工作区。单击 Yes

下载 Geronimo

到目前为止,您已经把 Eclipse WTP 并入 Eclipse,并添加了对 Geronimo 应用服务器的支持。下一项任务是下载服务器本身。

要下载 Geronimo 应用服务器,请执行以下步骤:

  1. 选择 File > New > Other,然后选择 Server 类别下的 Server 选项。
  2. 单击 Next 以再次查看 Define a New Server 窗口。这一次,当您打开 Apache 类别时,您将看到 Geronimo 选项。
  3. 选择为其安装了支持的 Geronimo 版本,然后单击 Next
  4. 在下一个窗口中,在 Application Server Installation Directory 框中键入目录位置,并且确保选中 Geronimo with Tomcat 选项。
  5. 单击 Download and Install,然后单击 OK
  6. 下载完成时,单击 Finish
  7. 要测试服务器,请选择 Window > Open Perspective > Other 再选择 J2EE 打开 J2EE Perspective。如图 5 所示,一组新的选项卡将显示在工作区下方的视图部分。

    图 5. 启动 Geronimo 服务器
    启动 Geronimo 服务器


     
  8. 单击 Servers 选项卡,然后单击 Run(用蓝色圈起的部分)。

查阅 Console 视图以查看哪些 Geronimo 模块以及应用程序模块和 Web 应用程序正在启动。要查看主 Geronimo 管理控制台,单击球形工具栏条目,并在地址字段中键入 http://localhost:8080/console。键入用户名 system 和密码 manager。浏览器视图应当如图 6 所示。


图 6. Geronimo 管理控制台
Geronimo 管理控制台
 

注:如果在工具栏中没有看到球形条目,请选择 Window > Show View > Other,然后在 General 类别下选择 Internal Web Browser 选项。

您将在下一部分中使用此控制台,因此建议您一直打开它。如果需要停止 Geronimo,只需在 Servers 选项卡可见的情况下单击 Run 按钮右侧的红色正方形。

返回

安装 Liferay 门户平台

Liferay 门户已经开发了六年多,但是仅在最近才添加了对 Geronimo 的全面支持。请查看 Liferay 站点中的各种安装说明,以及这些说明是否已经过时。

要安装 Liferay 门户,请执行以下步骤:

  1. 在 Liferay 站点中(请参阅 参考资料),单击顶部的 Downloads 链接。
  2. 向下滚动,直到您看到 Application Server Plugins 部分。至少应当有两个用于下载 Configuration Archive (CAR) 文件的链接:
    • liferay-portal-geronimo-tomcat-a.b.c.car 包含将插入 Geronimo 服务器的 Liferay 模块。
    • liferay-portal-geronimo-derby-pool-a.b.c.car 包含把 Liferay 与 Geronimo 安装附带的 Derby 数据库模块连接起来所需的文件。
  3. 单击这些链接。下载两个插件后,在 Eclipse Web 浏览器中返回至 Geronimo 应用程序控制台。
  4. 由于已经分别下载了这些插件而不是访问插件库,因此需要在命令行中使用 Geronimo 的 deploy 命令。此文件(Microsoft® Windows® 中的 deploy.bat,或者 UNIX® 或 Linux® 中的 deploy.sh)将驻留在 Geronimo 的顶级 bin 目录中,因此把此目录添加到 PATH 环境变量中。
  5. 打开命令提示符,切换到包含两个 CAR 文件的目录,并按顺序键入以下命令(记住,默认用户名为 system,密码为 manager):

    deploy install-plugin liferay-portal-geronimo-derby-pool-a.b.c.car
    deploy install-plugin liferay-portal-geronimo-tomcat-a.b.c.car


    如果在第二个安装过程中收到错误,请不要担心。它可能表示第二个插件已正确安装,但是不能启动。
  6. 要解决问题,请转至 Geronimo 管理控制台,并单击 Applications 标题下的 Web App Wars 链接。显示 Geronimo 的 Web 应用程序的新窗口应当类似图 7。

    图 7. 在 Geronimo 中启动 Liferay 控制台
    在 Geronimo 中启动 Liferay 控制台

    您可以在 URL 列中看到每个应用程序的上下文。顶级应用程序将使用 /remote-deploy 上下文,并且 Tomcat 服务器的控制台将使用根上下文或 /
  7. 但是最后一个应用程序 Liferay 门户还需要此根上下文,因此请在 geronimo/welcome-tomcat/a.b.c/car 所在的行中单击 Uninstall 来卸载 Tomcat 控制台。然后,通过单击 Start 来启动 Liferay 门户。

    注:这些操作都不会影响 Geronimo 控制台。

  8. 这将花费一些时间,但是在 Geronimo 启动 Liferay 门户应用程序之后,请在 Eclipse Web 浏览器中转至 http://localhost:8080/。显示的页面将类似 Liferay 主页;要查看门户,请单击右上方的 Sign in 链接。然后,在显示的文本框中,键入用户名 test@liferay.com 和密码 test。如果一切运行正常,您将看到图 8 所示的页面。

    图 8. Liferay 门户
    Liferay 门户

     

在继续之前,请花几分钟来浏览 Liferay 门户。研究 portlet 并单击不同的链接和选项卡。当开始创建您自己的应用程序时,从时钟到日历的所有这些功能都能够使用。

返回

部署描述符

既然已经用 Geronimo 部署了 Liferay 门户,那么您就已经准备好添加 portlet。此示例将展示如何创建一个简单的、显示所有可用属性的 portlet。它开始于 Eclipse 设置和部署描述符,结束于添加 servlet 和 JSP 应用程序。

注:如果不愿键入每行代码,您可以获取完整的 Eclipse 项目(请参阅 下载)。下载代码样例后,请选择 File > Import,然后在 General 标题下选择 Existing Projects into Workspace 选项。

创建 web.xml

要创建所需的 web.xml 和 geronimo-web.xml 文件,请执行以下步骤:

  1. 在 Eclipse 内,选择 File > New > Project
  2. 在 Web 选项下选择 Dynamic Web Project
  3. 把项目命名为 simpleportlet,然后单击 Finish。在项目中打开文件夹时,项目应当类似图 9 所示。

    图 9. Portlet 项目的初始结构
    项目结构


     

两个重要的部署描述符将显示在项目的底部:web.xml 和 geronimo-web.xml。前者将大致描述 Web 组件,而后者将告诉 Geronimo 应当如何打包和部署应用程序。在项目中,修改 web.xml 使其内容与清单 1 中所示的内容相匹配。这意味着删除 welcome-file-list 元素并添加 context-paramlistenerservletservlet-mappingtaglib 元素,每个元素在清单中显示为粗体。


清单 1. web.xml 部署描述符
 
                    
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
   <display-name>simpleportlet</display-name>
   <context-param>
                    <param-name>company_id</param-name>
                    <param-value>liferay.com</param-value>
                    </context-param>
                    <listener>
                    <listener-class>
                    com.liferay.portal.kernel.servlet.PortletContextListener
                    </listener-class>
                    </listener>
                    <servlet>
                    <servlet-name>simpleportlet</servlet-name>
                    <servlet-class>
                    com.liferay.portal.kernel.servlet.PortletServlet
                    </servlet-class>
                    <init-param>
                    <param-name>portlet-class</param-name>
                    <param-value>org.dworks.SimplePortlet</param-value>
                    </init-param>
                    <load-on-startup>0</load-on-startup>
                    </servlet>
                    <servlet-mapping>
                    <servlet-name>simpleportlet</servlet-name>
                    <url-pattern>/simpleportlet/*</url-pattern>
                    </servlet-mapping>
</web-app>
 

创建 geronimo-web.xml

本教程的第二个部署描述符 geronimo-web.xml 将完成两项任务:

  • 它将告诉 Geronimo 在其资源库中存储应用程序的位置和方法。
  • 它将指定 portlet 应用程序依赖于 Liferay 门户模块。

向您的文件中添加清单 2 中的粗体文本。


清单 2. geronimo-web.xml 部署描述符
 
                    
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://geronimo.apache.org/xml/ns/j2ee/web-1.1" 
xmlns:nam="http://geronimo.apache.org/xml/ns/naming-1.1" 
xmlns:sec="http://geronimo.apache.org/xml/ns/security-1.1" 
xmlns:sys="http://geronimo.apache.org/xml/ns/deployment-1.1">
   <sys:environment>
      <sys:moduleId>
         <sys:groupId>default</sys:groupId>
         <sys:artifactId>simpleportlet</sys:artifactId>
         <sys:version>1.0</sys:version>
         <sys:type>car</sys:type>
      </sys:moduleId>
      <sys:dependencies>
                    <sys:dependency>
                    <sys:groupId>liferay</sys:groupId>
                    <sys:artifactId>liferay-portal-tomcat</sys:artifactId>
                    </sys:dependency>
                    </sys:dependencies>
   </sys:environment>
</web-app>

 

<moduleId> 元素将包含四个子元素,用于指定项目的已部署模块应当放在 Geronimo 资源库中的位置:

  • groupId创建文件的实体(例如 Apache)
  • artifactId文件名
  • version文件版本
  • type文件的格式(例如,JAR)

但是要声明应用程序的模块依赖关系,描述符只需要标识 Liferay 门户的 groupIdartifactId 子元素。要查看这些参数怎样与文件位置关联起来,请在 Geronimo 的顶级目录下打开资源库目录。每个资源库子目录将从模块的 groupId 中获得其名称,并且可以在 $(GERONIMO)/repository/groupId/artifactId/version 文件夹中找到每个模块文件。

返回

创建 portlet 描述符

web.xml 和 geronimo-web.xml 文件足以部署 servlet 或基于 JSP 的应用程序,但是您需要将第三个部署描述符 portlet.xml 用于 portlet 应用程序。然后,由于此 portlet 必须被集成到 Liferay 门户中,因此需要另外两个文件:liferay-portlet.xml 和 liferay-display.xml。

创建 portlet.xml

在项目的 WEB-INF 目录中创建名为 portlet.xml 的文件,并把清单 3 中的内容添加到其中。这里的元素与 web.xml 中的那些 servlet 拥有相同的名称和函数,因此这将看上去十分熟悉。关于 portlet 描述符的一个关键差别是它们描述哪些操作模式可用于 portlet。JSR 168 引入了基本的 View、Edit 和 Help 模式,但是您可以根据需要创建自定义模式。portlet 仅需要使用 view 模式;由于清单 3 中的 <supports> 元素下没有 <portlet-mode> 子元素,因此 View 模式是这个简单的 portlet 惟一支持的一种模式。

清单 3. portlet.xml 部署描述符
 

                    
<?xml version="1.0"?>
<portlet-app xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd" 
version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd 
http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd">
   <portlet>
      <portlet-name>simpleportlet</portlet-name>
      <display-name>Simple Portlet</display-name>
      <portlet-class>org.dworks.SimplePortlet</portlet-class>
      <expiration-cache>0</expiration-cache>
      <supports>
         <mime-type>text/html</mime-type>
      </supports>
      <portlet-info>
         <title>Simple Portlet</title>
         <short-title>Simple Portlet</short-title>
         <keywords>Simple Portlet</keywords>
      </portlet-info>
      <security-role-ref>
         <role-name>administrator</role-name>
      </security-role-ref>
      <security-role-ref>
         <role-name>guest</role-name>
      </security-role-ref>
      <security-role-ref>
         <role-name>power-user</role-name>
      </security-role-ref>
      <security-role-ref>
         <role-name>user</role-name>
      </security-role-ref>
   </portlet>
</portlet-app>
 

创建 liferay-portlet.xml

在 WEB-INF 目录中创建另一个名为 liferay-portlet.xml 的文件,并且添加清单 4 中所示的内容。此文件将把 portlet.xml 的安全角色与 Liferay 中特定并类似命名的角色相匹配。如果 instanceable 元素被设为 true,则 portlet 可被多次添加到 Liferay 门户的布局中。


清单 4. liferay-portlet.xml 部署描述符
 
                    
<?xml version="1.0"?>
<!DOCTYPE liferay-portlet-app PUBLIC "-//Liferay//DTD Portlet Application 4.2.0//EN" 
"http://www.liferay.com/dtd/liferay-portlet-app_4_2_0.dtd">
<liferay-portlet-app>
   <portlet>
      <portlet-name>simpleportlet</portlet-name>
      <instanceable>true</instanceable>
   </portlet>
   <role-mapper>
      <role-name>administrator</role-name>
      <role-link>Administrator</role-link>
   </role-mapper>
   <role-mapper>
      <role-name>guest</role-name>
      <role-link>Guest</role-link>
   </role-mapper>
   <role-mapper>
      <role-name>power-user</role-name>
      <role-link>Power User</role-link>
   </role-mapper>
   <role-mapper>
      <role-name>user</role-name>
      <role-link>User</role-link>
   </role-mapper>
</liferay-portlet-app>
 

创建 liferay-display.xml

在 WEB-INF 目录中创建最后一个 .xml 文件 liferay-display.xml,并添加清单 5 中所示的内容。此文件将告诉门户 portlet 将列于哪个类别中。在说明如何部署和查看 Liferay portlet 的过程中,我将介绍 Liferay 类别。现在,您需要知道的就是这个简单的 portlet 应用程序将归入 Test 类别。


清单 5. liferay-display.xml 描述符
 
                    
<?xml version="1.0"?>
<!DOCTYPE display PUBLIC "-//Liferay//DTD Display 4.0.0//EN" 
"http://www.liferay.com/dtd/liferay-display_4_0_0.dtd">
<display>
   <category name="category.test">
      <portlet id="simpleportlet" />
   </category>
</display>

 

创建完五个描述符(web.xml、geronimo-web.xml、portlet.xml、liferay-portlet.xml 和 liferay-display.xml)后,您已经把服务器与门户连接了起来。接下来,您将为 portlet 的实际操作编写代码。

返回

构建和部署基于 servlet 的 portlet

创建 SimplePortlet 类,并把应用程序部署到 Geronimo 应用服务器中。

GenericPortlet 超类

在查看 SimplePortlet 类的代码之前,我需要简要介绍一下它的超类 GenericPortlet。此类的两个主要操作方法包括:

  • processAction(ActionRequest request, ActionResponse response)更改 portlet 的模式或状态信息
  • render(RenderRequest request, RenderResponse response)根据当前模式和状态信息显示 portlet

默认情况下,render() 方法将根据内置的 portlet 模式调用三种方法之一:doView()doEdit()doHelp()。如前述,View 方法是惟一需要的模式,因此 SimplePortlet 类仅包含 doView() 方法。

Eclipse WTP 将把许多库添加到项目的 CLASSPATH 中,但是这些库中都不包含 portlet 类。值得庆幸的是,Geronimo 在 $(GERONIMO)/repository/portlet-api/portlet-api/1.0 目录中附带了必要的库(截至本文完稿时为 portlet-api-1.0.jar)。您可以把此文件粘贴到 Eclipse 项目中,创建一个指向此位置的 CLASSPATH 变量,或将其复制到 $(GERONIMO)/lib/ext 目录中,但是您必须使此文件可用于项目才能正确地进行编译。

创建 SimplePortlet 类

要创建 SimplePortlet 类,请执行以下步骤:

  1. 右键单击项目名称,然后选择 New > Class
  2. 在显示的窗口中,键入 org.dworks 作为软件包的名称,键入 SimpleProject 作为类的名称。窗口的上半部分应当类似图 10。

    图 10. 新的 portlet 类
    新的 portlet 类

     
  3. 单击 Finish
  4. 键入或粘贴清单 6 中所示的代码。

    清单 6. SimplePortlet.java
     
                                
    package org.dworks;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import javax.portlet.GenericPortlet;
    import javax.portlet.RenderRequest;
    import javax.portlet.RenderResponse;
    import javax.portlet.PortletException;
    
    public class SimplePortlet extends GenericPortlet {
       protected void doView(RenderRequest request, RenderResponse response)
          throws PortletException, IOException {
    		
          String portletName = "Portlet Name: " + getPortletConfig().getPortletName();
          String companyName = "Company Name: " + getPortletConfig().getPortletContext()
             .getInitParameter("company_id");
          response.setContentType("text/html");
          PrintWriter out = response.getWriter();
          out.println(portletName+"<br />"+companyName);
       }
    }
    


     

portlet 的操作十分简单。doView() 方法将访问配置对象(PortletConfig)以获得 portlet 的名称。然后它将使用其上下文对象(PortletContext)以获得在 web.xml 中指定的初始参数。像常规的 servlet 一样,它将通过获得响应对象的 PrintWriter 来显示这些信息。

默认情况下,Eclipse 将把应用程序的上下文设为项目名称。但是对于 portlet 项目,您必须把上下文设定为与其门户的上下文相同,对于 Liferay 来说只是根目录。要更改此目录:请执行以下步骤:

  1. 右键单击 Navigator 上的项目名称,然后选择 Properties
  2. 选择右侧的 Web Project Settings 选项。
  3. 在 Context Root 框中删除所有 文本。

图 11 将显示我的项目结构。您的项目结构可能不同,但是您应当确保项目文件位于正确的文件夹中。


图 11. 已完成的 Portlet 项目的结构
已完成的 Portlet 项目的结构
 

把应用程序部署到 Geronimo 中

  1. 启动 Geronimo 服务器(如果尚未启动),并且确保它将装入 Liferay 门户模块。
  2. 要部署应用程序,请右键单击项目名称,然后选择 Run As > Run on Server
  3. 如果显示窗口,请单击 Finish。Eclipse 浏览器应当显示 Liferay 门户,网址为 http://localhost:8080/。
  4. 您不会在门户中立即看到更改,因为您尚未添加 portlet 内容。要添加 portlet,请单击 Add Content 链接(图 12 中圈起的部分)。

    图 12. 向 Liferay 门户中添加一个新的 portlet
    向 Liferay 门户中添加一个新的 portlet

     
  5. 打开 Test 类别,并单击 Simple Portlet 选项旁边的 Add。您应当会在门户中看到一个如图 13 所示的新窗口。

    图 13. 新 Portlet 窗口
    新 Portlet 窗口

返回

构建基于 JSP 的 portlet

SimplePortlet servlet 真的十分简单,但是把 HTML 从 Java 类中提取出来并将其添加到 JSP 页面中将更方便些。实现此操作需要四个步骤:

  1. 把标记库描述符(Tag Library Descriptor,TLD)及其 JAR 文件添加到项目中。
  2. 更新 web.xml 部署描述符来标识 TLD。
  3. 修改 servlet 类以快速处理 JSP 页面。
  4. 在项目内创建 JSP 页面。

此过程将不会更改项目名称或它在 Geronimo 和 Liferay 中的部署,因此除了 web.xml 以外无需更改任何一个部署描述符。

使 Geronimo 指向 TLD

要使 Geronimo 应用服务器指向 TLD,请执行以下步骤:

  1. 打开 $(GERONIMO)/repository/liferay/liferay-portal-tomcat/x.y.z/
    liferay-portal-tomcat-x.y.z.car/WEB-INF 文件夹。这其中保存着两个重要目录:lib 和 tld。
  2. 在 lib 目录中,把 util-taglib.jar 文件复制到 Eclipse 项目的 WEB-INF 文件夹的相应 lib 目录中。它将从本文件夹中消失并且将作为一个与项目相关的 Web App Libraries 重新出现。
  3. 在 Eclipse 项目的 WEB-INF 文件夹下创建一个名为 tags 的文件夹。
  4. 转至 tld 目录并把 liferay-portlet.tld 文件复制到创建的新 tags 文件夹中。
  5. 要告诉 Geronimo 在哪里可以找到刚添加的 TLD,请创建可以识别它的统一引用标识符(Uniform Reference Identifier,URI)。把清单 7 中所示的 <jsp-config> 元素添加到 web.xml 文件的末尾,并保留描述符的其余部分不动。

    清单 7. 更新后的 web.xml
     
                                
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    
       ...
    
       <jsp-config>
          <taglib>
             <taglib-uri>http://java.sun.com/portlet</taglib-uri>
             <taglib-location>/WEB-INF/tags/liferay-portlet.tld</taglib-location>
          </taglib>
       </jsp-config>
    </web-app>
                  

     
  6. 新 servlet 将不直接访问 RenderResponse,但是它将快速处理 JSP 页面。把 doView 方法更改为清单 8 中所示的代码。

    清单 8. SimplePortlet.java 的更新后的 doView() 方法
     
                                
    protected void doView(RenderRequest request, RenderResponse response)
       throws PortletException, IOException {
    
       PortletRequestDispatcher prd = 
          getPortletContext().getRequestDispatcher("/view.jsp");
       prd.include(request, response);
    }
    

     

清单 9 中所示的 JSP 代码将使用特定于 portlet 的标记来访问 portlet 的配置对象。它将提供与先前 servlet 相同的输出,但是 HTML 结构将使它更易于阅读和更改。

注:Eclipse 可能会向您提示错误,说明无法解析 portletConfig 对象,但是它仍然应当能够正确部署和显示。


清单 9. View.jsp
 
                    
<%@ taglib prefix="portlet" uri="http://java.sun.com/portlet" %>

<portlet:defineObjects />

Portlet Name: <%= portletConfig.getPortletName() %>
Company Name: <%= portletConfig.getPortletContext().getInitParameter("company_id") %>

 

defineObjects 标记将使 renderRequestrenderResponseportletConfig 对象可在 JSP 页面内访问。然后 portletConfig 对象将提供对 portlet 的名称和上下文对象的访问。

其他可用的标记包括告诉 portlet 执行操作的 actionURL 标记,以及把呈现请求发送给 portlet 的 renderURL 标记。namespace 将废弃一部分代码,仅使用与 portlet 相关的标识符。

返回

结束语

本教程主要介绍了如何用 Eclipse、Geronimo 和 Liferay 门户平台编码和部署基本的 JSR 168 portlet 应用程序。这次具体的讨论介绍了如何获得这些必要的组件并把它们集成到 Eclipse 项目内。特别地,您了解了两个基本 portlet 项目:一个将使用 servlet 来生成标记,另一个将使用 JSP 页面。我希望您将能够在这些项目的基础上构建自己的模块化应用程序。

本教程没有深入介绍门户和 portlet 的基础理论。但是由于这个主题非常吸引人,因此我希望简要介绍一下 portlet 标准 JSR 286,以及它必须提供的内容,从而结束本文。它的主要目标之一是在诸如事件共享和分散会话数据之类的 portlet 之间提供改进的通信和协作。另一个目标是把 portlet 的异步呈现标准化,从而为开发人员提供一种通用的方法来创建基于 Asynchronous JavaScript + XML (Ajax) 的门户。

使用这种紧密集成的动态 portlet,可以基于 portlet 而不是插件来构建类似 Eclipse 的 Web 应用程序。也就是说,访问站点的用户将发现与 Eclipse 关联的同类型的 GUI —— 用一个通用编辑器与各种视图进行交互并显示其信息。当然,用户将需要使用快速连接,而服务器将需要快速运行。尽管如此,仍然十分有可能实现此类门户和 portlet。

返回

下载

描述 名字 大小 下载方法
基于 Servlet 的门户应用程序1 simpleportlet-servlet.war.zip 4KB HTTP
基于 JSP 的门户应用程序2 simpleportlet-jsp.war.zip 91KB HTTP

更多下载

Notes

  1. 使用 servlet 的示例 portlet 项目
  2. 使用 JSP 页面的示例 portlet 项目。这两个项目的名称相同,因此不能将它们同时导入 Eclipse 工作区。

返回

参考资料

学习
  获得产品和技术 讨论

返回

 

组织简介 | 联系我们 |   Copyright 2002 ®  UML软件工程组织 京ICP备10020922号

京公海网安备110108001071号