将javascript参数从外部javascript传递到java

时间:2012-10-02 08:15:44

标签: gwt jsni

外部javascript给出一个应该移交给名为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

我的最终目标是使用参数类型为Integer的java方法,而不是JavascriptObject。我只是认为GWT应该在JavascriptObject中包装javascript对象,但它似乎不会。

GWT版本是2.4。

2 个答案:

答案 0 :(得分:7)

GWT将自动投射 JS数值到任何Java数字基元类型(intdouble等),JS String to Java String和JS Boolean到Java boolean。它永远不会传递给JavaScriptObject s。

如果数字不能为null,则只需使用int参数声明回调。如果它可以为null,那么您必须显式创建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编号为Number对象而不是Number值,则可以将JS编号作为JavaScriptObject传递,因此可能工作:

$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);
   });

答案 1 :(得分:2)

使用gwt-exporter生成器将你的gwt代码暴露给js怎么样,所以你不必处理jsni,你可以从它的好功能中受益(复杂的对象,数组,闭包,叠加,doclet)等等)

使用gwt-exporter,您的类只需要实现Exportable并使用注释来公开您的方法。

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>