rap开发与rcp开发
使用Eclipse Rich Client Platform(RCP),您可以构建应用程序。 这些丰富的应用程序基于动态插件模型,并且使用常见的工具箱和扩展点来构建UI。 在开放工具开发中,Eclipse RCP被广泛使用。
Rich Ajax平台(RAP)项目使您可以使用Eclipse开发模型,插件和仅Java的API来构建支持Ajax的丰富Web应用程序。 RAP的目标是使RCP应用程序能够在Web浏览器中运行,而只需进行尽可能少的修改。
RAP和RCP具有相同的接口,但是它们的基本实现有很大不同。 RAP提供了一种称为RWT的SWT API的替代实现,它在Tomcat之类的servlet容器上运行。 客户端可以使用标准的Web浏览器(例如Internet Explorer或Chrome)访问它。
RAP和RCP应用程序用于不同的用户环境。 作为桌面应用程序,RCP一次只能与一个用户一起使用。 相反,RAP应用程序是基于Web的程序,可以由多个用户同时访问。 RAP基于Equinox,服务器端OSGi和运行时捆绑包。 每个Web应用程序一个OSGi实例在一个应用程序范围内运行。 与RCP相对,RAP必须处理用户会话和在用户会话之间共享的捆绑。
在本文中,将学习RAP的主要功能以及如何使用RAP将RCP应用程序迁移到Web。 您可以下载本文中使用的示例代码。
RAP和RCP的单一采购技术
RAP流行于从单一代码库(也称为单一来源)开发富客户端应用程序和Web应用程序。 您可以将现有的RCP开发技能和代码库重新用于基于Web的RAP应用程序。 对于当前版本的RAP 1.3.x,可以在RAP环境中重用现有RCP代码的70%-90%,而无需进行更改。
处理不同的API和功能
RCP和RAP具有不同的API,功能,UI库,扩展点和用户环境。
- API:在RAP 1.3.x版中,并非所有RCP API在RAP中都可用,例如GC(图形上下文),MouseMove事件和FileDialog。 RAP有其自己的其他API,可满足特定于Web的需求
PhaseListener
,ISessionStore
等。 要处理不同的API,请考虑以下建议:- 在主机插件中为该问题定义一个接口。
- 定义以不同片段实现接口的新类,以特定于平台的方式解决问题。
- 通过Java反射在运行时加载特定于平台的实现。
“ 单一采购示例 ”部分中提供了示例源代码。
- UI库:由于RCP和RAP具有不同的目标平台,因此它们具有不同的基础UI库。 主机插件包含RCP的公共代码和RAP需要在两个平台UI库依赖性(例如,
org.eclipse.ui
插件为RCP或org.eclipse.rap.ui
插件用于RAP)。 两者都需要作为主机的必需插件导入。为了避免在使用不同目标运行时间时发生编译错误,请启用“属性”下的“ 可选”复选框, 如图1所示。 通过这种方式,RAP / RCP运行时将在开始执行时加载正确的库。
图1.可选依赖项
- 扩展点(E-P):当前,并非所有RCP E-P都可以在RAP中使用(例如,
bindings
和helpSupport
)。 由于特定于Web的要求,RAP包括一些附加的E-P,例如entrypoint
和themes
。引入了OSGi片段来处理不同的E-P,并对RCP和RAP使用相同的代码库。 片段是特殊的OSGi捆绑包; 它们扩展了另一个捆绑包,并且可以在运行时与扩展捆绑包合并。 首先,定义一个主机插件,其中包含RCP和RAP的通用代码。 然后,分别为RAP和RCP创建两个单独的片段,其中包括RAP和RCP的特定于平台的代码。 在运行时,将仅与主机插件一起安装一个相应的片段(RAP或RCP)。 因此,特定于平台的EP扩展名可以移至相应的片段,并且捆绑包结构保持完整。
- 多用户环境:单例模式已广泛用于RCP。 但是,对于允许多个用户同时访问的基于Web的应用程序,需要基于会话的单例。 RAP提供了一个基类
SessionSingletonBase
该基类为每个会话提供了单例实现,并且避免了不同用户之间的应用程序状态共享。会话单例是特定于RWT的单例,它提供对会话范围内唯一实例的访问。 在一个用户会话的上下文中,
getInstance(Class)
将始终返回相同的对象。 但是,对于不同的用户会话,返回的实例将不同。要实现会话单例类,应调用
SessionSingletonBase#getInstance()
,该类将照顾单例实例的适当范围。 清单1显示了这种模式。 请参阅相关主题 RAP的常见问题解答。清单1.会话单例示例
package com.ibm.msdk.ui.configWas; import org.eclipse.rwt.SessionSingletonBase; public class SampleSessionSingleton{ private SampleSessionSingleton(){} public static SampleSessionSingleton getInstance(){ return (SampleSessionSingleton)SessionSingletonBase .getInstance(SampleSessionSingleton.class); } }
单一采购示例
在本节中,将为HTML查看器提供一个示例RCP应用程序,以了解有关单一采购的更多信息。 您可以下载本文中使用的示例代码。 该示例具有一个用于显示HTML文件的视图,可以使用其工具栏上的“ 打开”按钮来打开该视图, 如图2所示:
图2. RCP HTML查看器示例
该示例使用浏览器窗口小部件显示HTML文件。 要实现该功能,您需要创建一个名为com.ibm.msdk.example
的样本插件。
- 标识RCP中特定于平台的代码。
如前所述,样本插件中有RAP / RCP平台特定的代码。 您必须首先从示例项目中提取通用代码。 通过分析代码,从RCP HTML查看器中识别出不支持RAP的API:
FileDialog
#open
(在com.ibm.msdk.example.action
包中),如清单2所示:清单2. RCP中特定于平台的代码
import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IWorkbenchWindow; import com.ibm.msdk.example.utils.HtmlFileReader; public class ImportHtmlAction extends Action { public static final String ACT_IMPORT_FILE = "ACT_IMPORT_FILE"; private IWorkbenchWindow workbenchWi