Как извлечь части приложения GWT в библиотеку отдельных диалогов - PullRequest
0 голосов
/ 22 июня 2011

Я пытаюсь извлечь части приложения GWT во множество отдельных диалогов, которые можно вызвать из php.

Существующее состояние : У нас есть приложение GWT, которое развернуто в JBoss как WAR. Приложение имеет единый модуль с точкой входа. Основной JSP устанавливает среду, а затем имеет несколько JS, которые загружают .nocache.js с помощью document.write (); OnModuleLoad () точки входа создает панель для заполнения браузера и добавляет ее в корень с помощью RootPanel.get ("root"). Add (); Когда происходит какое-то событие (например, пользователь нажимает кнопку), мы открываем DialogBox, устанавливая подкласс и вызывая center () или setVisible ()

Желаемое состояние : Мы хотим, чтобы приложение php с несколькими страницами могло вызывать различные подклассы DialogBox.

Я думаю, что сторона php должна использовать вызовы функций JS, которые используют document.write (); Что касается стороны GWT, варианты, которые я вижу:

  1. Один модуль с несколькими точками входа.
  2. Несколько модулей.

Есть ли у кого-нибудь опыт или понимание того, что было бы наилучшей практикой здесь?

1 Ответ

1 голос
/ 22 июня 2011

Если я правильно понял, вам нужно вызывать методы GWT из Javascript.Вы можете использовать JSNI.Но я думаю, что вы должны попробовать gwt-exporter на стороне GWT. Обзор . Учебник .Это простой модуль GWT для создания JS_API для ваших модулей GWT.

Не выдавая себя за лучшие практики, просто быстрый пример.

На стороне сервера вы добавляете существующий модуль GWT с DialogBoxes на каждой странице.Вам нужно изменить этот модуль GWT или создать новый.

public class GwtModule implements EntryPoint {
@Override
public void onModuleLoad() {

    // exportable class
    DialogBoxManager dbm = new DialogBoxManager();

    // export all Exportable classes of module
    ExporterUtil.exportAll();

    // needed cause JS_API will be available only after the GWT is loaded
    onLoad();
}

// call when GWT module loaded
private native void onLoad() /*-{
    $wnd.loaded();
}-*/;

DialogBoxManager выглядит следующим образом

@Export
@ExportPackage("pkg")
public class DialogBoxManager implements ClickHandler, Exportable {

    private DialogBox db;

    public DialogBoxManager() {

        this.db = new DialogBox();
    }

    @Export("showDB")
    public void showDialog() {

        db.setVisible(true);
        db.center();
        db.show();
    }

    @Override
    public void onClick(ClickEvent event) {

        showDialog();
    }

}

Строковые значения в @Export ("show"), @ExportPackage ("pkg ") и т. д. аннотации будут использоваться в наших вызовах JS_API для аннотированных методов GWT (вы также можете экспортировать поля).Вы можете использовать только @Export (как я сделал для DialogBoxManager).

Когда модуль GWT загружен в вашу библиотеку JS, вы можете реализовать инициализацию члена JS_API или что вам нужно

var dbManager = null;
...


 function loaded() {
        dbManager = new pkg.DialogBoxManager();
    }

, а затем просто вызвать JS_API следующим образом:

function showDB() {
        if (dbManager != null) {
            dbManager.showDB();
        }
    }
...