Rich Ajax Platform,第 2 部分: 开发应用程序(转摘)
来源:互联网 发布:潮阳园艺三角梅淘宝店 编辑:程序博客网 时间:2024/05/19 14:02
Rich Ajax Platform,第 2 部分: 开发应用程序
基于 Eclipse 开发模式的 Web 2.0
文档选项打印本页
样例代码
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 的新信息都能在这里找到。
订阅 Ajax 相关文章和教程的 RSS 提要RAP 的架构
要高效地开发基于 RAP 的应用程序,在某些情况下您需要知道它的工作原理。我们不希望介绍过多内部机制让您感到厌烦,但是必须说明一些基本概念来帮助您用 RAP 进行开发。下面的示意图通过对比 RCP 的方式介绍了 RAP 组织方式。
图 1. 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
将定义应用程序可用于外部世界的 servlet 的名称。这意味着应用程序的 URL 将显示为 http://<host><port>/<servletName> startup
参数的情况下访问应用程序,通常有一个应当默认装载的入口点,因此可以定义 defaultEntrypointId
。 org.eclipse.rap.ui.themes
的扩展所定义的主题提供一个 ID。如果没有 themeId
,则使用 RAP 标准主题。 favicon
是显示在浏览器地址栏中的图标。这必须是一个有效的 .ico 文件 才能显示在浏览器中。 body
属性来注册一个有效的 (X)HTML 文件。 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 小部件
回页首
结束语
分享这篇文章……提交到 Digg 发布到 del.icio.us 提交到 Slashdot!
在 第 1 部分 中,我们了解了把现有 RCP 应用程序转换为实际的 Web 应用程序是多么简单。在本文中,了解了 RAP 是一项为 Web 开发提供许多自定义功能的振奋人心的技术。通过使用强大的 Rich Client Platform (RCP)、服务器端和 Web 浏览器中的 Equinox,RAP 让所有人都可以运行应用程序而无需配置。此外,RAP 还有一个吸引人的特性,它允许 Eclipse 开发人员重用现有技能和世界级工具来创建 Web 应用程序。最后,了解了 RAP 充分利用了桌面和 Web 浏览器的优点。
回页首
下载
参考资料
学习- 您可以参阅本文在 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 在位于卡尔斯鲁厄的 Innoopract Informationssysteme 中担任软件开发人员兼顾问。他是富 Ajax 平台 (RAP) 项目的提交者,主要负责工作区实现。他也是 Eclipse Platform 的积极贡献者。
- Rich Ajax Platform,第 2 部分: 开发应用程序(转摘)
- Rich Ajax Platform,第 2 部分:开发应用程序
- Rich Ajax Platform,第 1 部分: 简介 (转摘)
- Rich Ajax 平台,第 1 部分: 简介-基于 Eclipse 开发模式的 Web 2.0
- AJAX 应用程序体系结构,第 2 部分
- 转载--开发端到端的 Ajax 应用程序,第 2 部分: 实现 Ajax 客户机和服务器层
- 转载--开发端到端的 Ajax 应用程序,第 3 部分: 集成、测试和调试应用程序
- 开发端到端的 Ajax 应用程序,第 1 部分: 用一个场景设置 Ajax 环境
- AJAX 应用程序体系结构,第 1 部分
- AJAX 应用程序体系结构,第 1 部分
- AJAX 应用程序体系结构(第1部分)
- 开发端到端的 Ajax 应用程序,第 1 部分: 用一个场景设置
- 开发Android应用程序与Eclipse第2部分
- 打造可靠的 Ajax 应用程序,第 2 部分: 构建 Ajax 后端
- 打造可靠的 Ajax 应用程序,第 2 部分: 构建 Ajax 后端
- 通过 URL 打开 Eclipse Rich Client Platform 应用程序
- 转载--开发端到端的 Ajax 应用程序,第 1 部分: 用一个场景设置 Ajax 环境
- 掌握 Facebook 应用程序开发,第 1 部分
- Photoshop 图像去底技巧 N 种
- t-bag,男人,信仰,爱,恨,人性……
- Rich Ajax Platform,第 1 部分: 简介 (转摘)
- 少壮不努力,老大徒伤悲
- ODF只是反微软 企业应该用Open XML
- Rich Ajax Platform,第 2 部分: 开发应用程序(转摘)
- 二分查找
- 抽象方法演练
- .net面试题大全(有答案)
- 校园难学到真正编程 教育存严重问题
- JavaScript中confirm方法的重载
- Essential Silverlight翻译连载---前言
- 使用 jQuery 简化 Ajax 开发(转摘)
- ASP.NET项目中bin,app_code,app_data 等文件夹的作用