Вызов функции GWT Java из JavaScript - программирование
Подтвердить что ты не робот

Вызов функции GWT Java из JavaScript

Я новичок в GWT и JavaScript. Есть аналогичный вопрос такого типа, с которым я пытался следовать, но я продолжаю терпеть неудачу.

У меня есть приложение GWT, мне нужно вызвать функцию Java из Javascript (в частности, в onclick тега href). Следующее - это то, что я сделал.

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() в функции точки входа. Я продолжаю использовать различные исключения (нет исключения класса). Может кто-то, пожалуйста, поправьте меня?

Привет

4b9b3361

Ответ 1

Позвольте мне объяснить немного больше об экспорте материалов GWT в мир JS. У вас есть несколько вариантов сделать это, но я сосредоточусь на трех методах.

[Изменено]

0- JsInterop: поддерживающие GWT работают в новой функции, чтобы легко экспортировать java-методы в javascript и обернуть объекты javascript. Особенность была очень экспериментальной в 2.7.0, не имеющей некоторых функций, но в 2.8.0 будет почти функциональной. Пожалуйста, ознакомьтесь с Документация по дизайну и другими дискуссиями в списке рассылки.

[END]

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 будет возвращать всегда double, и вам нужно преобразовать в java.

2- gwt-exportorter. Для экспорта больших проектов или когда вам нужно обрабатывать сложные объекты и классы, я предпочитаю использовать gwt-exporter

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-exportorter будет иметь дело с любыми примитивными типами (даже с длинными) 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, который всегда возвращает число как double, или вы можете использовать JsCache, который позволяет преобразовывать числа в любой другой числовой тип в java ((JsCache)ary.get(1, Integer.class)

В качестве резюме я предпочел бы использовать gwt-exportorter как первый вариант, потому что он специализируется на решении этой проблемы. В качестве второго варианта я бы использовал gquery, который является серьезным дополнением к gwt. Наконец, я бы избегал использовать рукописные jsni, если это возможно, Javascript обычно является источником проблем и ошибок (думаю, что главная цель gwt - не обрабатывать js).

Ответ 2

Вы должны рассмотреть экспортера GWT. Вы даже можете подумать, потому что GWT 2.8 должен появиться довольно скоро. Предполагалось, что он выйдет некоторое время. Просьба в 2015 году. 2015 год уже начался, и они сейчас демонстрируются на GWT.create, поэтому он должен выйти в любой день. Если вы не можете ждать, тогда вы можете либо использовать экспериментальный interop, JSNI, как, например, главный ответ, или экспортер GWT. JSNI более сложный и включает в себя много кодовых табличек, поэтому, если вам нужно сделать много js interop, я рекомендую GWT-exporter.