0

問題は非常に単純ですが、解決できない可能性がありますか? 少なくとも私にとっては :/

状況: サーバーが GWT モジュールを含む自己の追加コピーを提供する動的なページ システムがあるとします。つまり、クライアント側のメイン GWT インスタンスは、タグを使用してメイン インスタンス自体によって単純に追加される新しい着信 GWT スクリプトを管理することになっています。ここで、メインの GWT インスタンスは、新しく作成されたスクリプト インスタンスと、可能な限り最も簡単な (GWT 内部の) 方法で通信する必要があります。

では、何が問題外なのか: 絶対に必要ではないにしても、愚かな JSNI ラッパーを両側に書くことです。

私が思いついた解決策は次のとおりです。共通のインターフェースを含む両方のモジュールを使用するようにします。例:

package com.whatever.interfaces;

public interface Communication {
  void showMessage(String message);
}

したがって、両方がこのモジュールを継承し、定義を認識します。メイン クライアントは動的 JS をロードし、Communication の実装を登録します。動的クライアントはそれを使用します。setPropertyObject を使用して、$wnd および要素に参照を格納しようとしました。$wnd では null です。GWT の Iframing に関連している可能性がありますか? たとえば、RootPanel 要素のプロパティの場合、ClassCastException が発生します。

これに遭遇する良い方法はありますか?私が持っている別のアイデアは、ブリッジ モジュールの実装としてインターフェイスを呼び出すために JSNI を使用することですが、これが良い方法かどうかはわかりません。

あなたの助けに感謝します、ありがとう。

編集:まあ、これはまったく不可能だという結論にほぼ達しました。どこかで同じインターフェイスを使用した可能性がありますが、同じモジュールを共通の基盤として使用していても、コンパイルされたさまざまなモジュールに対して、それらは非常に独自のインスタンスになります。JSNI を使用するアプローチは確かにいくらか可能ですが、すべての属性を実際の JS オブジェクトにマッピングし、それらを再マッピングしないわけにはいきません。つまり、おそらく慣れているように、複雑な Java オブジェクトを渡すことはできません。私の結論は、CodeGenerators を使用すると、両方のモジュールに対して JSNI ラッパーとリマッパーを自動的にビルドできるということですが、これは私にとって面倒すぎることです。

誰かがより良いアイデアを思いついた場合、私はまだ開いていますが、私の発見の内部を提供したいので、他の人が私の無駄な時間を利用できるようにします ;)

4

3 に答える 3

0

xseeの回答で説明されているように、JSNIを使用してGWTからフックを作成できます

これを行うには、非常に便利なプロジェクトhttp://code.google.com/p/gwt-exporter/をご覧ください。

于 2013-08-04T18:20:30.653 に答える
0

すべてが難読化されているため、個別にコンパイルされた GWT モジュール間の通信はやや困難です。ただし、javascript、JSNI、JSO、および JSON を介して可能です。

  1. JSNI を使用して、JavaScript を介して $wnd オブジェクトに直接通信フックを作成できます。ある種のイベントバスアプローチが機能します。

  2. JSON を使用して複雑なオブジェクトを渡すことができます。

  3. JSO (JavaScript オーバーレイ) を使用して、個別のモジュールのそれぞれで JSON を使用および操作できます。

  4. これらすべてをまとめると、相互に通信したいさまざまな GWT モジュール間で共有するミニフレームワーク ライブラリ モジュールが完成します。それぞれが共通のフレームワーク モジュールを継承し、独自の難読化された形式でコンパイルしますが、JavaScript と JSON を共通言語として使用しているため、難読化について心配する必要はありません。

わかる?

于 2013-08-03T22:35:11.410 に答える