Rich Ajax Platform,第 2 部分: 开发应用程序(转摘)

来源:互联网 发布:潮阳园艺三角梅淘宝店 编辑:程序博客网 时间:2024/05/19 14:02

Rich Ajax Platform,第 2 部分: 开发应用程序

基于 Eclipse 开发模式的 Web 2.0

developerWorks 文档选项 将打印机的版面设置成横向打印模式

打印本页

将此页作为电子邮件发送

将此页作为电子邮件发送

样例代码



Benjamin Muskalla (bmuskalla@innoopract.com), 软件工程师, Innoopract Informationssysteme GmbH

2008 年 1 月 14 日

Rich Client Platform (RCP) 是一项用于构建企业应用程序的强大平台技术。在 Rich Ajax Platform (RAP) 的帮助下,它将变得更有趣,因为可以重用 Web 应用程序的现有代码库和开发技巧,如 “富客户端平台”系列的第 1 部分中所述。RAP 有一些值得注意的功能使 Web 开发更具吸引力。本文将超越 Hello World 示例,并说明一些关键概念以及如何使用 RAP 所提供的高级功能。

在开始研究新功能之前,我们希望大致介绍 RAP 的组织方法及其重要性。然后,我们将讨论一些有趣的主题,如后台作业、用户界面 (UI) 自定义,并且将介绍更加高级的主题,例如自定义小部件和主题。如果这些讨论超出了您所掌握的现有 RAP 知识,请返回到 第 1 部分 或查看 参考资料

请访问 Ajax 技术资源中心,这是有关 Ajax 编程模型信息的一站式中心,包括很多文档、教程、论坛、blog、wiki 和新闻。任何 Ajax 的新信息都能在这里找到。 RSS 订阅 Ajax 相关文章和教程的 RSS 提要

RAP 的架构

要高效地开发基于 RAP 的应用程序,在某些情况下您需要知道它的工作原理。我们不希望介绍过多内部机制让您感到厌烦,但是必须说明一些基本概念来帮助您用 RAP 进行开发。下面的示意图通过对比 RCP 的方式介绍了 RAP 组织方式。


图 1. RCP 和 RAP 的对比
RCP 和 RAP 的对比

正如您所看到的,RAP 分为两部分。一方面,有运行在 Equinox(OSGi 规范的 Eclipse 实现)之上的服务器端 部分。而另一方面,有客户机 部分,这部分是您在浏览器中看到的内容。两端将交换事件,各自的 UI 将相应更新。这意味着大部分代码在服务器上执行,而瘦客户 端仅在必要时更新。这样做的好处是可以运行干净的 Java™ 应用程序而无需在客户机上安装应用程序本身。





回页首

RAP 不是 RCP

构造可以在两种环境中运行的应用程序
即使 RAP 不是 RCP,也可以在 RAP 和 RCP 应用程序之间共享大量代码。为此,建议配置一个插件,将该插件用作包含可以在 RAP 和 RCP 中使用的 UI 代码的基本插件。要完成此操作,建议使用 MANIFEST.MF 中的 Import-Package 来指定依赖性。这将允许您的基本插件使用来自 RAP 或 RCP 的包。您不会将自己与某个具体实现绑定起来。设置完基本插件后,建议多配置两个插件,一个用于 RAP 专用的代码,另一个用于 RCP 专用的代码。最后,配置两个工作区,其中一个设置 RAP 的目标平台,另一个设置 RCP 的目标平台。将来,我们希望随着工具的演变,应用程序开发人员编写在 RAP 和 RCP 中运行的代码会变得更容易。

此部分的标题应该不会吓到您,但是您必须了解它。如 第 1 部分 中所示,将 RCP 应用程序迁移到启用 Web 的 RAP 副本中非常简单。开发 RCP 应用程序时,通常的情况是一次将只有一个用户使用该应用程序。相反地,运行在服务器上的 RAP 应用程序将由多个(或者上千)用户同时使用。这种情况将导致重新思考 RAP 应用程序开发中的一些概念。一个有趣的方面是实现 单例(singleton) 模式的类的单例性。在所谓的 “应用程序范围” 内,单例是惟一的。在 RAP 应用程序中存在几个范围:

