使用EclipseGanymede进行桌面、Web和移动设备开发,第2部分(二

第2部分: 采用Ganymede进行富客户机平台开发

在工作空间中选择 com.devworks.tuTorial.po 并单击 Add Required Bundles。另外 ,单击 Validate Bundles 以确保已经包括所需的一切内容。

已经配置的 OSGi 框架包括 Jetty 服务器。Jetty 是轻量级开源 Web 服务器和 servlet 容器,并且在从工作区内部署它时由 Eclipse 使用以启动 RAP 应用程序。您可 以在 Arguments 选项卡中配置 Jetty 的启动值。

图 18. 设置 Jetty 实参

例如,在默认情况下,Jetty 将侦听端口 9090。如果需要更改此端口值,您可以修改 将此端口更改为其他端口的 VM 实参。如果是在 OS X 上进行开发,请将 – Djava.awt.headless=true 添加到 VM 实参中。要保存此启动配置,请选择 Common 选项 卡,然后将 Shared file 值编辑为 direcTory com.devworks.tuTorial.po/launch。单 击 Apply,然后单击 Run。通过设置共享文件,Eclipse 将在运行时保存配置。

图 19. 运行启动配置

当然,单击 Run 也将启动 Jetty 服务器并随所选包一起启动 OSGi 框架。您可以在 Eclipse 控制台中看到该活动。

图 20. 查看环境启动

备忘记事本应用程序现在在启动配置中指定的端口上本地运行(在我们的示例中,我 们保留了默认值 9090)。浏览到 http://localhost:9090/rap 并查看备忘记事本应用程 序的运行。

图 21. 在浏览器中运行备忘记事本

实质上,您到这里尚未做任何代码更改,因此可以看到您已经掌握的大部分 RCP 应用 程序开发知识适用于 RAP。但是,在不得不删除对 CellEdiTor 的引用时失去了一些功能 ;在这个版本的备忘记事本中,您无法编辑任务详细信息。

恢复编辑功能

由于 RAP 没有单元编辑器,因此让我们用对话框编辑任务详细信息。在用户双击任务 和添加新任务时,将调用该对话框。在编辑器中打开 PersonalTaskViewer.java 类并修 改 createTableViewer 方法。

清单 3. 替换 PersonalTaskViewer 类中的 CellEdiTor 功能

private void createTableViewer(final Composite composite) {   tableViewer = new TableViewer(table);   tableViewer.setUseHashlookup(true);   tableViewer.setColumnProperties(columnNames);   // Enable Task Editing by Invoking the PersonalTaskDialog   tableViewer.addDoubleClickListener(new IDoubleClickListener() {     public void doubleClick(DoubleClickEvent event) {       if (tableViewer.getSelection() != null) {         PersonalTask task = (PersonalTask)  ((IStructuredSelection)tableViewer.getSelection()).getFirstElement();         openPersonalTaskDialog(composite.getShell(), task,POUtilities.DIALOG_MODE_EDIT);       }     }   });   // Set the default sorter for the viewer   tableViewer.setSorter(new PersonalTaskSorter (PersonalTaskSorter.TASK_DESC));

只要用户双击 Task,就可以从选择中检索该任务并传递给 PersonalTaskDialog,它 包含在本教程的源代码中。

图 22. 在任务备忘记事本中运行 CellEdiTor 替换

为 Add 按钮的双击事件添加类似代码,以便在用户单击 Add 时调用对话框。反过来 ,在 PersonalTaskDialog 类中对单击 OK 按钮的事件使用一个方法,更新或向 PersonalTaskModel 中添加任务。

清单 4. 向 PersonalTaskModel 中添加数据的 OKSelection 方法

public class OKSelection extends SelectionAdapter {   public void widgetSelected(SelectionEvent e) {     super.widgetSelected(e);     personalTask = getModifiedTask();     if (dialogMode.equals(POUtilities.DIALOG_MODE_EDIT)) {       taskModel.taskChanged(personalTask);     } else if (dialogMode.equals(POUtilities.DIALOG_MODE_NEW))       taskModel.addTask(personalTask);     }     taskDialogShell.dispose();   }}

我们已经为全局常量、映像和 SWT Center 及 Pack 实用程序添加了新实用程序类 POUtilities。该类也包含在本教程的源代码中。

您现在拥有一个全功能 RAP 应用程序,几乎全部由为 RCP 编写的代码组成。在下一 节中,您将重构这段代码,以便它拥有适用于 Web 的界面外观。

为 Web 重构

只进行了少量的修改,您已经把 RCP 应用程序迁移到 RAP,但是外观和感觉并不符合 您所需要的基于 Web 的应用程序的外观和感觉。RAP 拥有自定义应用程序的机制:主题 化与标记。主题化基于层叠样式表(Cascading Style. Sheet,CSS)构建,用于自定义外 观和感觉;而标记用于在浏览器中自定义特定于应用程序的设置。

标记(Branding)任务备忘记事本

此时,任务备忘记事本是使用默认 URL 启动的(http:localhost:9090/rap),该 URL 将不会告诉用户关于正在运行的应用程序的任何信息。浏览器中的标题(如图 23 所 示)也是一个相当乏味的 RAP 启动页面。

图 23. 查看 RAP 部署的默认值

标记化将允许您将这些值修改为对于应用程序更有意义的内容,并且还为用户提供在 运行备忘记事本时关闭浏览器情况下的处理机制。这种标记化类似于为 RCP 应用程序执 行的标记化,但是它将提供对于 Web 有用的额外属性。

要标记备忘记事本,请打开 plugin.xml 并浏览到 Extensions 选项卡。

图 24. 添加标记扩展点

单击 Add 并选择 org.eclipse.rap.ui.branding。

图 25. 选择标记扩展点

单击 Finish,然后系统将把标记扩展点添加到 plugin.xml 中。现在,您可以同样设 置属性窗格中的属性,如图 26 所示:

id: com.devworks.tuTorial.po.branding此属性将为扩展提供惟一 ID。 servletName: taskOrganizer允许用户通过 localhost:9090/taskOrganizer 而不是 /rap 访问应用程序。title: Personal Task Organizer在浏览器中显示为 Web 页面的标 题(位于标题栏或者选项卡中)。favicon: icons/alt_window_16.gif可用作在 第 1 部 分 中完成的工作的一部分,但是如果在 .ico 文件中有您自己的标识,请使用该标识, 因为许多浏览器仅接受 .ico 作为 favicon。exitConfirmation: Do you want to Exit Personal Task Organizer?在运行应用程序时,如果用户关闭浏览器或者浏览到其他 URL ,将显示在对话框中。

图 26. 设置标记属性

这将把清单 5 中的代码添加到 plugin.xml 中。

清单 5. 通过标记 plugin.xml 添加属性

        exitConfirmation="Do you want to Exit Personal Task  Organizer ?"     favicon="icons/alt_window_16.gif"     id="com.devworks.tuTorial.po.branding"     servletName="taskOrganizer"     title="Personal Task Organizer">  

保存文件,并重新启动应用程序。您现在可以通过 localhost:9090/taskOrganizer 浏览到该应用程序,并且您将看到标题现在与输入内容相匹配。

图 27. 查看正在运行的备忘记事本中的被标记属性

根据浏览器的不同,您可能还会看到 favicon 已经从默认值变为所选图像。尝试关闭 浏览器。您应当会看到询问是否确认要退出应用程序的对话框出现。

图 28. 确认退出应用程序

您已经标记了应用程序。现在可以用 RAP 的主题化特性更改其界面外观。

将备忘记事本主题化

主题化是基于 CSS 的,并且允许定义部件的颜色、字体、边框、空白和图像。部件自 身将定义哪些属性是可以自定义的,其中一些属性比其他属性更加灵活。不幸的是,文档 中没有说明可以在哪些部件中设置哪些属性,因此必须查看 RAP 源代码,可以在位于 http:/www.eclipse.org/rap/cvs.php 的 CVS 站点获得(可以在 Eclipse 中将这段源代 码作为独立项目导入)。在 org.eclipse.rap.rwt 包中查找名为 *.theme.xml 的文件。

图 29. 查看主题化的 RAP 部件属性

例如,菜单的主题列于 Menu.theme.xml 中,列表列于 List.theme.xml 中等等。这 些文件定义通过 CSS 可以为各自部件设置的主题属性。对于备忘记事本,我们将把文本 、工具栏和表主题化。使用 Package Explorer,在主题的根目录下直接创建目录并命名 为 po_theme。在该目录中,创建名为 po.css 的文件并添加以下 CSS 定义。

清单 6. 包含备忘记事本的主题化属性的 po.css

/* Text */Text[BORDER] {  border: 1px solid #1080ee;}/* Toolbar */ToolItem:hover {  background-color: rgb( 200, 200, 200 );}/* Table */TreeColumn:hover, TableColumn:hover {  background-color: #8cc0ea;}

您必须将此文件注册为用于主题化的文件。打开 plugin.xml 并选择 Extensions 选 项卡。单击 Add 并选择 org.eclipse.rap.ui.themes。

图 30. 添加主题扩展点

单击 Finish 把此扩展点添加到 plugin.xml 中。将文件属性值编辑为指向 po_theme/po.css 文件。通过名称属性把此文件属性命名为 Personal Task Organizer Theme 并将 ID 设为 com.devworks.tuTorial.po.theme。

图 31. 设置主题化属性

这将注册主题,但是必须激活该主题,方式是让标记扩展点知道该主题。从扩展列表 中选择 org.eclipse.rap.ui. 标记,并且在 themeId 的属性中,输入 Personal Task Organizer Theme 的 ID:com.devworks.tuTorial.po.theme。

需要确保 Eclipse 在编译时知道查找此文件的位置,因此浏览到 plugin.xml Build 选项卡。在 Binary Build 目录中,一定要选中 po_theme 框。

图 32. 把 po_theme 添加到构建中

保存 plugin.xml 文件并浏览应用程序以查看主题化结果。

图 33. 查看主题化的备忘记事本

通过非常少的编码和一些属性更改,您已经将应用程序修改为可以使用通过 Web 部署 的附加特性。但是为了让代码可以在全世界使用,您不可以依赖 OSGi 框架的内置 Jetty 服务器。在下一节中,您将看到如何打包和部署应用程序以在 Eclipse 外部使用。

打包并部署到服务器中

现在您已经将备忘记事本修改为将其迁移到 RAP,并且已经调整了界面外观以在 Web 中利用其部署,现在我们来看看如何用适用于 Web 部署的方法打包应用程序。在本节中 ,您将了解完成此操作的必需步骤。

摆脱 Eclipse

Jetty HTTP 服务器和 servlet 容器是在开发期间测试应用程序的便利工具,但是在 准备好部署到世界各地后,需要做一些准备以在创建的启动配置中复制 Eclipse 为您完 成的操作。

需要把应用程序部署到 servlet 容器中。对于本示例,我们将使用非常流行的开源 Apache Tomcat,可以在 tomcat.apache.org 获得。您可以使用这个 servlet 容器或其 他标准 servlet 容器,但是在开始本节前,一定要确保所需内容已安装并正确配置,并 且您足够熟悉如何在其中部署应用程序。

有一连串步骤需要遵循,并且要实现干净利落的部署,必须正确完成每个步骤。

导入必备插件

首先,需要在备忘记事本部署中绑定一些必要的插件。要在现有 servlet 容器中启动 应用程序,必须具有 ServlerBridge 插件。这些插件将在 servlet 容器中启动 OSGi 框 架并支持 OSGi HTTP 服务、servlet 和 HTTP 扩展点。简言之,ServletBridge 连接了 OSGi 框架与 servlet 容器。要获得插件,您将从 Eclipse Web 站点导入项目定义文件 ,该文件将把必备插件添加到项目工作空间中。

将 http://www.eclipse.org/equinox/server/downloads/servletbridge-anon.psf 下载到计算机中的临时位置。这刚巧会定义 OSGi 框架(这个 Eclipse 实现被称为 Equinox — 因而是 URL 中的名称)所需的所有插件,并且可以使用它让 Eclipse 获得 所需内容而无需手动输入。

在菜单中,选择 File > Import。在 Import 屏幕中,选择 Team > Team Project Set,并单击 Next。在文件名中输入已下载的 servletbridge-anon.psf 文件的 位置和名称,并单击 Finish。

图 34. 为必备插件导入 servletbridge-anon.psf 文件

这将把四个项目导入工作空间:

org.eclipse.equinox.servletbridge启动框架并为框架提供绑定回 servlet 容器的 位置。org.eclipse.equinox.servletbridge.http绑定回 servlet 桥接并把请求委托给 servlet 容器以提供 OSGi HttpService。org.eclipse.equinox.http.servlet提供在初 始注册 OSGi HttpService 时 http.servletbridge 所使用的 HttpServiceServlet。 org.eclipse.equinox.http.registry提供基于 OSGi HttpService 的 servlet、资源和 HTTP 上下文扩展点。javax.servlet标准 servlet API 的绑定版本。

在这些项目全部下载后,项目组织器将具有独立构建和部署所需的一切,包括 RAP 源 代码、自定义插件和 OSGi(aka Equinox)服务器代码。

图 35. 查看添加的包

创建部署脚本

可以用一系列 Ant 脚本和资源模板执行应用程序构建。由于总是使用这些资源,因此 最简单的是从一个示例开始。查看 org.eclipse.rap.demo.feature 的结构。

图 36. 查看现有构建结构

部署脚本和模板的目录结构:

src/org.eclipse.rap.tools/ConfigIniCreaTor.java这将创建简单 config.ini 文件 的内容。在 Ant 构建脚本(webappBuilder.xml 和 pde.exportFeatures)完成后运行此 文件,然后在构建中替换 config.ini 文件的内容。deployment/rapdemo.war这是最后要 部署的应用程序 WAR 文件。script/webappBuilder.xmlRAP 应用程序的 Web 应用程序构 建脚本,该应用程序将使用 equinox servlet 桥接以在 servlet 容器中运行。此脚本假 定 servlet 桥接项目在当前工作空间中可用。templates/WEB- INF/eclipse/configuration/config.ini用于识别需要启动的关联包的 Eclipse 运行时 配置文件。templates/WEB-INF/eclipse/launch.initemplates/WEB-INF/web.xml

从这里把模板和脚本文件夹复制到 com.devworks.tuTorial.po.feature 包中。

配置部署脚本

从 com.devworks.tuTorial.po.feature 打开 feature.xml 并添加应当随功能一起打 包的必备插件:

com.devworks.tuTorial.pocom.ibm.icuorg.eclipse.core.commandsorg.eclipse.core.contenttypeorg.eclipse.core.databindingorg.eclipse.core.databinding.beansorg.eclipse.core.expressionsorg.eclipse.core.jobsorg.eclipse.core.runtimeorg.eclipse.equinox.apporg.eclipse.equinox.commonorg.eclipse.equinox.http.registryorg.eclipse.equinox.http.servletorg.eclipse.equinox.http.servletbridgeorg.eclipse.equinox.preferencesorg.eclipse.equinox.registryorg.eclipse.equinox.servletbridgeorg.eclipse.osgiorg.eclipse.osgi.servicesorg.eclipse.rap.jfaceorg.eclipse.rap.jface.databindingorg.eclipse.rap.rwtorg.eclipse.rap.rwt.q07org.eclipse.rap.uiorg.eclipse.rap.ui.formsorg.eclipse.rap.ui.viewsorg.eclipse.rap.ui.workbench

图 37 显示了将要添加的插件列表。

图 37. 添加插件

打开 script. 文件夹中的 webappBuilder.xml。此文件是在 templates 文件夹、目标 和 Eclipse 的 PDE 导出特性的帮助下构建的。必须把 servletbridge.dir 属性更改为 下载并存储该包的本地文件系统中的相应路径(在本例中为 C:/temp/eclipse/workspace/org.eclipse.equinox.servletbridge)。还必须把 webapp.name 属性的值改为在特性构建后显示的文件夹。

图 38. 设置 servletbridge.dir 属性

保存文件。现在您已经准备好构建应用程序。

构建应用程序

在 Package Explorer 中,打开 webappBuilder.xml 的上下文菜单,并选择 Run As > Ant Build。

图 39. 构建插件

Eclipse 将显示 Edit 配置和启动窗口。命名为 Task Organizer,然后选择 JRE 选 项卡。确保选中 “Run in the same JRE as the workspace” 单选按钮。这将给工作空 间中的所有必备插件提供构建访问。

单击 Run,然后等待所有必备插件构建完毕。您可以通过控制台监视进度。

图 40. 查看插件构建

在所有构建完成后,在 Package Explorer 中按 F5 键或在上下文菜单中选择 Refresh 刷新 com.devworks.tuTorial.po.feature 项目。现在将看到构建所创建的目录 结构。

图 41. 在 Package Explorer 中查看构建结果

Config.ini 包含在应用程序初始化期间载入的包。在部署前必须更新此文件。一种简 单方法是运行 org.eclipse.rap.demo.feature 中附带的 ConfigIniCreaTor.java 类。 打开此文件并编辑指向插件目录的文件路径以表示插件部署到的位置。在本例中,我们使 用 C:/temp/eclipse/workspace/com.devworks.tuTorial.po.feature/build /PersonalTaskOrganizer/WEB-INF/eclipse/plugins。

图 42. 修改助手类

在 Package Explorer 中打开此文件的上下文菜单并选择 Run 以编译并运行它。它将 在控制台中输出所需配置。

图 43. 助手类的输出

在编辑器中打开 config.ini 文件并把内容从控制台复制到该文件中。一定要保存。 现在可以开始创建 WAR 文件以进行部署。

创建 WAR 文件

WAR 是 Web 归档文件(Web Archive),这是打包 Web 应用程序以轻松地部署到 servlet 容器中的简洁方法。使用 Eclipse 可以轻松地将任何基于 Web 的应用程序打包 到 WAR 中,包括 RAP 应用程序。要创建备忘记事本的 WAR,请在 com.devworks.tuTorial.po.feature 项目中选择 WEB-INF 目录并打开上下文菜单。选择 Export > General > Archive File。

图 44. 将应用程序打包为 WAR 文件

将文件命名为 po.war 并把它放在所选的临时目录中。确保选中整个 com.devworks.tuTorial.po.feature 树,并确保选中 Create only selected direcTories 单选按钮,然后单击 Finish。

您现在有一个名为 po.war 的自包含 WAR 文件,该文件适于在所选 servlet 容器中 部署。在下一节中,我们将展示如何在 Tomcat 中部署它。

在 Tomcat 中部署

在我们的配置中,Tomcat 将在 1234 端口上运行,可是它通常在 8080 端口上运行。 您可以使用内置 Tomcat 管理器部署 po.war 文件。浏览到 http:localhost:1234/manager/html。

图 45. 通过 Tomcat 管理器部署 WAR

在标有 “WAR file to deploy” 的部分中,输入刚创建的 po.war 的路 径和文件名并单击 Deploy。在 Tomcat 完成部署 WAR 后,您可以通过浏览到 localhost:1234/po/taskOrganizer 运行备忘记事本。

图 46. 通过 Tomcat 运行 任务备忘记事本

您现 在已经成功地构建了独立的任务备忘记事本,并在本地 servlet 容器中部署了它(只是 为了证明它是完全自立的,请关闭 Eclipse 并尝试它)。

如果需要让此应用程序 变为活动的应用程序,只需要把同一个 WAR 移到可以公开访问的 Web 服务器中,但是请 记住:为了显示 Ganymede 特性,我们已经简化了此应用程序,因此目前在会话之间并未 存储您的任务,但是有时候任务组织器也可以不必记录昨天所做的工作。拥有完整的类桌 面功能的同一个应用程序可以在所有平台(Windows、Mac OS X 或 Linux®)和所有 品牌的浏览器(Internet Explorer、Firefox、Safari 或 Opera)中顺利地运行,您不 需要作出任何修改,并且用户也不需要安装任何特殊插件或下载软件。

结束语

Eclipse IDE Ganymede 项目发行版包括令人兴奋的 Rich Ajax Platform(RAP)技术,该技术允许使用您已经通过开发 RCP 桌面应用程序所掌握的技巧 构建和部署富 Internet 应用程序。这些 Internet 应用程序拥有桌面应用程序的所有功 能,但是使用了功能强大的分发模型和独立于 Web 的平台。

RAP 是 RCP 的子集 ,因此必须把它下载并作为独立目标平台安装到 Eclipse 环境中。但是作为子集,它允 许利用使用 RCP 开发的现有应用程序,并且只需很少的修改,就可以把这些应用程序转 换为 Web 应用程序。使用通用的业务逻辑代码库,您可以在项目的生命周期内轻松地维 护各个部署环境,而无需完全不同的 UI 逻辑。

通过利用标准部件工具包 (Standard Widget Toolkit,SWT)、JFace 和 Workbench,Eclipse RAP 将实现 RCP 与 Web 之间的连接。

您可以使用 Eclipse OSGi 实现(Equinox)及其内置 Jetty 服务器进行测试。但是对于部署,必须遵循一个过程才能构建打包为 WAR 且适于 部署到 servlet 容器中的独立应用程序。

在这个 “使用 Eclipse Ganymede 进行桌面、Web 和移动设备开发” 系列教程的第 3 部分中,您将再次修 改备忘记事本以使用令人兴奋的 Ganymede 的新 embedded Rich Client Platform(eRCP )项目为移动设备进行开发。

本文配套源码

怪天怪地,我都不会怪你,你有选择幸福的权利…

使用EclipseGanymede进行桌面、Web和移动设备开发,第2部分(二

相关文章:

你感兴趣的文章:

标签云: