Как связать два модуля в GWT

Я создал два модуля с именем module1 и module2 в приложении gwt. Я хочу передать сообщение от модуля 1 к модулю 2 и от модуля 2 к модулю 1 одновременно через несколько секунд. Я пишу следующий код, но он выдает ошибку, не позволяющую найти module1.gwt.xml в пути к классам.

        public void onModuleLoad() {
                mainBus.fireEvent(new PingEvent("-----Simulation Started-----"));
        }

        module1

        public void onModuleLoad() 
            {
                GWTEventBus.mainBus.addHandler(PingEvent.TYPE, new PingEventHandler(){
                    public void onEvent(PingEvent event) {
                        System.out.print("Inside Ping --> ");
                        new Timer(){
                            public void run() {
                                GWTEventBus.mainBus.fireEvent(new PongEvent("Pong fired..."));
                            }
                        }.schedule(1000);
                    }
                });


            }
        module2
        public void onModuleLoad() 
            {
                //final SimpleEventBus mainBus = new SimpleEventBus();
                GWTEventBus.mainBus.addHandler(PongEvent.TYPE, new PongEventHandler(){
                    public void onEvent(PongEvent event) {
                        System.out.print("Inside Pong1 --> ");
                        new Timer(){
                            public void run() {
                                GWTEventBus.mainBus.fireEvent(new PingEvent("Ping fired..."));
                            }
                        }.schedule(1000);
                    }
                });


            }

    plz help me.

person Malav Soni    schedule 24.06.2013    source источник


Ответы (2)


Если вы пытаетесь включить два отдельных модуля (файлы *.nocache.js) на одну и ту же веб-страницу, вы не сможете передавать сообщения, если не используете JS.

Используйте JSNI для экспорта некоторого метода из модуля1, чтобы он был доступен в javascript, а затем вызовите этот метод из модуля2, используя также JSNI.

package my.package.module1;
public class MyClass1 implements EntryPoint {
  public void onModuleLoad() {
    exportMyJavaMethod();
  }
  public static String myJavaMethod(String message) {
    // Do whatever with the message received (create an event, etc.)
    return "Hello " + message;
  }
  private native static exportMyJavaMethod() /*-{
    $wnd.myJavaMethod = @my.package.module1.MyClass1::myJavaMethod;
  }-*/;
}


package my.package.module2;
public class MyClass2 implements EntryPoint {
  public void onModuleLoad() {
    String ret = callMyJavaMethod("foo");
  }
  private native static callMyJavaMethod(String s) /*-{
    return $wnd.myJavaMethod(s);
  }-*/;
}

Обратите внимание, что при использовании JSNI вы должны передавать сообщения на основе примитивных типов (см. документацию). )

Кстати: я бы предпочел использовать gwtexporter для экспорта методов и классов, которые я хочу использовать в JS, и gwtquery для вызова методов JS вместо использования JSNI.

person Manolo Carrasco Moñino    schedule 24.06.2013

Ваше приложение может иметь только одну точку входа, но ваш основной модуль может наследовать несколько других приложений gwt. Я бы предложил изучить наследование модулей. Вы можете наследовать модуль в файле .gwt.xml, и этот модуль будет загружен, а его метод onModuleLoad будет вызываться автоматически.

https://developers.google.com/web-toolkit/doc/latest/DevGuideOrganizingProjects#DevGuideModules

person aglassman    schedule 24.06.2013
comment
Your app can only have one entry point НЕ совсем верно, у вас может быть несколько точек входа в приложении. - person Manolo Carrasco Moñino; 25.06.2013
comment
Я исправлен, после повторного просмотра документов действительно можно использовать несколько точек входа. - person aglassman; 25.06.2013