web-dev-qa-db-ja.com

JavaScriptからGWT Java関数を呼び出す

私はGWTとJavaScriptの初心者です。私が従おうとしたこのタイプの同様の質問がありますが、私は失敗し続けます。

私はGWTアプリを持っているので、JavascriptからJava関数を呼び出す必要があります(特にhrefタグのonclickで)。)以下は私が行ったことです。

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)は私のコードの2つの整数変数です。また、エントリポイント関数でEncloseingClass.exportMyFunction()を呼び出しました。私はさまざまな種類の例外に遭遇し続けます(そのようなクラス例外はありません)。誰かが私を訂正してくれませんか?

よろしく

16
frodo

GWTのものをJSの世界にエクスポートすることについてもう少し説明しましょう。それを行うにはいくつかのオプションがありますが、3つの方法に焦点を当てます。

[編集済み]

0-JsInterop:GWTメンテナは、Javaメソッドをjavascriptに簡単にエクスポートし、javascriptをラップするための新機能に取り組んでいますこの機能は2.7.0では非常に実験的で、一部の機能はありませんでしたが、2.8.0ではほぼ機能します。 設計ドキュメント およびその他の ディスカッション をご覧ください。 =メーリングリスト内。

[終わり]

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タイプ(longを除く)とJavaScriptObjectオブジェクトのみを渡すことができることに注意してください。したがって、javascript配列を渡すときは、例のようにJavaScriptObjectで受け取る必要があります。この場合、javascriptは数値の型のみを使用するため、_args.getNumber_は常にdoubleを返し、Javaで変換する必要があります。

2-gwt-exporter大規模なプロジェクトをエクスポートする場合、または複雑なオブジェクトやクラスを処理する必要がある場合は、 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は、あらゆる種類のプリミティブ型(longでも)myfunc(long[] args)、var-args myfunc(long...args)を処理し、メソッドのオーバーロードなどをサポートします。

3-gwtquery最後に、 gwtquery が必要な場合は、テクニックを使用して、windowなどの任意のjsオブジェクトに関数プロパティを追加できます。

_// 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を使用すると、常に数値をdoubleとして返すgwt JsArrayMixedクラスを使用できます。または、Java _((JsCache)ary.get(1, Integer.class)_で数値を他の数値タイプに変換できるJsCacheを使用できます。

要約すると、この問題の処理に特化しているため、最初のオプションとしてgwt-exporterを使用したいと思います。 2番目のオプションとして、gwtを大幅に補完するgqueryを使用します。最後に、可能な場合は手書きのjsniを使用しないようにします。通常、Javascriptは問題や間違いの原因です(gwtの主な目標はjsを扱わない)。

GWTエクスポーターを検討する必要があります。 GWT 2.8が間もなくリリースされるので、待つことを検討することもできます。 2015年の懇願の頃に出てくるはずだった。2015年はすでに始まっており、彼らは今GWT.createでデモンストレーションを行っているので、いつか出てくるはずだ。待つことができない場合は、experimental is interop、トップアンサーのようなJSNI、またはGWTエクスポーターのいずれかを使用できます。 JSNIはより複雑で、多くのボイラープレートコードが含まれるため、多くのjs相互運用を行う必要がある場合は、GWT-exporterをお勧めします。

1
jgleoj23