GWT:多个脚本实例通信

时间:2013-08-03 16:34:59

标签: java gwt communication instances

问题很简单但可能无法解决? 至少对我来说:/

情况: 假设我有一个动态页面系统,其中服务器提供包含GWT模块的自我的附加副本。这意味着客户端上的主要GWT实例应该管理新的传入GWT脚本,这些脚本只是由主实例本身使用标签添加。 现在,主GWT实例需要以最简单的方式(GWT内部)方式与新创建的脚本实例进行通信。

那么什么是不可能的:如果不是绝对必要的话,双方都要编写愚蠢的JSNI Wrappers。

我提出的Soltuions是: 使模块都可以使用,包括通用接口,例如:

package com.whatever.interfaces;

public interface Communication {
  void showMessage(String message);
}

所以两者现在都会继承这个模块并知道定义。 主客户端现在将加载动态JS并注册通信的实现,动态的客户端将使用它。我尝试使用setPropertyObject在$ wnd和on元素上存储引用。在$ wnd它们是null,这可能/可能与GWT Iframing有关?例如,对于RootPanel元素的属性,将引发ClassCastException。

有没有好办法遇到这个?我的另一个想法是使用JSNI将接口称为桥接模块上的实现,但我不确定这是否是一个好方法。

感谢您的帮助,谢谢。

编辑: 好吧,我几乎得出结论,这是不可能的。 即使您可能在某处使用了相同的接口,但对于编译的不同模块,它们将是它自己的实例化,即使使用相同的模块作为公共接口。 使用JSNI的方法肯定是有可能的,但不是没有将所有属性映射到真正的JS对象并重新映射它们。这意味着你不能像你可能习惯的那样传递复杂的Java对象。我的结论是,使用CodeGenerators,你可以自动构建JSNI Wrappers和两个模块的重映射器,但这对我来说太麻烦了。

如果有人提出更好的想法,我仍然是开放的,但我只是想在我的调查结果中提供一些内容,以便其他人可以从我浪费的时间中受益;)

3 个答案:

答案 0 :(得分:0)

不久前,我创建了一个简单的原型实现来将Object实例共享给其他GWT模块。您可以在https://code.google.com/p/gwt-plug/上找到代码。是的,正如您所描述的那样,传输Java对象是一个问题。据我记忆,你只能传递原始值(int,float,...),字符串和JavaScriptObjects。但JavaScriptObjects很有可能

答案 1 :(得分:0)

正如您已经发现,单独编译的GWT模块之间的通信有些挑战,因为所有内容都是混淆的。虽然可以通过javascript,JSNI,JSO和JSON实现。

  1. 您可以使用JSNI直接在$ wnd对象上通过javascript创建通信挂钩。事件总线方法的排序可行。

  2. 您可以使用JSON传递复杂对象。

  3. 您可以使用JSO(JavaScript Overlays)在每个不同的模块中使用和操作JSON。

  4. 将所有这些组合在一起,您最终会得到一个迷你框架库模块,您可以在想要彼此通信的各种GWT模块之间共享。他们每个人都会继承公共框架模块并以他们自己的混淆形式进行编译,但由于他们使用javascript和JSON作为通用语言,他们不必担心混淆。

  5. 有意义吗?

答案 2 :(得分:0)

正如xsee的回答所解释的,你可以使用JSNI

从GWT创建一个钩子

为了做到这一点,请查看非常有用的项目http://code.google.com/p/gwt-exporter/