GWT托管模式和applet

时间:2013-04-06 17:01:00

标签: java gwt

在托管模式下启动GWT时,可以在applet和GWT应用程序之间进行通信(反之亦然)?我认为不,因为applet只能与JavaScript通信(通过LiveConnect),但GWT的托管模式不会产生任何JS ......

1 个答案:

答案 0 :(得分:2)

虽然托管模式在jvm中运行部分代码,但是所有jsni / dom / native调用都被委托给浏览器,所以在你的情况下应该没有任何区别,你可以调用js来与你的applet通信。当然,不可能的是在同一个调试器会话中调试gwt和applet代码。

要从GWT调用applet方法,您需要一个jsni块,如:

 private native Object callFoo(String param) /*-{
    var appplet = document.getElementById('myapplet');
    return applet.foo(param);
 }-*/

要从您的applet调用GWT代码,您需要另一个jsni方法来导出您的gwt代码(请注意,您必须在入口点调用一次)

 private native void exportBar() /*-{
    window.bar = function(param) {
      return @com.examle.MyClass::myStaticMethod(*)(param);
    }
 }-*/

无论如何,我知道与applet通信的最佳方法是使用gwtai,因为所需的所有样板代码(包装器和jsni)都是自动生成的。

Gwtai,在托管模式下工作没有问题,虽然他们在他们的网站上说don't expect it to be stable,它足够稳定,我已经在生产中使用了很长时间。

  

GwtAI提供易于使用的跨浏览器Java Applet与Google Web Toolkit(GWT)项目的集成。 GwtAI包含许多实用程序和辅助类,例如自动创建包装器小部件和与Java小程序通信的机制。

您需要下载两个文件(GwtAI-Client.jar和GwtAI-Core.jar)并包含在项目的类路径中,然后修改您的.ui.xml文件以继承gwtai,您将能够开始编码。

首先,您必须在gwt-code中定义applet接口,以便使用延迟绑定的GWT编译器创建通信类实现。

 @ImplementingClass(MyClassImpl.class)
 @Height("60") @Width("350") @Archive("GwtAI-Client.jar, MyApp.jar")
 public interface MyApplet extends Applet {
   public Object foo();
 }

然后你必须在你的applet代码中实现这个接口。

 public class MyClassImpl extends JApplet implements MyApplet {
   public Object foo(){
      return "Hello";
   }
 }

最后使用你的gwt应用程序中的applet

 MyApplet applet = GWT.create(MyApplet.class);
 Object foo = applet.foo();

阅读GettingStarted指南以获取更多信息。