Как вызвать функцию Java GWT из Javascript? - PullRequest
8 голосов
/ 23 декабря 2011

Можно ли вызывать методы Java (GWT) из Javascript?Это также неясно из документации.Все примеры здесь http://code.google.com/intl/ru/webtoolkit/doc/latest/DevGuideCodingBasicsJSNI.html демонстрируют вызов функций Java из функций JSNI (не JS).

ОБНОВЛЕНИЕ 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 Ответ

11 голосов
/ 23 декабря 2011

ваш пример не сработает, так как вы пытаетесь использовать JSNI в каком-то внешнем скрипте.Если вы хотите позвонить из external JS, вам нужно использовать подход, описанный в этом вопросе , или использовать GWT exporter

UPDATE:

Самый безопасный способ раскрыть содержимое GWT - заключить вызов в какую-то другую функцию.Например:

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

В противном случае вы можете столкнуться с некоторыми странными ошибками в производственном режиме =)

...