通过HTML脚本标签调用GWT Java函数

14

我有一个 GWT 项目,我想在 GWT 项目的主 HTML 文件中添加一个脚本标签,以调用客户端代码中的 Java 函数。

根据 文档,我应该添加类似以下 html 标签的内容:

<script type='text/javascript'> 
this.@com.myCompany.myProject.client.myClass::myFunction();
</script>

其中com.myCompany.myProject.client.myClass是类路径,myFunction是我想要调用的Java函数。

当我尝试使用以下实现的myFunction时,没有任何反应

public void myFunction() {
    HTMLPanel panel = new HTMLPanel("I have been called");
    RootPanel.get().add(panel);
}

也就是说,myFunction 没有被调用。

但是当我从一个 JSNI 方法调用时,它就可以工作。

这个调用可能无法从 HTML 脚本中进行,或者我做错了什么?

谢谢!

1个回答

13
  1. 你试图做的事情行不通,因为GWT编译器会将所有标识符名称重命名以最小化生成的代码大小:因此myFunction()实际存在,但它被称为其他名称。

  2. 你正在查看旧版本的文档。在最新版本中,这一切都有所解释:从手写JavaScript调用Java方法

解决方法 - 在某个地方添加一个额外的方法:

public static native void exportMyFunction() /*-{
   $wnd.myFunction =
      $entry(@com.myCompany.myProject.client.myClass::myFunction());
}-*/;

然后在您的应用程序初始化中,必须调用EnclosingClass.exportMyFunction()。然后在手工编写的JavaScript中,您可以通过以下方式访问它:

window.myFunction();

1
我正在尝试解决一个类似的问题,只是想问一下,如何将String传递给myFunction()?像myFunction(String s)这样? - quarks
1
查看此文档以了解如何向JSNI调用添加参数:http://code.google.com/webtoolkit/doc/latest/DevGuideCodingBasicsJSNI.html#methods-fields - Peter Knego
2
此外,在这个答案中有完整的例子:https://dev59.com/plXTa4cB1Zd3GeqPxgOe - Peter Knego
@axle123,所有的内容都在文档中:http://www.gwtproject.org/doc/latest/DevGuideCodingBasicsJSNI.html#methods - Peter Knego
这对于从本地方法调用Java实例方法有效,但不适用于手写JavaScript。这是因为您必须将方法的初始导出到JavaScript(就像此答案和文档所示)。但是,如何导出单个JavaScript函数,以便在未来用于调用尚不存在的实例的实例方法?文档中“从JavaScript调用手写Java方法”的示例显示两个静态方法,这是有原因的。如果有人可以使用实例方法完成此操作,我会给您买六瓶啤酒。 - jewbix.cube
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接