Как в GWT мы можем обмениваться объектами между javascript и java?

В моем классе есть pojo, содержащий некоторые методы для управления картами и массивами в java. Этот объект используется в вызовах RPC для переноса моих конфигураций. У меня есть механизм, в котором перед выполнением любого вызова RPC я выполняю функцию javascript. Теперь я действительно хочу передать мой объект конфигурации этой функции javascript, и эта функция javascript может манипулировать этим объектом конфигурации, и, наконец, этот управляемый объект будет передан в моем вызове RPC.

Итак, как я могу передать свой java-объект в javascript и разрешить им манипулировать?


person Ankur Gupta    schedule 17.07.2013    source источник
comment
Эта ссылка может помочь вам gwtproject.org/doc/latest/DevGuideCodingBasicsJSNI.html#sharing   -  person Mayank Pandya    schedule 17.07.2013
comment
Является ли эта функция JavaScript методом JSNI из вашего проекта GWT или сторонним js-файлом?   -  person fabfry    schedule 17.07.2013


Ответы (1)


Во-первых, вы не можете напрямую манипулировать объектами Java из javascript. Но что вы можете сделать, так это экспортировать набор статических методов в javascript и использовать их для управления вашими объектами. Это делается таким образом:

public void onModuleLoad() {
    exportHelloMethod(this);
}
public String exportedMethod(String name) {
    // Manipulate your java classes here
    // return something to JS
}
// Create a reference in the browser to the static java method
private native void exportHelloMethod(HelloClass instance) /*-{
  $wnd.hello = instance@[...]HelloClass::exportedMethod(Ljava/lang/String;);
}-*/;

К счастью, есть библиотека, которая позволяет более простым способом экспортировать методы и классы Java. Это gwt-exporter, и вам нужно просто реализовать Exportable в своем классе и использовать набор аннотаций, так как генератор экспортера выполняет всю работу.

@ExportPackage("jsc")
@Export
public class MyClass implements Exportable {
  public void show(String s){
  }
}

public void onModuleLoad() {
  ExporterUtil.exportAll();
}

Затем в javascript вы можете создать экземпляр класса и манипулировать им:

 var myclass = new jsc.MyClass();
 myclass.show('whatever');
person Manolo Carrasco Moñino    schedule 17.07.2013
comment
Должен ли экспортируемый объект исходить из javascript? Потому что если нет, то он не об этом спрашивает (и у меня похожая проблема). - person rjcarr; 20.12.2013
comment
Экспортируемый метод/класс закодирован в java так же, как вы делаете что-то в gwt, но экспорт его в javascript означает, что вы можете создавать экземпляры классов java из javascript или вызывать методы java из javascript. Это то, о чем вы спрашиваете? - person Manolo Carrasco Moñino; 20.12.2013
comment
Насколько я понимаю, плакат хочет создавать объекты в java-коде, а затем манипулировать ими в javascript. В ваших примерах это не описывается, и вы не говорите, что можете создавать (sic) классы java из javascript, что прямо противоположно этому. Мне интересно, потому что я хочу также создавать объекты в java и манипулировать ими в javascript, но не могу понять, как это сделать. Я отправил этот вопрос, но не получил ответа, вы можете помочь? stackoverflow .com/questions/20709611/ - person rjcarr; 24.12.2013
comment
Вам нужен экспортируемый класс, методы которого возвращают экспортируемые объекты Java, созданные в java. - person Manolo Carrasco Moñino; 26.12.2013