gpt4 book ai didi

gwt - 从 JavaScript 调用 GWT Java 函数

转载 作者:行者123 更新时间:2023-12-03 14:40:09 25 4
gpt4 key购买 nike

我是 GWT 和 JavaScript 的新手。
我曾尝试遵循类似的此类问题,但一直失败。

我有一个 GWT 应用程序,我需要从 Javascript 调用一个 Java 函数(特别是在 href 标记的 onclick 上。)以下是我所做的。

public class JSNITest {

public static void handleAnchorClick(int a , int b) {
Window.alert("Current row and Column is " + a + " " + b);
}

public static native void exportMyFunction()/*-{
$wnd.handleAnchorClick = function(param1,param2){
@company.package.class.JSNITest::handleAnchorClick(*)(param1,param2);
}-*/;

}

在 HTML 中,
<a href="javascript:handleAnchorClick(a1,a2);">link</a> 
(a1 , a2)是我的代码中的两个整数变量。
我还在入口点函数中调用了 EnclosureClass.exportMyFunction()。
我不断遇到各种异常(没有此类异常)。有人可以纠正我吗?

问候

最佳答案

让我再解释一下关于将 GWT 内容导出到 JS 世界的内容。您有多种选择,但我将重点介绍三种方法。

[编辑]

0- JsInterop :GWT 维护人员正在开发一项新功能,以便轻松地将 java 方法导出到 javascript,并包装 javascript 对象。该功能在 2.7.0 中是非常实验性的,缺少一些功能,但在 2.8.0 中几乎可以使用。请查看Design Document , 和其他 discussions在邮件列表中。

[结尾]

1- JSNI : 第一个是编写自己的jsni,在这种情况下你必须意识到你可能犯的错误。基本上这些错误是因为你必须知道如何处理类型。在您的情况下,如果您想获得一个 javascript 数组(就像您在下面的评论中询问的那样),解决方案可能是:

public static native void exportMyFunction()/*-{
$wnd.handleAnchorClick = @company.package.class.JSNITest::handleAnchorClick(*);
}-*/;

public static void handleAnchorClick(JsArrayMixed args) {
Window.alert("Current row and Column is " +
args.getNumber(0) + " " + args.getNumber(1));
}

public void onModuleLoad() {
exportMyFunction();
}

//javascript code
window.handleAnchorClick([1,2])

注意 JSNI 只允许你通过 primitive类型(long 除外)和 JavaScriptObject对象。因此,当传递一个 javascript 数组时,您必须使用 JavaScriptObject 接收它。就像在例子中一样。在这种情况下,由于 javascript 只使用数字类型, args.getNumber将始终返回一个 double 值,并且您必须在 java 中进行转换。

2- gwt-导出商对于导出大型项目,或者当您需要处理复杂的对象和类时,我宁愿使用 gwt-exporter

static class MyClass implements Exportable {
@Export("$wnd.handleAnchorClick")
public static void handleAnchorClick(double[] args) {
Window.alert("Current row and Column is " +args[0] + " " + args[1]);
}
}

public void onModuleLoad() {
GWT.create(MyClass.class);
}

//javascript code
window.handleAnchorClick([1,2])

gwt-exporter 将处理任何类型的原始类型(即使是 long) myfunc(long[] args) , 带可变参数 myfunc(long...args) ,它支持方法重载等等。

3- gwt查询 最后,如果您更喜欢 gwtquery ,您可以使用一种技术将函数属性添加到任何 js 对象,例如 window
// The GQuery Properties object is able to wrap a java Function object
// into an js property.
Properties wnd = window.cast();
wnd.setFunction("handleAnchorClick", new Function() {
public void f() {
// Get the js arguments[] array
JsArrayMixed args = arguments(0);
// Get the first element of the arguments[] array
JsArrayMixed ary = args.getObject(0);

Window.alert("Current row and Column is " +
ary.getNumber(0) + " " + ary.getNumber(1));
}
});

//javascript code
window.handleAnchorClick([1,2])

使用 gquery,您可以使用 gwt JsArrayMixed总是将数字作为 double 返回的类,或者您可以使用 JsCache它允许将数字转换为 java 中的任何其他数字类型 ((JsCache)ary.get(1, Integer.class)
作为总结,我宁愿使用 gwt-导出商作为第一个选项,因为它专门处理这个问题。作为第二种选择,我会使用 查询 这是对 gwt 的重要补充。最后,我会避免使用手写 jsni 在可能的情况下,Javascript 通常是问题和错误的来源(认为 gwt 的主要目标不是处理 js)。

关于gwt - 从 JavaScript 调用 GWT Java 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16080099/

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