Java GWT:多脚本实例通信

Java GWT:多脚本实例通信,java,gwt,communication,instances,Java,Gwt,Communication,Instances,问题很简单,但可能无法解决? 至少对我来说:/ 情况: 假设我有一个动态页面系统,其中服务器提供自包含GWT模块的额外副本。这意味着客户端的主GWT实例应该管理新的传入GWT脚本,这些脚本只是由主实例本身使用标记添加的。 现在,主GWT实例需要以最简单的方式(GWT内部)与新创建的脚本实例通信 所以,什么是不可能的:在两面都写愚蠢的JSNI包装,如果不是绝对需要的话 我提出的解决方案是: 使模块同时使用,包括通用接口,例如: package com.whatever.interfaces; p

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

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

所以,什么是不可能的:在两面都写愚蠢的JSNI包装,如果不是绝对需要的话

我提出的解决方案是: 使模块同时使用,包括通用接口,例如:

package com.whatever.interfaces;

public interface Communication {
  void showMessage(String message);
}
因此,两人现在都将继承这个模块,并知道其定义。 现在,主客户端将加载动态JS并注册通信实现,而动态客户端将使用它。我尝试使用setPropertyObject在$wnd和元素上存储引用。在$wnd上,它们为空,这可能与GWT Iframing有关?例如,对于根面板元素上的属性,将引发ClassCastException

有什么好的方法可以解决这个问题吗?我的另一个想法是使用JSNI调用接口作为桥接模块的实现,但我不确定这是否是一种好方法

非常感谢你的帮助,谢谢

编辑: 我得出的结论是,无论如何,这是不可能的。 尽管您可能在某些地方使用了相同的接口,但对于编译的不同模块,即使使用相同的模块作为公共基础,它们也将是它自己的实例化。 当然,使用JSNI的方法在某种程度上是可能的,但是如果不将所有属性映射到真实的JS对象并重新映射它们,就不可能。这意味着您不能像以前那样传递复杂的Java对象。我的结论是,使用CodeGenerator可以为这两个模块自动构建JSNI包装器和重新映射,但这对我来说太麻烦了


如果有人提出更好的想法,我仍然持开放态度,但我只想提供一些关于我的发现的内部信息,以便其他人可以从我浪费的时间中获益;)

不久前,我创建了一个简单的原型实现,用于将对象实例共享给其他GWT模块。你可以在上面找到代码。是的,正如您所描述的,传输Java对象是一个问题。就我所记得的,您只能传输原语值(int、float等)、字符串和JavaScriptObject。但是JavaScriptObjects是一个很好的选择

,因为您已经发现在单独编译的GWT模块之间进行通信有点困难,因为一切都是模糊的。通过javascript、JSNI、JSO和JSON,这是可能的

  • 您可以使用JSNI通过javascript直接在$wnd对象上创建通信挂钩。某种类型的事件总线方法是可行的

  • 可以使用JSON传递复杂对象

  • 您可以使用JSO(JavaScript覆盖)来使用和操作每个分散模块中的JSON

  • 将所有这些放在一起,您将得到一个迷你框架库模块,您可以在希望彼此通信的各种GWT模块之间共享该模块。它们将各自继承公共框架模块,并以自己的模糊形式编译,但由于它们使用javascript和JSON作为公共语言,因此不必担心模糊问题


  • 有意义吗?

    正如xsee的回答中所解释的,您可以使用JSNI从GWT创建一个钩子


    为了做到这一点,请看一看非常有用的项目

    我喜欢那个项目。很高兴找到波伦蒂诺!