0

GWT では、ホスト モード「開発モード」でアプリケーションを実行するために、以下に示すように get.codesvr パラメータを URL に追加します。

/?gwt.codesvr=127.0.0.1:9997

最初の質問は、コンパイルされた JavaScript ファイルの代わりに .class ファイルを提供するために JVM インスタンスを開始するタイミングを GWT がどのように認識しているのか知りたいということです。GWT が開発モードでどのように機能するかがわかりません。com.google.gwt.devDevMode に main() があります。この main( ) はどのように呼び出されますか?

2 番目の質問は、GWT devmode が Jetty サーバーで実行されると記載されているドキュメントにありますが、ブラウザーで実際の JavaScript が表示されます。この jetty サーバーは、クライアント側コードの .class ファイルから JavaScript をどのように出力しますか?

ありがとう。

4

2 に答える 2

4

Sockets と Browser Plugin を介して行われるすべての魔法。

設計: アウト プロセス ホスト モード (OOPHM)

これが本質的な部分です。

次の GWT コードを検討してください。

public class MyEntryPoint implements EntryPoint {
    private static native int jsniMethod() /*-{
      return 1;
    }-*/;

    public void onModuleLoad() {
      jsniMethod();
    }
  }

JavaScript : ブラウザー プラグインは、モジュール名を含む LoadModuleMessage を送信します。

Java : ホスト モード サーバーは LoadModuleMessage を受信し、モジュールをロードして、対応する EntryPoints で onModuleLoad を呼び出します。この場合、 MyEntryPoint::onModuleLoad が呼び出されます。MyEntryPoint がコンパイルされると、LoadJsniMessage が送信されて各 JSNI メソッドのブラウザ側 JavaScript 関数が作成されます。次に、onModuleLoad が jsniMethod を呼び出すと、InvokeMessage が送信されます。

JavaScript : これは、この例の重要な部分です。JavaScript エンジンは現在、送信した LoadModuleMessage からの戻りを待っていますが、同じスレッドで MyEntryPoint::jsniMethod への呼び出しを呼び出す位置にある必要があります。これは、すべてのリモート呼び出しに続いて、スレッドが読み取りおよびディスパッチ ルーチンに入るようにすることによって実現されます。この場合、スレッドは LoadJsniMessage および InvokeMessage メッセージを受信し、jsniMethod を呼び出して、値 1 を含む ReturnMessage を送信します。

Java : read-and-dispatch ルーチンは ReturnMessage を受け取り、jsniMethod への呼び出しから戻ることを認識します。onModuleLoad メソッドを完全に実行すると、ReturnMessage が送信され、最上位の読み取りとディスパッチのループに戻ります。(すべての呼び出しはブラウザーの UI イベントのディスパッチから発生するため、ホスト モードのサーバーのみがアイドル時間中に読み取りとディスパッチのルーチンにとどまる必要があります。ブラウザーは、最初に呼び出された JavaScript 関数を終了することによって制御を返すだけです。)

于 2013-09-03T05:29:28.630 に答える
2

をクエリ文字列に追加するgwt.codesvrだけでは明らかに十分ではありません。

最初に、DevMode (com.google.gwt.dev.DevModeクラス) を起動します。これは組み込みの Jetty サーバーを起動し (-noserver引数で無効にしない限り) (さらに重要なこととして) ブラウザーをリッスンします (デフォルトでは、ポート 9997 で localhost ネットワーク インターフェイスのみに設定されます)。 .

gwt.codesvr 次に、 DevModeがリッスンするアドレスとポートを指定して、ブラウザーでアプリを開きます。*.nocache.jsファイルが読み込まれると、の代わりにgwt.codesvrと が読み込まれます。そのコードは、ブラウザーにインストールした (またはインストールするように指示した) GWT Dev Plugin をロードし、クエリ文字列引数で指定されたアドレスとポートで DevMode に接続するように指示します。devmode.html*.cache.htmlgwt.codesvr

そうすれば、ブラウザは DevMode と対話し、Java コードをロードしてコンパイルし、JVM で実行します。そのダイアログがどのように機能するかは、GWT wikiで説明されており、Suresh によって既に指摘されています。

于 2013-09-03T08:53:49.637 に答える