2013-03-24 24 views
0

我建立一個大的應用程序,我想它在幾個模塊,比如核心模塊進行初始化,用戶管理等之間的分裂(即EventBus)......,客戶模塊,生產模塊等...GWT:如何分享一個Java對象:兩個模塊

我想分割成多個GWT模塊(不使用GWT分割技術),並共享一個EventBus廣播一些事件,如LoginEvent,LogoutEvent。我不想使用代碼分割技術,因爲我想縮短編譯時間並僅重新編譯我修改的模塊。 這也允許通過在HTML主機頁面中評論腳本標籤來啓用或禁用模塊。

我已經寫使用JSNI下面的代碼:

CoreModule’s EntryPoint: 

private static SimpleEventBus eventBus = null; 

public void onModuleLoad() { 
    export(); 
    getEventBus().addHandler(MyEvent.TYPE, new MyEventHandler() { 

     @Override 
     public void onEvent(MyEvent myEvent) { 
      Window.alert(myEvent.getMessage()); 
     } 
    }); 
} 

public static SimpleEventBus getEventBus() { 
    if (eventBus == null) 
     eventBus = new SimpleEventBus(); 
    return eventBus; 
} 

public static native void export() /*-{ 
    $wnd.getEventBus = $entry(@testExporter.client.TestExporter::getEventBus()); 
}-*/; 

CustomerModule’s EntryPoint: 

public void onModuleLoad() { 
    Button button = new Button("Click me"); 
    button.addClickHandler(new ClickHandler() { 

     @Override 
     public void onClick(ClickEvent event) { 
      getEventBus().fireEvent(new MyEvent("Button clicked !")); 
     } 
    }); 
    RootPanel.get().add(button); 
} 

public static native SimpleEventBus getEventBus() /*-{ 
    // Create a useless eventBus because the GWT compiler make a call to a null instance 
    var eventBus = @com.google.gwt.event.shared.SimpleEventBus::new()(); 
    eventBus = $wnd.getEventBus(); 
    return eventBus; 
}-*/; 

但在瀏覽器中執行時,我已經在Firebug以下異常:

uncaugth exception [object Object] 

我也複製了MyEvent和實現/接口客戶事件的MyEventHandler類。

P.S:我也知道,包括評論中的其它模塊的引用,以避免編譯它的技術。

回答

1

你不能在不同的GWT編譯的模塊之間共享代碼,除非您選擇將代碼的某些部分通過JSNI並通過JSNI調用這些導出的方法,就像你在你的查詢嘗試。

但要注意的是:第一,共享類是不兼容的,因爲每個編譯將重命名類/以不同的方式方法,以及第二,每一個編譯將消除不同的死代碼段。

所以你的情況SimpleEventBuswindow.getEventBus導出方法返回的其他模塊是不知道,但其他模塊使用SimpleEventBus以及

最簡單的方式做你想做的,就是用GWT-exporter。首先正確選擇你想要在每個模塊中導出的js-api,你想如何命名它,並且實現方便的Exportable和註釋方法。其次考慮你將用於溝通的對象,因爲其中一些對象可能不兼容。我會使用原始類型,JavaScript對象和GWT出口商支持的功能

我認爲,對於共享類,如果您在同一個命名空間中註釋它們並導出相同的方法,希望你可以在所有模塊中使用,但我不確定。

所以經由JSNI或GWT-出口導出一個js API和在它們之間傳輸純原語或JS對象。

1

一個簡單的答案是不使用多個入口點。

==========================================

如果你要實現的目標是打破你的代碼爲可管理的單位,而是想用所有的人都在同一頁面中,您可以:

  • 創建「Application.gwt。XML」模塊的入口點(相當於你的初始化模塊,如果我理解正確的話)
  • 打造‘UserManagement.gwt.xml’模塊沒有切入點類
  • 創建其他XXX模塊沒有切入點

創建沒有入口點的模塊只是刪除

<entry-point class='xxx'/> 
從gwt.xml文件

除了「應用程序」一個

然後,您需要使用

<inherits name="com.yourpackage.Module1Name" /> 
<inherits name="com.yourpackage.Module2Name" /> 

然後,您需要一起編譯所有的人都在一個GWT構建模塊「com.yourpackage.Application」中包含這些模塊到「應用程序」模塊。

當你這樣做的時候,確保所有模塊的編譯好的* .class和源.java文件都可以在類路徑中使用。

你的「應用程序」入口點只需要初始化,並從其他模塊

0

您可以通過WebMessage協議使用框架和安裝通信模塊之間使用的對象。它只有在一個頁面中的模塊和分離的戰爭中的模塊時纔有幫助。