首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在GWT中可以从Javascript访问Java对象吗?

在GWT中可以从Javascript访问Java对象吗?
EN

Stack Overflow用户
提问于 2013-12-21 02:13:41
回答 1查看 981关注 0票数 1

我的目标是直接从javascript发起RPC调用。我已经想出了伪造回调的方法(因为RPC的异步特性),但我不知道如何将自定义对象放入javascript中。

所以,我已经创建了一个名为Interop的类,并且我静态地创建了我感兴趣的服务(我不得不使用静态,因为它是我能得到的所有工作,我不认为它现在是相关的):

代码语言:javascript
复制
public class Interop {
    private static final GreetingServiceAsync service = GWT.create(GreetingService.class);
    ...
}

然后我创建了一个函数,它将执行异步调用并处理响应:

代码语言:javascript
复制
public static void greetServer(final String success, final String failure) {
    service.greetServer(
        "Homer", 
        new AsyncCallback<String>() {
            public void onFailure(Throwable caught) {
                callback(failure, caught.toString());

            }
            public void onSuccess(String result) {
                callback(success, result);
            }
        }
    );
}

然后,我创建了一个JSNI函数来将这个函数导出到javascript,我从onModuleLoad()调用它:

代码语言:javascript
复制
public static native void export() /*-{
    $wnd.greetServer = $entry(@package.Interop::greetServer(Ljava/lang/String;Ljava/lang/String;));
}-*/;

并创建另一个JSNI函数来处理回调:

代码语言:javascript
复制
public static native void callback(String func, String response) /*-{
    $wnd[func](response);
}-*/;

这样,我最初传递给greetServer()的函数名将作为回调函数调用。在处理String或(我假设)原始类型时,这一切都很有效。但是当我尝试使用自定义类型(注意修改后的custom类型参数)时:

代码语言:javascript
复制
public static native void callback(String func, Custom response) /*-{
    $wnd[func](response);
}-*/;

那么在javascript中结束的东西就不能工作了。它似乎是一个具有级联数组的javascript对象,并且没有可用的方法。

因此,问题是,如何从javascript (而不是JSNI)中访问非基本类型或基本类型的源自Java的对象?据我所知,JavaScriptObject需要起源于javascript,但在我的例子中,我的对象起源于Java。我能做什么?

我还研究了gwt-exporter,它展示了如何从javascript实例化java内容,但没有展示如何在javascript中访问源自java的内容。

我知道这有点令人困惑,所以如果你有任何问题,请告诉我。谢谢!

EN

回答 1

Stack Overflow用户

发布于 2013-12-26 23:59:45

对于gwt-exporter,这可能是您的代码:

代码语言:javascript
复制
// Create and export a closure used to wrap javascript callbacks
@ExportClosure
public static interface InteropCallback extends Exportable {
  void exec(String message);
}

// Make your Interop class exportable and export methods in it
@ExportPackage("foo")
@Export
public static class Interop implements Exportable {
  final static GreetingServiceAsync service = GWT.create(GreetingService.class);

  public static void greeting(String message, 
                              final InteropCallback success,
                              final InteropCallback error) {
    service.greetServer(message, new AsyncCallback<String>() {
      public void onFailure(Throwable caught) {
        error.exec(caught.getMessage());
      }
      public void onSuccess(String result) {
        success.exec(result);
      }
    });
  }
}

// In your onModuleLoad you have to make gwt-exporter export your stuff
@Override public void onModuleLoad() {
  ExporterUtil.exportAll();
  ...
}

最后,从手写的javascript调用java方法。

代码语言:javascript
复制
window.foo.Interop.greeting("Hello", 
                            function(s){console.log(s)},
                            function(s){console.log(s)}
                            );
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20709611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档