应用程序范围
应用程序范围是适用于所有用户的最大范围。单例对于整个应用程序都是惟一的,并且因此存在于应用程序范围内。这意味着应用程序的所有用户都将使用单例的同一个实例。这可能非常有益,但如果实例保存一些用户特定的信息,那么也不总是一件好事。
会话范围
会话范围仅与当前用户可用的当前用户会话绑定。要实现一个仅绑定特定会话的单例,可以使用 RAP 提供的 SessionSingletonBase 类。通过扩展该类并覆盖其 getInstance 方法,该类将像单例一样运行,但是仅可用于会话范围内。
请求范围
请求范围是三个范围中最小的范围。只有在处理请求时它才可用。大多数时间里,此范围实际上与普通开发人员无关(除非需要了解 RAP 的生命周期概念)。




回页首

后台作业

RAP 最令人激动的功能之一是支持 Eclipse Jobs 框架。通过作业的帮助,可以在后台运行需要长期运行的任务,而 UI 仍然可以做出响应。为了了解其工作原理,我们将用一个安排作业的新操作来扩展第 1 部分中的邮件应用程序(参见清单 1)。


清单 1. 添加操作 (ApplicationActionBarAdvisor.java)
                ....private Action progressAction;...protected void makeActions(final IWorkbenchWindow window) {    ...    progressAction = new SampleProgressAction();                progressAction.setText("Count me!");                progressAction.setId("progress.action");                register(progressAction);    }...protected void fillCoolBar(ICoolBarManager coolBar) {...    toolbar.add(progressAction);}    

除了作业 API 之外,RAP 还提供了大家熟知的用于处理作业的 UI,我们稍后就会看到它。要在工作区中激活此功能,可以指示 Eclipse 显示进度指示器(参见清单 2)。


清单 2. 启用进度指示器 (ApplicationWorkbenchWindowAdvisor.java)
                ...public void preWindowOpen() {...    configurer.setShowProgressIndicator(true);}...    

接下来是最有趣的部分:作业。我们的示例是一个简单实现(参见清单 3),该实现只是把变量增加到一个特定数量并在完成每个步骤之后等待,以便查看 UI 中发生的情况。


清单 3. 作业 (SampleProgressAction.java)
                package rap.mail;import org.eclipse.core.runtime.IProgressMonitor;import org.eclipse.core.runtime.IStatus;import org.eclipse.core.runtime.Status;import org.eclipse.core.runtime.jobs.Job;import org.eclipse.jface.action.Action;public class SampleProgressAction extends Action {private static final int TASK_AMOUNT = 100;public void run() {Job job = new Job("Long Running Action:") {protected IStatus run(final IProgressMonitor monitor) {monitor.beginTask("Number counting", TASK_AMOUNT);for (int i = 0; i < TASK_AMOUNT; i++) {if (monitor.isCanceled()) {monitor.done();return Status.CANCEL_STATUS;}int done = i % TASK_AMOUNT;monitor.subTask("work done: (" + done + "%)");monitor.worked(1);try {Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}}monitor.done();return Status.OK_STATUS;}};job.setName(job.getName() + " " + job.hashCode());job.setUser(true);job.schedule();}}    

在启动应用程序并单击 antion 后,将显示一个新对话框,告诉我们当前运行的作业的进度。如果不需要等待作业完成,可以通过单击 Run in background 把它隐藏起来。此外,还可以在状态栏中单击进度图标打开进度视图。如果同时有多个作业在运行,则可以在进度视图中轻松地查看这些作业(参见图 2)。


图 2. 后台作业
后台作业





回页首

标识

对于大多数基于 RCP 和基于 RAP 的应用程序,需要根据喜好标识 它们。标识是指修改应用程序的外观以满足您的目的,如符合现有企业标识。如果曾经开发过 RCP 应用程序,则有一个 .product 文件的概念可以帮助标识应用程序。由于 RAP 的目标是另一个平台 (Web),因此需要做一些额外的工作来自定义应用程序。


图 3. 带有样例标识的清单编辑器
带有样例标识的清单编辑器

正如您所见,自定义 RAP 应用程序的方法有很多种。

