gpt4 book ai didi

java - 可以从 GWT 中的 Javascript 访问 Java 对象吗?

转载 作者:太空宇宙 更新时间:2023-11-04 15:18:00 25 4
gpt4 key购买 nike

我的目标是直接从 javascript 发起 RPC 调用。我想出了一些方法来伪造回调(因为 RPC 的异步性质),但我不知道如何将自定义对象放入 JavaScript 中。

因此,我创建了一个名为 Interop 的类,并静态创建了我感兴趣的服务(必须使用静态,因为这是我所能做的,我认为它现在不相关):

public class Interop {
private static final GreetingServiceAsync service = GWT.create(GreetingService.class);
...
}

然后我创建一个函数来执行异步调用并处理响应:

public static void greetServer(final String success, final String failure) {
service.greetServer(
"Homer",
new AsyncCallback<String>() {
public void onFailure(Throwable caught) {
callback(failure, caught.toString());

}
public void onSuccess(String result) {
callback(success, result);
}
}
);
}

然后我创建一个 JSNI 函数,将此函数导出到 javascript,我从 onModuleLoad() 调用该函数:

public static native void export() /*-{
$wnd.greetServer = $entry(@package.Interop::greetServer(Ljava/lang/String;Ljava/lang/String;));
}-*/;

并创建另一个 JSNI 函数来处理回调:

public static native void callback(String func, String response) /*-{
$wnd[func](response);
}-*/;

因此,JSNI 将我最初传递给greetServer() 的成功和失败函数名称作为回调进行调用。在处理字符串或(我假设)原始类型时,这一切都非常有效。但是当我尝试使用自定义类型执行此操作时(请注意更改后的自定义类型参数):

public static native void callback(String func, Custom response) /*-{
$wnd[func](response);
}-*/;

那么最终在 javascript 中的内容就不起作用了。它似乎是一个带有级联数组的javascript对象,并且没有任何方法可用。

所以,问题是,如何从 javascript(不是 JSNI)内部访问非基本或原语的 Java 起源对象?据我所知,JavaScriptObject 需要源自 javascript,但就我而言,我的对象源自 Java。我能做什么?

我还研究了 gwt-exporter,它展示了如何从 javascript 实例化 java 内容,但没有展示如何在 javascript 中访问源自 java 的内容。

我知道这有点令人困惑,所以如果您有任何疑问,请告诉我。谢谢!

最佳答案

使用 gwt-exporter 这可能是您的代码:

// Create and export a closure used to wrap javascript callbacks
@ExportClosure
public static interface InteropCallback extends Exportable {
void exec(String message);
}

// Make your Interop class exportable and export methods in it
@ExportPackage("foo")
@Export
public static class Interop implements Exportable {
final static GreetingServiceAsync service = GWT.create(GreetingService.class);

public static void greeting(String message,
final InteropCallback success,
final InteropCallback error) {
service.greetServer(message, new AsyncCallback<String>() {
public void onFailure(Throwable caught) {
error.exec(caught.getMessage());
}
public void onSuccess(String result) {
success.exec(result);
}
});
}
}

// In your onModuleLoad you have to make gwt-exporter export your stuff
@Override public void onModuleLoad() {
ExporterUtil.exportAll();
...
}

最后从手写的 javascript 调用你的 java 方法

window.foo.Interop.greeting("Hello", 
function(s){console.log(s)},
function(s){console.log(s)}
);

关于java - 可以从 GWT 中的 Javascript 访问 Java 对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20709611/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com