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的需求PhaseListenerISessionStore等。 要处理不同的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中使用(例如, bindingshelpSupport )。 由于特定于Web的要求,RAP包括一些附加的E-P,例如entrypointthemes

    引入了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的样本插件。

  1. 标识RCP中特定于平台的代码。

    如前所述,样本插件中有RAP / RCP平台特定的代码。 您必须首先从示例项目中提取通用代码。 通过分析代码,从RCP HTML查看器中识别出不支持RAP的API: FileDialogopen (在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 workbenchWindow;/*** Constructs an instance of <code>ImportHtmlAction</code> by given * text and <code>IWorkbenchWindow</code>.* @param text* @param workbenchWindow*/public ImportHtmlAction(String text,IWorkbenchWindow workbenchWindow){super(text);this.workbenchWindow = workbenchWindow;}/*** Creates a file dialog for opening a new file,calls the method * {@link HtmlFileReader#fetchHtmlContents(String)} to fetch the contents * of the passed HTML file. Then fires the listener of <code>HTMLView</code> * to refresh the contents of the view.*/@Overridepublic void run(){Shell shell = workbenchWindow.getShell();FileDialog fileDialog = new FileDialog(shell,SWT.OPEN);String filePath = fileDialog.open();String htmlContents = null;if(filePath != null)htmlContents = HtmlFileReader.fetchHtmlContents(filePath);firePropertyChange(ACT_IMPORT_FILE, null, htmlContents);}
    }

    在RAP中, 上传文件而不是打开文件是有意义的。 “ RAP上传项目”提供了这样的上传功能; 可以从RAP CVS存储库(sandbox / org.eclipse.rwt.widgets.upload)下载。

  2. 创建RCP和RAP片段。

    因为com.ibm.msdk.example插件既针对RAP平台,也针对RCP平台,所以必须将这两个平台的必需软件包作为必需插件导入。 例如,需要UI捆绑包org.eclipse.ui (RCP)和org.eclipse.rap.ui (RAP)。 如图3所示,在插件的Properties中将不同的UI捆绑包的依赖关系设为Optional ,以避免在不同的目标平台上编译错误:

    图3.可选的依赖项

    平台运行时环境(RCP或RAP)将加载正确的捆绑软件。 由于它具有两个目标平台,因此您需要创建两个新的片段来保存特定于平台的代码。 如图4所示,片段的主机插件属性设置为com.ibm.msdk.example插件:

    图4.将主机插件设置为com.ibm.msdk.example
  3. 创建抽象类以处理特殊功能。

    RAP没有FileDialog小部件。 您必须使用一个新的小部件,该小部件可以将文件从客户端上传到服务器。 幸运的是,RAP CVS提供了一个自定义的上载小部件,可以从存储库位置URL:pserver:anonymous@dev.eclipse.org:/ cvsroot / rt下载,从org.eclipse.rap / sandbox / org.eclipse中找到该小部件。 rwt.widgets.upload。 为了使上载的小部件能够正常工作,需要org.apache.commons.fileuploadorg.apache.commons.io插件。 两者都可以从资源库位置URL:pserver:anonymous@dev.eclipse.org:/ cvsroot / tools下载。 从org.eclipse.orbit /中找到插件。 请参阅相关主题更多有关如何使用CVS下载。

    1. 将所需的插件添加到RAP片段中, 如图5所示:

      图5.将上传插件添加到依赖项
    2. 在主机插件中,您需要创建一个抽象类来处理RAP和RCP平台之间不同的特殊功能。 定义一个名为doViewHtml()的抽象方法,如清单3所示:
      清单3. Action的抽象类
      /*** */
      package com.ibm.msdk.example.actions;import org.eclipse.jface.action.Action;
      import org.eclipse.ui.IWorkbenchWindow;/*** @author Minghai.Wang* @version 1.0 2010-10-26* @since JDK1.6* @email wminghai@cn.ibmm.com*/
      public abstract class AbstractViewHtmlAction extends Action {protected IWorkbenchWindow workbenchWindow;public static final String ACT_IMPORT_FILE = "ACT_IMPORT_FILE";public static final String INSTANCE_CLASS = "com.ibm.msdk.example.actions.ViewHtmlAction";/*** Constructs an instance of <code>AImportHtmlAction</code> by given* <code>IWorkbenchWindow</code>.* * @param workbenchWindow*/public AbstractViewHtmlAction(IWorkbenchWindow workbenchWindow) {this.workbenchWindow = workbenchWindow;}public void run() {doViewHtml();}/*** Abstracts the method for viewing the given HTML file.* <p>* It is different between RCP platform and RAP platform.* <ul>* <li>In the RCP fragment,open a file dialog and select a HTML file that* will be parsed, and then show it.</li>* <li>In the RAP fragment,upload a parsing HTML file, then show it.* </ul>*/public abstract void doViewHtml();/*** @return the workbenchWindow*/public IWorkbenchWindow getWorkbenchWindow() {return workbenchWindow;}/*** @param workbenchWindow*            the workbenchWindow to set*/public void setWorkbenchWindow(IWorkbenchWindow workbenchWindow) {this.workbenchWindow = workbenchWindow;}}
    3. 要调用doViewHtml()操作,需要修改主机插件的调用者部分。 清单4显示了原始类中的方法。
      清单4.原始类HtmlContentsView中的方法
      public class HtmlContentsView extends ViewPart implementsIPropertyChangeListener {....../*** Fills the tool bar of the HTML view with a importing HTML action. A* listener is added to the created action of importing HTML view.*/protected void fillToolBarAction() {ImportHtmlAction importHtmlAct = new ImportHtmlAction("Open...",getViewSite().getWorkbenchWindow());IToolBarManager toolBarManager = getViewSite().getActionBars().getToolBarManager();toolBarManager.add(importHtmlAct);importHtmlAct.addPropertyChangeListener(this);} ...
      }

      您可以在com.ibm.msdk.example插件的HtmlContentsView.java中使用Java反射来获得新的片段操作,如清单5所示。 在RCP片段和RAP片段中创建的子类的全名应该相同。 以这种方式,在不同的运行时平台(RCP或RAP)上,将加载适当的片段,并调用适当的doViewHtml()操作。

      清单5.新类HtmlContentsView中的方法
      public class HtmlContentsView extends ViewPart implementsIPropertyChangeListener {       .../*** Fills an instance of <code>AbstractViewHtmlAction</code> * that is created by Java reflection.*/protected void fillToolBarAction() {try {Class<?> clazz = Class.forName(AbstractViewHtmlAction.INSTANCE_CLASS);Constructor<?> cons = clazz.getConstructor(IWorkbenchWindow.class);AbstractViewHtmlAction viewHtmlAction = (AbstractViewHtmlAction) cons.newInstance(getViewSite().getWorkbenchWindow());IToolBarManager toolBarManager = getViewSite().getActionBars().getToolBarManager();toolBarManager.add(viewHtmlAction);viewHtmlAction.addPropertyChangeListener(this);//     Add an action for viewing singleton info.ViewSingletoInfoAction viewSingleton = new ViewSingletoInfoAction(getViewSite().getWorkbenchWindow());toolBarManager.add(viewSingleton);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();} }    ...
      }
  4. 在RAP和RCP片段中实施。

    在为特定于平台的功能定义抽象类之后,您需要分别在RCP片段和RAP片段中分别实现抽象方法。 在RCP片段中,创建一个扩展抽象类AbstractViewHtmlAction的新类,如清单6所示。 它实现了使用FileDialog打开HTML文件的abstract方法。

    清单6. AbstractViewHtmlAction的RCP实现
    public class ViewHtmlAction extends AbstractViewHtmlAction {.../*** Creates a file dialog for opening a new file,calls the method* {@link HtmlFileReader#fetchHtmlContents(String)} to fetch the * contents of the passed HTML file.Then fires the listener of * <code>HTMLView</code> to refresh the contents of the view.*/@Overridepublic void doViewHtml() {Shell shell = workbenchWindow.getShell();FileDialog fileDialog = new FileDialog(shell,SWT.OPEN);String filePath = fileDialog.open();String htmlContents = null;if(filePath != null)htmlContents = HtmlFileReader.fetchHtmlContents(filePath);firePropertyChange(ACT_IMPORT_FILE, null, htmlContents);}...
    }

    RAP片段抽象方法的实现与RCP不同。 它使用“上载”小部件将HTML文件传输到Web服务器,然后将其打开,如清单7所示:

    清单7. AbstractViewHtmlAction的RAP实现
    public class ViewHtmlAction extends AbstractViewHtmlAction {.../*** Opens a new shell for uploading a HTML file,* creates the widgets.*/@Overridepublic void doViewHtml() {Display display = Display.getDefault();Shell shell = new Shell(display, SWT.PRIMARY_MODAL | SWT.CLOSE | SWT.RESIZE);shell.setText("Upload a HTML file");shell.setLayout(new GridLayout());shell.setSize(450, 60);
    //      Creates the control in the shell.createControl(shell);shell.layout();shell.open();while (!shell.isDisposed()) {if (!display.readAndDispatch())display.sleep();}}/*** * @param shell*/protected void createControl(final Shell shell){Upload upload = new Upload(shell,SWT.NONE,Upload.SHOW_UPLOAD_BUTTON);upload.setUploadButtonText("Upload");upload.setBrowseButtonText("Location...");GridDataFactory.fillDefaults().grab(true, false).applyTo(upload);upload.addUploadListener(new UploadListener(){......});}    ...
    }
  5. 多用户支持。

    RAP平台提供了会话单例,用于访问会话范围内的唯一实例。 该示例说明了在RAP中使用会话单例以及在RCP中使用公共单例的情况。

    1. 在主机插件中创建一个名为ExampleSingleton的单例类。 还创建了一个名为ISingletonProvider的接口和一个名为ImplementationLoader的类加载器。

      清单8.主机插件中的会话单例
      public class ExampleSingleton {private final static ISingletonProvider PROVIDER;static{PROVIDER = (ISingletonProvider) ImplementationLoader.newInstance(ExampleSingleton.class);}/*** Gets the instance of <code>ExampleSingleton</code> which has * different implementations in RAP and RCP fragment.* @return*/public static ExampleSingleton getInstance(){return (ExampleSingleton)PROVIDER.getInstanceInternal();}public String fetchSingtonInfo(){return PROVIDER.fetchSingletonInfo();}}
      清单9.主机插件中的接口
      public interface ISingletonProvider {Object getInstanceInternal();/*** Fetches the singleton info,which is different * between RCP platform and RAP platform.* @return*/String fetchSingletonInfo();
      }
      清单10.一个加载器
      public class ImplementationLoader {public static Object newInstance(final Class<?> type){String name = type.getName();Object result = null;try {result = type.getClassLoader().loadClass(name + "Impl").newInstance();} catch (Exception e) {e.printStackTrace();}return result;}
      }
    2. 创建ExampleSingleton子类。 在RAP和RCP片段中都实现ISingletonProvider接口,以提供不同的单例实现。
      清单11. RAP中会话单例的实现
      public class ExampleSingletonImpl implements ISingletonProvider {public Object getInstanceInternal() {return SessionSingletonBase.getInstance(ExampleSingleton.class);}......
      }
      清单12. RCP中会话单例的实现
      public class ExampleSingletonImpl implements ISingletonProvider {private static ExampleSingleton singleton;/* (non-Javadoc)* @see com.ibm.msdk.example.singleton* .ISingletonProvider#getInstanceInternal()*/@Overridepublic Object getInstanceInternal() {if(singleton == null)singleton = new ExampleSingleton();return singleton;}/* (non-Javadoc)* @see com.ibm.msdk.example.singleton* .ISingletonProvider#fetchSingletonInfo()*/@Overridepublic String fetchSingletonInfo() {return "This message is from RCP fragment!";}
      }

将RAP应用程序打包并部署到Tomcat

在本部分中,您将制作一个WAR文件,将该文件部署到Tomcat,并了解一些有关部署的WAR文件不起作用的故障排除提示。

将RAP应用程序打包到WAR中

当前,Eclipse不为构建RAP应用程序提供直接支持。 现在,您需要使用多个Ant脚本和资源模板制作WAR文件。 RAP的CVS中的org.eclipse.rap.demo.feature显示了如何创建将org.eclipse.rap.demo项目打包为RAP应用程序的WAR文件。 您可以对其进行修改,并使功能项目可用于HTML查看器示例。

  1. 从RAP开发人员指南的在线版本(高级主题> WAR部署)下载团队项目设置文件。 (请参阅相关主题中的链接。)
  2. 选择“ 文件” >“ 导入” >“ 团队项目集” ,然后输入下载文件的位置。
  3. 单击Finish ,将从CVS导入必要的项目,包括org.eclipse.equinox.http.servletbridge,org.eclipse.equinox.servletbridge和org.eclipse.rap.demo.feature。
  4. 将org.eclipse.rap.demo.feature的名称修改为com.ibm.msdk.example.rap.feature ,然后将以下内容添加到功能列表中( 如图6所示 ):
    • com.ibm.msdk.example
    • com.ibm.msdk.example.rap
    • org.apache.commons.fileupload
    • org.apache.commons.io
    • org.eclipse.rwt.widgets.upload

    如果不需要RAP演示插件,请从功能列表中删除org.eclipse.rap.demo。

  5. 将功能部件的ID修改为com.ibm.msdk.example.rap.feature , 如图6所示:
    图6. HTML查看器的功能
  6. 配置并运行Ant任务,以构建整个HTML查看器RAP应用程序,如下所示:
    1. 打开webappBuilder.xml并将属性的值(第27行)修改为com.ibm.msdk.example.rap.feature
    2. 右键单击webappBuilder.xml,然后打开“外部工具”对话框( “运行方式” >“ 外部工具配置” )。
    3. 双击Ant Build
    4. 选择新条目com.ibm.msdk.example.rap.feature webappBuilder.xml
    5. 在“ JRE”选项卡中,将“ 运行时JRE 调整为“在与工作区相同的JRE中运行” 。 否则,脚本将无法使用PDE Ant Task导出我们的功能。
    6. 点击运行
    7. 您应该在控制台上收到一条BUILD SUCCESSFUL消息。

    请注意,从进度指示器来看,PDE导出任务仍在后台运行。 等待直到完成。

  7. 生成config.ini文件:
    1. 在org.eclipse.rap.demo中打开Java文件ConfigIniCreator.java并修改第39行,如清单13所示。

      清单13.修改后的代码
      File file = new File( "build\\demo\\WEB-INF\\eclipse\\plug-ins" )
    2. 作为Java应用程序启动ConfigIniCreator。 (类似于清单14的文本将输出到Eclipse控制台。)
      清单14. Config.ini示例
      #Eclipse Runtime Configuration File
      osgi.bundles= com.ibm.icu.base@start,\
      com.ibm.msdk.example.rap,\
      com.ibm.msdk.example@start,\
      org.apache.commons.fileupload@start,\
      org.apache.commons.io@start,\
      org.eclipse.core.commands@start,\
      org.eclipse.core.contenttype@start,\
      org.eclipse.core.databinding.observable@start,\
      org.eclipse.core.databinding.property@start,\
      org.eclipse.core.databinding@start,\
      org.eclipse.core.expressions@start,\
      org.eclipse.core.jobs@start,\
      org.eclipse.core.runtime@start,\
      org.eclipse.equinox.app@start,\
      org.eclipse.equinox.common@2:start,\
      org.eclipse.equinox.http.registry@start,\
      org.eclipse.equinox.http.servletbridge@start,\
      org.eclipse.equinox.http.servlet@start,\
      org.eclipse.equinox.preferences@start,\
      org.eclipse.equinox.registry@start,\
      org.eclipse.help@start,\
      org.eclipse.osgi.services@start,\
      org.eclipse.rap.demo@start,\
      org.eclipse.rap.jface.databinding@start,\
      org.eclipse.rap.jface@start,\
      org.eclipse.rap.rwt.q07,\
      org.eclipse.rap.rwt@start,\
      org.eclipse.rap.ui.views@start,\
      org.eclipse.rap.ui.workbench@start,\
      org.eclipse.rap.ui@start,\
      org.eclipse.rwt.widgets.upload@start,\
      org.eclipse.equinox.servletbridge.extensionbundle
      osgi.bundles.defaultStartLevel=4
    3. 复制所有这些内容,并替换{Project root} /templates/WEB-INF/eclipse/config.ini的旧内容。
    4. 从所有RAP片段(com.ibm.msdk.example.rap)中除去@start
    5. 第一次将{Project root} /templates/WEB-INF/eclipse/config.ini复制到{Project root} / build / demo / WEB-INF / eclipse / configuration /,并替换旧的。 如果对feature.xml进行了修改,则需要重新生成config.ini。
    6. 在com.ibm.msdk.example.rap.feature / script目录中创建一个新的build.xml,并将以下脚本复制到其中:
      清单15.使用ANT脚本构建WAR文件
      <?xml version="1.0"?>
      <project name="warbuild" default="war.gen"><property name="war.name" value="sample.war"/><target name="war.gen" depends="clean"><war warfile="../${war.name}" webxml="../build/msdk/WEB-INF/web.xml"><lib dir="../build/msdk/WEB-INF/lib" /><lib dir="../build/msdk/WEB-INF/eclipse" prefix="WEB-INF/eclipse" /></war></target><target name="clean"><delete file="../${war.name}"/></target>
      </project>
    7. 在Eclipse中作为Ant Build运行build.xml。 HTML查看器的WAR文件sample.war将在项目根目录中生成, 如图7所示:
      图7. Eclipse工作区中的sample.war

将文件部署到Tomcat

要将sample.war文件部署到Tomcat,您需要将sample.war复制到{TOMCAT_HOME} / webapps /。 启动Tomcat,并使用http:// localhost:8080 / sample / msdkExample访问HTML查看器, 如图8所示:

图8.将sample.war部署到Tomcat

部署的WAR文件不起作用

您可能会遇到一种情况,即RAP在开发时正在运行,但是在将其部署到Tomcat或WebSphere之后却无法正常工作。 如果遇到这种情况,请检查以下内容:

  • 如果RAP应用程序使用build.properties文件,请确保将其导出,并且所使用的所有库都列在插件类路径中。
  • 通过将清单16中的修改添加到web.xml来启用OSGi控制台。
    清单16.启用OSGi框架的控制台
    <init-param>
    <param-name>commandline</param-name>
    <param-value>-console</param-value>
    </init-param>
    <!--
    <init-param>
    <param-name>commandline</param-name>
    <param-value>-registryMultiLanguage</param-value>
    </init-param>
    -->
    <init-param>
    <param-name>enableFrameworkControls</param-name>
    <param-value>true</param-value>
    </init-param>

    在控制台中键入ss (例如Tomcat),然后查看是否所有捆绑软件都已启动。 如果不是,请尝试使用start <bundle-id>启动它们。 堆栈跟踪可能会暗示丢失了什么。 确保ss列表中有一个状态为RESOVLEDorg.eclipse.equinox.servletbridge.extensionbundle , 如图9所示:

    图9. Tomcat中的启动包
  • 确保WAR不包含:
    • javax.servlet捆绑包。 在插件清单中,必须在Import-Package部分而不是Require-Bundle列出javax.servlet
    • org.eclipse.update.configurator软件包。
    • *.jetty.*捆绑包。
  • 如果重新部署了WAR文件,请确保删除servlet引擎的工作目录(例如,Tomcat中的<tomcat_install> / work / Catalina / localhost / work / <webapp_name>)。

结论

本文介绍了RAP和RCP应用程序开发的单源概念。 您学习了如何使用单源技术将现有RCP应用程序转换为基于Web的RAP应用程序。 RAP为RCP开发人员提供了强大的工具,可以重用您现有的代码库来创建基于Web的应用程序。 本文还提供了一种将RAP应用程序打包到WAR文件的方法,并展示了如何将其部署到Web容器。


翻译自: https://www.ibm.com/developerworks/web/library/wa-rcprap/index.html

rap开发与rcp开发

rap开发与rcp开发_使用RAP将RCP应用程序转换为Web应用程序相关推荐

  1. web开发集成数字证书_每个数字设计师都应该知道的Web开发的七个原则

    web开发集成数字证书 A career path into digital design is often winding, meaning many practitioners come from ...

  2. groovy 模板_一个非常轻巧的基于Groovy的Web应用程序项目模板

    groovy 模板 一个非常轻巧的基于Groovy的Web应用程序项目模板 您可能听说过该项目Grails是Ruby on Rails之类的Groovy版本的框架,该框架使您可以通过动态脚本更轻松地创 ...

  3. 做事用人 用人做事_做事:构建我的第一个Web应用程序的经验教训

    做事用人 用人做事 On the 5th of June, 2020, after almost two weeks of (re)learning javascript, fixing bugs, ...

  4. chromium 桌面_如何使用Chromium和PyInstaller将Web应用程序转换为桌面应用程序

    chromium 桌面 Packaging and distributing your app sounds simple in principle. It's just software. But ...

  5. react 小程序转换_如何将AngularJS 1.x应用程序转换为React应用程序-一次转换一个组件。

    react 小程序转换 Angular and React are both great frameworks/libraries. Angular provides a defined struct ...

  6. vr设备应用程序_在15分钟内构建一个VR Web应用程序

    vr设备应用程序 在15分钟内,您可以开发一个虚拟现实应用程序,并在Web浏览器,VR头盔或Google Daydream上运行它. 关键是A-Frame ,这是Mozilla VR Team构建的开 ...

  7. ipad键盘程序坞快捷键_将键盘快捷方式添加到您的Web应用程序。

    ipad键盘程序坞快捷键 React和几行代码可以挽救! 我想象一个场景. 您在一家名为Adob的大公司工作--您在一家名为Abode的初创公司工作,开发了一个名为PhotoStore的照片编辑应用程 ...

  8. r语言中的shiny教程_如何使用Shiny在R中编写Web应用程序

    r语言中的shiny教程 新年快乐! 这个月我忙于撰写一些较大的文章,因此请在接下来的几周内查找这些文章. 对于本月的Nooks和Crannies,我想简要指出一个我一直在用它进行自我教育的出色R库. ...

  9. mysql怎么创建窗口应用程序_在NetBeans中使用MySQL创建简单Web应用程序(二)

    既然数据层已经准备就绪,我们开始在适当的位置放置Java类.逻辑层由三个类组成:SubjectName.java.SubjectCounselor.java和AccessDB.java.这几个类提供两 ...

  10. web前端模块化开发_真正的模块化Web应用程序:为什么没有开发标准?

    web前端模块化开发 OSGI , SpringSource , Jboss模块 ,J2EE和清单永远不会结束.所有这些技术都向他们的最终用户/开发人员保证了相同的东西,或多或少是Java模块化Web ...

最新文章

  1. 解决Ubuntu 14.04 Unity桌面环境登录后冻结问题
  2. xheditor的使用方法
  3. 对地图的marker 添加双击事件
  4. 究竟什么是云原生DevOps呢?
  5. 2017第35周日乱记
  6. 零基础小白如何入门前端?以下这几点一定是你需要的
  7. 前端自动化构建工具之webpack入门——简单入门
  8. 02~ 一步一步教你使用 SVN之SVN 的介绍
  9. Activiti6教程一
  10. (动态示例)制作chm离线手册文件-w3school为例
  11. Towards a Theory of Accountability and Audit
  12. Bootstrap3引入相关知识点
  13. 我错过了乔布斯和初代 iPhone,十年后幸好没错过你
  14. 【教学类-17-01】20221122《世界杯七巧板A4整页-随机参考图+七巧板+画框》(大班)
  15. AI留给教练的时间已经不多了
  16. keras网易日月光华笔记
  17. android pmem内存,android内存管理-ION/PMEM【转】
  18. 1095 Anigram单词
  19. 计算机四级数据工程师题库,全国计算机等级考试四级数据库系统工程师练习题...
  20. 10月Tiobe编程语言排行榜更新:C语言和Java均败了!

热门文章

  1. python sub函数用法_Python Pandas dataframe.sub()用法及代码示例
  2. 区块链项目数据存储系统分析
  3. IBM服务器 不用引导盘安装方法详解
  4. 以太网没有有效IP配置问题
  5. 为什么神经网络有偏置? 神经网络中的偏置(bias)究竟有这么用
  6. 关于marked数组处理
  7. 【串讲总结】涵盖ML/DL/NLP/推荐/风控/数学等知识点汇总列表
  8. 用 “类别混搭” 法实现移动游戏的创新
  9. 图计算的黄金时代 知识图谱背后的数据价值
  10. 中国金融市场目前存在的金融牌照总结