簡體   English   中英

GWT中的codeserver參數如何工作?

[英]How does codeserver parameter in GWT work?

在GWT中,為了在托管模式“開發模式”下運行應用程序,請將get.codesvr參數附加到URL,如下所示。

/?gwt.codesvr=127.0.0.1:9997

第一個問題是我想知道GWT如何知道何時啟動JVM實例來提供.class文件而不是已編譯的JavaScript文件嗎? 我似乎找不到GWT如何在開發人員模式下工作。 我確實在com.google.gwt.devDevMode中找到了main()。 該main()如何調用?

第二個問題是在文檔中說GWT devmode與Jetty服務器一起運行,但是我在瀏覽器中看到了實際的JavaScript。 這個碼頭服務器如何從客戶端代碼的.class文件輸出JavaScript?

謝謝。

所有神奇的事情都是通過套接字和瀏覽器插件完成的。

設計:進程外托管模式(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 :讀寫調度例程接收ReturnMessage,並且知道要從對jsniMethod的調用中返回。 完全執行onModuleLoad方法后,它將發送ReturnMessage並退回到頂級讀取和發送循環。 (由於所有調用都來自瀏覽器的UI事件分配,因此僅托管模式服務器在空閑時間需要保留在讀取和分配例程中。瀏覽器只需退出最初調用的JavaScript函數即可返回控制。)

gwt.codesvr添加到查詢字符串顯然是不夠的。

首先,您啟動DevMode( com.google.gwt.dev.DevMode類),后者將啟動嵌入式Jetty服務器(除非您通過-noserver參數禁用了它), 並且 (更重要的是)監聽您的瀏覽器(默認設置) (僅在端口9997上的本地主機網絡接口)。

然后,您在瀏覽器中打開您的應用程序,其中gwt.codesvr 指向 DevMode偵聽的地址和端口。 加載*.nocache.js文件時,它將檢測gwt.codesvr並加載devmode.html而不是*.cache.html 該代碼將加載您在瀏覽器中安裝的GWT Dev插件(或告訴您安裝它),並指示它在gwt.codesvr查詢字符串參數中指定的地址和端口處連接到DevMode。

這樣,您的瀏覽器便會與DevMode對話,后者會加載Java代碼並在JVM中編譯並運行它。 如Suresh所指出,該對話框的工作方式已在GWT Wiki中進行了描述。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM