在 GWT 中,我们如何在 javascript 和 java 之间共享对象?

Posted

技术标签:

【中文标题】在 GWT 中,我们如何在 javascript 和 java 之间共享对象?【英文标题】:In GWT how can we share objects between javascript and java? 【发布时间】:2013-07-17 10:28:17 【问题描述】:

我的班级中有一个 pojo,其中包含一些在 java 中操作 Maps 和 Arrays 的方法。此对象在 RPC 调用中用于携带我的配置。我有一种机制,在进行任何 RPC 调用之前,我会执行一个 javascript 函数。现在我真正想要的是将我的配置对象传递给这个 javascript 函数,这个 javascript 函数可以操纵这个配置对象,最后这个被操纵的对象将在我的 RPC 调用中传递。

那么我怎样才能将我的 java 对象传递给 javascript 并允许对其进行操作呢?

【问题讨论】:

此链接可能对您有所帮助gwtproject.org/doc/latest/DevGuideCodingBasicsJSNI.html#sharing 这个 JavaScript 函数是您的 GWT 项目中的 JSNI 方法还是“第三方”js 文件? 【参考方案1】:

首先,您不能直接从 javascript 操作 Java 对象。但是您可以做的是将一组静态方法导出到 javascript 并使用它们来操作您的对象。这是通过这种方式完成的:

public void onModuleLoad() 
    exportHelloMethod(this);

public String exportedMethod(String name) 
    // Manipulate your java classes here
    // return something to JS

// Create a reference in the browser to the static java method
private native void exportHelloMethod(HelloClass instance) /*-
  $wnd.hello = instance@[...]HelloClass::exportedMethod(Ljava/lang/String;);
-*/;

幸运的是,有一个库允许以更简单的方式导出 java 方法和类。它是gwt-exporter,您只需在您的类中实现 Exportable 并使用一组注释,以便导出器生成器完成所有工作。

@ExportPackage("jsc")
@Export
public class MyClass implements Exportable 
  public void show(String s)
  


public void onModuleLoad() 
  ExporterUtil.exportAll();

然后在javascript中你可以实例化和操作类:

 var myclass = new jsc.MyClass();
 myclass.show('whatever');

【讨论】:

导出的对象是否必须源自 javascript?因为如果不是,那么这不是他要问的(我也有类似的问题)。 导出的方法/类在 java 中的编码方式与您在 gwt 中的处理方式相同,但将其导出为 javascript,意味着您可以从 javascript 实例化 java 类或从 javascript 调用 java 方法。这是你要问的吗? 我的理解是发帖人想用java代码创建对象,然后用javascript操作它们。您的示例没有描述这一点,也没有描述“您可以从 javascript 实例化(原文如此)java 类”,这恰恰相反。我很感兴趣,因为我还想在 java 中创建对象并在 javascript 中操作它们,但不知道该怎么做。我发布了这个问题,但没有得到任何反馈,你能帮忙吗? ***.com/questions/20709611/… 您需要一些导出的类,这些类的方法返回在 java 中创建的可导出 java 对象。

以上是关于在 GWT 中,我们如何在 javascript 和 java 之间共享对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 GWT 离线应用程序中包含外部 Javascript

如何将 Swagger UI 添加到现有的 GXT 或 GWT 项目并使用当前的 GWT-RPC REST 请求?

我们如何在 GWT 中从一页导航到另一页

具有SSL安全性的GWT

如何检查一个事件是否可以从GWT代码中取消?

如何在Intellij IDEA 2018.2中调试GWT 2.8.1作为java代码而不是java脚本