从外部JavaScript到Java传递JavaScript参数(Passing javascrip

2019-09-23 08:17发布

外部JavaScript给出了应交给一个名为Java方法的数量mycallback

我已经定义:

Java的:

class MyClass {
    public static void mycallback(JavaScriptObject number) {
        // do something with the number
    }
}

使用Javascript:

$wnd.callback = $entry(@com.package.MyClass::mycallback(Lcom/google/gwt/core/client/JavaScriptObject));

和JavaScript调用是:

$wnd.callback(number_from_external_javascript);

但我得到的错误:

JS value of type number, expected com.google.gwt.core.client.JavaScriptObject

而我的终极目标是与参数类型的Java方法Integer不是,JavascriptObject。 我只是想GWT应JavascriptObject将Javascript对象,但似乎不会。

GWT版本是2.4。

Answer 1:

GWT将自动施放 JS Number值到任何Java数目基本类型( intdouble等),JS字符串到Java String和JS布尔到Java boolean 。 它永远不会将它们作为JavaScriptObject秒。

如果该号码不能为空,然后只用一个声明回调int参数。 如果它可以为空,那么你就必须明确地创建一个Integer实例,是这样的:

$wnd.callback = $entry(function(n) {
      if (number != null) {
         // box into java.lang.Integer
         number = @java.lang.Integer::valueOf(I)(n);
      }
      @com.packge.MyClass::mycallback(Ljava/lang/Integer;)(number);
   });

另外,我想你可以通过一个JS数作为JavaScriptObject如果它是一个Number对象,而不是一个数值,所以这可能工作:

$wnd.callback = $entry(function(n) {
      n = new Number(n); // "box" as a Number object
      @com.packge.MyClass::mycallback(Lcom/google/gwt/core/client/JavaScriptObject;)(n);
   });


Answer 2:

关于使用什么GWT出口商发电机暴露你的GWT代码,JS,所以你没有对付JSNI,你可以从中受益的很好的特性,它具有(复杂的对象,数组,闭包,叠加,doclet的,等等)

使用GWT出口商类只需要实现可输出,并使用注释暴露你的方法。

public static class MyClass implements Exportable {
 @Export("$wnd.mycallback")
 public static void mycallback(long number) {
  Window.alert("" + number);
 }
}

该行添加到您的onmoduleload离开编译器做的工作

public void onModuleLoad() {
  ExporterUtil.exportAll();
}

然后,就像你说的,你可以使用的方法

<script>
  window.mycallback(1234)
</script>


文章来源: Passing javascript parameter from external javascript to java
标签: gwt jsni