从JavaScript调用GWT Java函数(Calling GWT Java function

2019-08-31 11:49发布

我是一个新人,GWT和JavaScript。 有这种类型我试图遵循类似的问题,但我一直失败。

我有一个GWT应用程序,我需要从JavaScript调用Java函数(在href标记的onclick,尤其如此。)下面是我做了什么。

public class JSNITest {

 public static void handleAnchorClick(int a , int b) {
   Window.alert("Current row and Column is " + a + "  " + b);
 }

 public static native void exportMyFunction()/*-{
    $wnd.handleAnchorClick = function(param1,param2){
        @company.package.class.JSNITest::handleAnchorClick(*)(param1,param2);
 }-*/;

}

而在HTML,

<a href="javascript:handleAnchorClick(a1,a2);">link</a> 

(a1 , a2)是在我的代码两个整型变量。 我也呼吁EnclosingClass.exportMyFunction()的入口点函数。 我一直运行到各种异常(没有这样的类除外)。 可有人请纠正我?

问候

Answer 1:

让我解释一点关于出口GWT的东西给JS世界。 您有几种选择这样做,但我将专注于三个方法。

[EDITED]

0- JsInterop:GWT维护者在一个新的功能,工作轻松Java方法导出到JavaScript和包装的JavaScript对象。 该功能是非常2.7.0实验缺乏一些功能,但在2.8.0将几乎功能。 请看看到设计文档 ,以及其他讨论的邮件列表。

[结束]

1 JSNI:第一个是写自己的JSNI,在这种情况下,你必须知道有关可能的错误,你可以做。 基本上,这些错误是因为你必须知道如何处理的类型。 在你的情况,如果你想获得一个JavaScript数组(就像你问在下面的评论),该解决方案可以是:

public static native void exportMyFunction()/*-{
  $wnd.handleAnchorClick = @company.package.class.JSNITest::handleAnchorClick(*);
}-*/;

public static void handleAnchorClick(JsArrayMixed args) {
  Window.alert("Current row and Column is " +
                args.getNumber(0) + "  " + args.getNumber(1));
}

public void onModuleLoad() {
  exportMyFunction();
}

//javascript code
window.handleAnchorClick([1,2])

需要注意的是JSNI只允许你通过primitive类型(除长)和JavaScriptObject对象。 因此,通过JavaScript数组时,你必须有一个接受它JavaScriptObject像的例子。 在这种情况下,由于JavaScript的只使用了数字的类型, args.getNumber将返回总是加倍,你必须在Java转换。

2- GWT-出口商出口大项目,或者当你需要处理复杂的对象和类我宁愿使用GWT出口国

static class MyClass implements Exportable {
  @Export("$wnd.handleAnchorClick")
  public static void handleAnchorClick(double[] args) {
    Window.alert("Current row and Column is " +args[0] + "  " + args[1]);
  }
}

public void onModuleLoad() {
  GWT.create(MyClass.class);
}

//javascript code
window.handleAnchorClick([1,2])

GWT-出口将处理任何类型的基本类型(即使有很长) myfunc(long[] args) ,使用var-ARGS myfunc(long...args) ,它支持方法重载,等等。

3- gwtquery最后,如果你喜欢gwtquery ,你可以用一种技术来增加功能性的任何JS对象像window

// The GQuery Properties object is able to wrap a java Function object
// into an js property.
Properties wnd = window.cast();
wnd.setFunction("handleAnchorClick", new Function() {
  public void f() {
    // Get the js arguments[] array
    JsArrayMixed args = arguments(0);
    // Get the first element of the arguments[] array
    JsArrayMixed ary = args.getObject(0);

    Window.alert("Current row and Column is " +
                  ary.getNumber(0) + "  " + ary.getNumber(1));
  }
});

//javascript code
window.handleAnchorClick([1,2])

随着gquery你可以使用GWT JsArrayMixed类总是返回一个数字作为双,或可以使用JsCache它允许数字转换成Java中的任何其他数值类型((JsCache)ary.get(1, Integer.class)

作为总结,我宁愿使用GWT-出口作为第一选择,因为它是专门从事处理这个问题。 作为第二选择,我会用gquery这是一个严重的补充GWT。 最后,我会避免使用手写JSNI如果可能的话,JavaScript是正常的问题和错误(认为GWT的主要目标不是对付JS)的来源。



Answer 2:

你应该考虑GWT出口国。 你甚至可以考虑等待,因为GWT 2.8应该很快出来。 它应该出来周围的2015年2015年的乞讨一段时间已经开始,他们在GWT.create展示现在,所以应该现在出来的任何一天。 如果你不能等待,那么你可以用实验的互操作,JSNI像上面回答说或GWT出口国。 JSNI较为复杂,涉及到很多的锅炉板代码,这样,如果你有做了很多JS互操作的,我建议GWT-出口国。



文章来源: Calling GWT Java function from JavaScript