gwt jsni gwtquery gwt-exporter

Llamar a la función GWT Java desde JavaScript



jsni gwtquery (2)

Soy un recién llegado a GWT y JavaScript. Hay una pregunta similar de este tipo que he tratado de seguir, pero sigo fallando.

Tengo una aplicación GWT, necesito llamar a una función Java desde Javascript (en particular, haciendo clic en una etiqueta href). Lo siguiente es lo que hice.

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); }-*/; }

Y en el HTML,

<a href="javascript:handleAnchorClick(a1,a2);">link</a>

(a1 , a2) son dos variables enteras en mi código. También llamé a EnclosingClass.exportMyFunction () en la función de punto de entrada. Me sigo encontrando con varios tipos de excepciones (No Such such exception). ¿Puede alguien corregirme?

Saludos


Deberías considerar exportador de GWT. Incluso podría considerar esperar porque GWT 2.8 debería aparecer pronto. Se suponía que saldría en algún momento alrededor de la mendicidad de 2015. 2015 ya ha comenzado y se están demostrando en GWT.create en este momento, por lo que debería aparecer en cualquier momento. Si no puede esperar, puede usar experimental interoperabilidad, JSNI como lo dice la respuesta principal o exportador de GWT. JSNI es más complicado e implica mucho código de placa de caldera, así que si tiene que hacer un montón de interferencia js, recomiendo GWT-exportador.


Permítanme explicar un poco más sobre la exportación de cosas GWT al mundo JS. Tienes varias opciones para hacerlo, pero me centraré en tres métodos.

[EDITADO]

0- JsInterop : los mantenedores de GWT están trabajando en una nueva característica para exportar fácilmente los métodos de java a JavaScript y envolver los objetos de JavaScript. La característica fue muy experimental en 2.7.0 que carece de algunas características, pero en 2.8.0 será casi funcional. Consulte el documento de diseño y otras discusiones en la lista de correo.

[FIN]

1- JSNI : El primero es escribir tu propio jsni, en este caso debes ser consciente de los posibles errores que podrías cometer. Básicamente, estos errores se deben a que debes saber cómo tratar con los tipos. En su caso, si desea obtener una matriz de JavaScript (como lo hace en su comentario a continuación), la solución podría ser:

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])

Tenga en cuenta que JSNI solo le permite pasar tipos primitive (excepto long) y objetos JavaScriptObject . Por lo tanto, al pasar una matriz de JavaScript, debe recibirla con un JavaScriptObject como en el ejemplo. En este caso, dado que javascript solo usa un tipo para números, args.getNumber siempre devolverá un doble, y usted tiene que convertir en java.

2- exportador de gwt Para exportar proyectos grandes, o cuando necesite manejar clases y objetos complejos, prefiero usar 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-exporter se ocupará de cualquier tipo de tipos primitivos (incluso con long) myfunc(long[] args) , con var-args myfunc(long...args) , soporta métodos de sobrecarga y mucho más.

3- gwtquery Finalmente, si prefiere gwtquery , puede usar una técnica para agregar propiedades de función a cualquier objeto js, ​​como 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])

Con gquery puede usar la clase gwt JsArrayMixed que siempre devuelve un número como un doble, o puede usar un JsCache que le permite convertir números a cualquier otro tipo numérico en java ((JsCache)ary.get(1, Integer.class)

Como resumen, preferiría usar gwt-exporter como primera opción porque está especializado en el manejo de esta problemática. Como segunda opción, usaría gquery, que es un complemento serio para gwt. Finalmente, evitaría usar jsni escrito a mano siempre que sea posible, Javascript es normalmente una fuente de problemas y errores (piense que el objetivo principal de gwt no es tratar con js).