属性 描述 servletName servletName 将定义应用程序可用于外部世界的 servlet 的名称。这意味着应用程序的 URL 将显示为 http://<host><port>/<servletName> defaultEntrypointId 在没有 startup 参数的情况下访问应用程序,通常有一个应当默认装载的入口点,因此可以定义 defaultEntrypointId。 themeId 可以在这里指定用于此标识的主题。需要为 org.eclipse.rap.ui.themes 的扩展所定义的主题提供一个 ID。如果没有 themeId,则使用 RAP 标准主题。 title 可以用此属性自定义页面标题 —— 在大多数浏览器中显示为窗口标题或者选项卡标题。 favicon favicon 是显示在浏览器地址栏中的图标。这必须是一个有效的 .ico 文件 才能显示在浏览器中。 body 如果 RAP 索引页面中需要使用一些自定义 (X)HTML 标记,则可以用生成的索引页面的 body 标记中包括的 body 属性来注册一个有效的 (X)HTML 文件。 exitConfirmation 如果非空,则 exitConfirmation 中的字符串将显示给想要离开 RAP 应用程序的用户。该属性对于避免用户意外关闭浏览器窗口/选项卡十分有用。

重新启动带有新标识的应用程序后,可以看到结果。


图 4. 带有标识的应用程序
带有标识的应用程序





回页首

主题

RAP 应用程序的主题将定义用户将看到的应用程序的界面外观。请不要认为它类似于 RCP 工作区中的主题支持,它更类似于常用操作系统对定义窗口、按钮等外观的支持。通常,RAP 主题允许定义:

  • 自定义颜色
  • 自定义字体
  • 自定义边界
  • 自定义尺寸和框尺寸(填充等)
  • 自定义图片和图标

不过,实际上可以自定义哪些方面取决于要定义主题的特殊控件。一些控件允许更大的灵活性,而其他控件需要硬连接。例如,默认界面外观与自定义主题之间的差异可能如图 5 所示。


图 5. 运行的自定义主题
运行的自定义主题

创建主题

在 RAP 中,主题文件是简单的 Java 属性文件。可以在 RAP org.eclipse.rap.rwt 插件的 src/ 目录中找到名为 theme-template.properties 的模板。只需要指定与自定义相关的那些属性(未定义的属性将保留为默认值)。查看下列清单以获得属性值的语法。下面是简单主题文件的示例。


清单 4. 简单主题文件
                # Alternative Demo Theme## Frame border for group boxes# default: 1 solid #aca899group.frame.border: 2 dotted #56a0ea# Font for title bar of Shells# default: bold 11 "Segoe UI", Corbel, Calibri, Tahoma, "Lucida Sans Unicode", sans-serifshell.title.font: bold 15 "Trebuchet MS", Arial, Helvetica, sans-serif# Height of the title bar of Shells# default: 18shell.title.height: 25... 

注册主题

要使主题可用,必须用扩展点 org.eclipse.rap.swt.themes 注册它。在应用程序项目的 plugin.xml 中,添加如清单 5 所示的扩展。


清单 5. 使主题可用
                <extension       point="org.eclipse.rap.swt.themes">    <theme          id="org.eclipse.rap.dw.demotheme"          name="Alternative Demo Theme"          file="theme1/theme.properties" /></extension>

激活主题

要激活主题,必须在标识中指定 themeId。将其设置为新创建主题的 ID:org.eclipse.rap.demo.alttheme。重新启动应用程序后,可以看到新样式下的应用程序。


图 6. 运行的自定义主题
运行的自定义主题





回页首

自定义小部件

构造可以在两种环境中运行的应用程序
Google Web Toolkit 和 RAP 十分类似,它们都允许您使用 Java 技术编写富 Internet 应用程序。最大的差别是 GWT 运行在客户机上,而 RAP 主要运行在服务器上。由于 RAP 运行在服务器上,因此它允许您通过 OSGi 访问完整的 Java API 和使用著名的 Eclipse 插件模型。可以从 Eclipse 方面看待这种差别,GWT 类似一个独立的 SWT 应用程序(只是一个小部件工具包),而 RAP 为 Web 应用程序启用了 RCP 样式的方法。

