【问题标题】:Possible to disable GWT EntryPoint during runtime?可以在运行时禁用 GWT 入口点吗?
【发布时间】:2013-02-11 23:51:32
【问题描述】:

在我的 GWT 2.5 应用程序中,我有两个入口点。 EntryPoint A 是主应用程序,EntryPoint B 提供了我的应用程序的小部件版本。

根据我提供给容器的启动参数,我想启用/禁用 EntryPoint B。我该如何实现?我知道如何在编译期间通过从我的 *.gwt.xml 文件中删除对应的声明来完全禁用 EntryPoint。

【问题讨论】:

  • 你能告诉我你是如何将启动参数传递给容器的吗?那个容器是什么?
  • 很简单,例如使用系统变量,我可以通过 System.getProperty 检索。此外,我还定义了一个 GWT RPC 接口,以便在需要时将这些值传输到客户端。

标签: gwt entry-point


【解决方案1】:

在你的gwt.xml

<define-property name="disableEntryPoint" values="true,false" />

<!-- Provide a default -->
<set-property name="alternateFeatures" value="false" />


<replace-with class="com.example.EntryPoint1">
  <when-type-is class="com.example.EntryPoint2" />
  <when-property-is name="disableEntryPoint" value="false" />
</replace-with>

请参考:http://code.google.com/p/google-web-toolkit/wiki/ConditionalProperties

【讨论】:

  • 只是为了我的理解:我认为 *.gwt.xml 文件仅在编译时相关,但在运行时不相关?还是我误会了什么?
  • 你是对的。 *.gwt.xml 是 GWT 编译过程中使用的配置文件,用于将 java 转换为 js。
  • 代码将根据 gwt.xml* 文件中提供的信息进行编译。一旦代码编译你就不能改变它,因为它转换成java脚本。您只能在编译之前做一些事情(据我所知,在运行时更改入口点类几乎是不可能的)。
  • @Adarsha 是的。已经编译成 JS 了,那运行时怎么会有类呢??
  • 是的,我知道如何在编译期间执行此操作,但我在运行时需要此操作。否则,我必须创建两个不同的工件(有和没有小部件战争),这对于我正在处理的部署场景来说开销太大。
【解决方案2】:

一个 GWT 应用程序只能有一个入口点。 因此,您可以创建 2 个容器,例如 ContainerA 和 ContainerB,而不是 2 个应用程序。在 Entrypoint 的 onModuleLoad 方法中,您执行 RPC 调用以获取 Container 决定参数。并根据你做的参数

public void onModuleLoad()
{ 
      getRPCService.getStartUpParameter( AsyncCallBack<Parameter>
      { 
             public void onFailure()
             {
             }

             public void onSuccess(Parameter parameter)
             {
                   if( ContainerARequired( parameter ) )
                   {
                          RoolLayoutPanel.get().add( ContanerA )
                   }
                   else
                   {
                          RoolLayoutPanel.get().add( ContanerB )
                   }
             }
      });
}

使用此方法,您的 js 大小会增加。因此,使用代码拆分和运行异步概念将大 js 文件拆分为较小的文件。有了这个,你可以只加载需要的js到浏览器中。

【讨论】:

  • 可以添加任意数量的入口点类,包括来自继承模块的类。入口点都被编译成一个单一的代码库。它们按照它们在模块文件中出现的顺序依次调用。因此,当您的第一个入口点的 onModuleLoad() 完成时,会立即调用下一个入口点。 developers.google.com/web-toolkit/doc/latest/…
  • 是的。这也是不错的选择。
【解决方案3】:

似乎您可以创建两个模块,每个模块提供不同的入口点。两者都将从通用逻辑模块继承。然后每个都有一个不同的 boostrap JavaScript URL(.nocache.js)。缺点是这些脚本与浏览器完全不同,因此如果您在小部件和完整版本之间切换,则没有缓存优势。

你也可以在入口点方法中做简单的测试入口点是否应该被执行——如果不应该就返回。例如,您可以检查预期的容器元素是否存在于 DOM、URL 或其他任何内容中。如果在单个模块中执行两个入口点,则没有太大问题。

【讨论】:

  • 我决定按照你的第二段,只是从模块加载方法返回,以防我不想继续。它很简单,可以按预期工作。
【解决方案4】:

也许,最好让一个应用程序拥有一个入口点。 结果,您将拥有 2 个具有自己的上下文和访问路径的模块:

  • /entryA
  • /entryB

还有两个文件:

  • EntryA.gwt.xml
  • EntryB.gwt.xml

这些将包括 Application.gwt.xml

中的常见内容

【讨论】:

  • 是的,我需要在运行时而不是编译时做出决定!
猜你喜欢
  • 2020-11-06
  • 2012-02-05
  • 1970-01-01
  • 2013-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-27
  • 2011-04-21
相关资源
最近更新 更多