0

我正在尝试将 GWT 应用程序的一部分提取到许多可以从 php 调用的单独对话框中。

现有状态:我们有一个 GWT 应用程序,它作为 WAR 部署到 JBoss。该应用程序有一个带有单一入口点的模块。主 JSP 设置环境,然后有一些使用 document.write() 加载 .nocache.js 的 JS;入口点的 onModuleLoad() 创建一个面板来填充浏览器并使用 RootPanel.get("root").add(); 将其添加到根目录;当某些事件发生时(例如,用户按下按钮),我们通过实例化一个子类并调用 center() 或 setVisible() 来弹出一个 DialogBox

期望状态:我们想要一个具有多个页面的 php 应用程序,以便能够调用各种 DialogBox 子类。

我认为php端应该使用使用document.write()的JS函数调用;至于 GWT 方面,我看到的选项是:

  1. 一个具有多个入口点的模块。
  2. 多个模块。

有没有人对这里的最佳实践有任何经验或理解?

4

1 回答 1

1

如果我理解正确,您需要从 Javascript 调用 GWT 方法。您可以使用 JSNI。但我认为您应该在 GWT 端尝试 gwt-exporter。概述教程。为您的 GWT 模块创建 JS_API 是一个简单的 GWT 模块。

不假装是最佳实践,只是简单的例子。

在服务器端,您在每个页面上都包含一个带有对话框的现有 GWT 模块。您需要修改此 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();
        }
    }
于 2011-06-22T12:37:22.130 回答