如何从Javascript调用GWT java函数?

时间:2011-12-23 18:03:29

标签: java javascript gwt jsni

是否可以从Javascript调用Java(GWT)方法?从文档中还不清楚。这里的所有示例http://code.google.com/intl/ru/webtoolkit/doc/latest/DevGuideCodingBasicsJSNI.html演示了如何从JSNI(而不是JS)函数调用java函数。

更新1

这是一个Java代码:

public class Test_GoogleWeb_JSNI_02 implements EntryPoint {
/**
 * This is the entry point method.
 */
public void onModuleLoad() {
}

public static void Callee() {
    Window.alert("Callee");
}
}

以下是html中的来电按钮示例:

<input type='button' value='Call' onclick='Test02()'>

以下是我尝试过的一些功能,但没有奏效:

<script type="text/javascript">

    function Test01() {
        @com.inthemoon.tests.client.Test_GoogleWeb_JSNI_02::Callee()();
    }

    function Test02() {
        com.inthemoon.tests.client.Test_GoogleWeb_JSNI_02::Callee()();
    }


</script>

更新2

以下工作。

Java准备:

public void onModuleLoad() {
    Prepare();
}

public static native void Prepare() /*-{
    $doc.calleeRunner = @com.inthemoon.tests.client.Test_GoogleWeb_JSNI_02::Callee();
}-*/;

public static void Callee() {
    Window.alert("Callee");
}

呼叫者:

function Test03() {
        document.calleeRunner();
}

有更好的方法吗?

1 个答案:

答案 0 :(得分:11)

您的示例不起作用,因为您尝试在某些外部脚本中使用JSNI。如果您想从外部 JS中调用某些内容,则需要使用此question中描述的方法或使用GWT exporter

<强>更新

公开GWT的最安全的方法是将调用包装在其他函数中。例如:

    public native void expose()/*-{
    $wnd.exposedMethod = function(param){
         @com.my.MyClass::myFunction(*)(param);
    }
}-*/;

否则您可能会在生产模式中遇到一些奇怪的错误=)