最重要的是:RAP 中有两种自定义小部件。可以通过组合现有小部件构成一个新的小部件来开发小部件,也可以开发真正自定义小部件(也称为自制 小部件。当谈到混合小部件时,SWT (RCP) 与服务器端 (RAP) 没有差别。在大多数时间里,您都应当能够在 RAP 应用程序中重用现有混合小部件。

更复杂的情况是创建一个真正自定义的小部件。用 RAP 开发小部件时,必须注意我们有两个不同的运行时:服务器端客户端 实现。在服务器上,小部件带有自定义小部件用户所使用的公共 API。在客户机上,真正的实现是用 JavaScript 完成的。诀窍在于连接客户机和服务器部分。RAP 提供了一种生命周期 内部概念,其中将考虑到所有小部件。生命周期负责初始化和小部件在客户机与服务器之间的数据交换。实现自定义小部件略微超出本文的讨论范围,建议在 RAP 帮助文档中了解关于自定义小部件的更多信息(请参阅 参考资料)。为了进行说明,图 7 显示了 SWT 小部件中封装的 Google Maps的屏幕快照,其访问方式与所有其他小部件相同。


图 7. Google Maps RAP 小部件
Google Maps RAP 小部件





回页首

结束语

分享这篇文章……

digg 提交到 Digg del.icio.us 发布到 del.icio.us Slashdot 提交到 Slashdot!

第 1 部分 中,我们了解了把现有 RCP 应用程序转换为实际的 Web 应用程序是多么简单。在本文中,了解了 RAP 是一项为 Web 开发提供许多自定义功能的振奋人心的技术。通过使用强大的 Rich Client Platform (RCP)、服务器端和 Web 浏览器中的 Equinox,RAP 让所有人都可以运行应用程序而无需配置。此外,RAP 还有一个吸引人的特性,它允许 Eclipse 开发人员重用现有技能和世界级工具来创建 Web 应用程序。最后,了解了 RAP 充分利用了桌面和 Web 浏览器的优点。






回页首

下载

描述 名字 大小 下载方法 样例代码 os-eclipse-richajax2-mail-project.zip 38KB HTTP 关于下载方法的信息

参考资料

学习
  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • 从阅读 “Rich Ajax 平台,第 1 部分:简介” 开始获得关于 RAP 的介绍性文章,了解如何设置 RAP 开发环境,并获得一些演示和示例。

  • 了解更多信息并下载 Rich Ajax Platform (RAP)

  • 查阅 Eclipse Foundation 的 RAP 维基 了解新功能和高级用例。

  • 参阅 Eclipse Foundation 的 RAP Theming 维基 了解关于主题的更多信息。

  • 阅读 RAP 项目官方帮助文档 以了解关于 RAP 的更多信息。

  • 参阅 Eclipse Foundation 的 RAP 自定义小部件帮助文档 以了解关于构建自定义小部件的更多信息。

  • 查阅 Eclipse Corner 获得关于 Eclipse Jobs API 的更多信息。

  • 浏览 developerWorks 上的全部 Eclipse 文章Eclipse 教程

  • 您是 Eclipse 新用户?阅读 developerWorks 文章 “Eclipse 平台入门” 以了解它的起源和架构,以及如何用插件扩展 Eclipse。

  • 查阅 IBM developerWorks 的 Eclipse 项目资源 扩展 Eclipse 技巧。

  • 收听针对软件开发人员的有趣访谈和讨论,一定要访问 developerWorks podcast

  • 要获得关于 Eclipse 平台的介绍性文章,请参阅 “Eclipse 平台入门”。

  • 随时关注 developerWorks 的 技术事件和网络广播

  • 查看免费的 developerWorks On demand demo 观看并了解 IBM 及开源技术和产品功能。

  • 查阅最近将在全球举办的面向 IBM 开放源码开发人员的研讨会、交易展览、网络广播和其他 活动

  • 访问 developerWorks 开放源码专区,获得丰富的 how-to 信息、工具和项目更新,帮助您用开放源码技术进行开发,并与 IBM 产品结合使用。


获得产品和技术
  • 下载 IBM 产品评估版,并开始使用 DB2®、Lotus®、Rational®、Tivoli® 和 WebSphere® 的应用程序开发工具和中间件产品。

  • 使用 IBM 试用软件 改进您的下一个开发项目,这些软件可以通过下载或从 DVD 中获得。

讨论
  • Eclipse Platform 新闻组 应当是讨论关于 Eclipse 的问题的第一站(选择此链接将启动默认的 Usenet 新闻阅读器应用程序并打开 eclipse.platform)。

  • Eclipse 新闻组 中有很多参考资料适用于对使用和扩展 Eclipse 感兴趣的人员。

  • 参与 developerWorks blog 并加入 developerWorks 社区。



关于作者

Benjamin Muskalla

Benjamin Muskalla 在位于卡尔斯鲁厄的 Innoopract Informationssysteme 中担任软件开发人员兼顾问。他是富 Ajax 平台 (RAP) 项目的提交者,主要负责工作区实现。他也是 Eclipse Platform 的积极贡献者。