从 JavaScript 调用 GWT Java 函数

2024-02-02

我是 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)我的代码中有两个整数变量。 我还在入口点函数中调用了 EnendingClass.exportMyFunction() 。 我不断遇到各种异常(没有此类异常)。有人可以纠正我吗?

Regards


让我详细解释一下如何将 GWT 内容导出到 JS 世界。您有多种选择可以做到这一点,但我将重点介绍三种方法。

[EDITED]

0- Js互操作:GWT 维护者正在开发一项新功能,可以轻松地将 java 方法导出到 javascript,并包装 javascript 对象。该功能在 2.7.0 中是非常实验性的,缺少一些功能,但在 2.8.0 中几乎可以正常使用。请查看设计文件 https://docs.google.com/document/d/1tir74SB-ZWrs-gQ8w-lOEV3oMY6u6lF2MmNivDEihZ4/edit, 和别的在邮件列表中。

[END]

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将始终返回双精度值,并且您必须在 java 中进行转换。

2- gwt-出口商对于导出大型项目,或者当您需要处理复杂的对象和类时,我宁愿使用gwt-出口商 http://code.google.com/p/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),带有 var 参数myfunc(long...args),它支持方法重载等等。

3- gwtquery最后如果你愿意的话gwtquery https://code.google.com/p/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,您可以使用 gwtJsArrayMixed类总是返回一个双精度数,或者你可以使用JsCache它允许将数字转换为java中的任何其他数字类型((JsCache)ary.get(1, Integer.class)

作为总结,我宁愿使用gwt-出口商作为第一个选项,因为它专门处理这个问题。作为第二个选择,我会使用gquery这是对 gwt 的重要补充。最后,我会避免使用手写jsni如果可能的话,Javascript 通常是问题和错误的根源(认为 gwt 的主要目标不是处理 js)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 JavaScript 调用 GWT Java 函数 的相关文章

  • 使用 SelectionModel 或 ListDataProvider 选择 CellList 中的元素

    我使用 CellList 列出数据 使用 ListDataProvider 管理数据 使用 SelectionModel 从 CellList 中选择元素并相应地生成事件 现在 当我使用 cellList getList set index
  • 如何在引导后注入会话/用户对象?

    有一些示例将不同类型的对象注入到演示者中 但我找不到如何完成此操作的解释 In the 引导程序代码 http dev arcbees com gwtp get started Bootstrap Code html例如他们正在注入ASec
  • 如何在 GWT 中实现 JQueryUI 滑块

    我最近需要在 GWT 中实现一个滑块来捕获用户在任务上取得的进度百分比 我对 GWT 孵化器中的滑块并不满意 并且不太热衷于使用 spiffy UI 或 SmartGWT 等外部库 我可以使用哪些替代方案在 GWT 中实现有效的滑块 而不需
  • GWT 同步调用

    我在 GWT 中有一个方法 它使用请求的 fire 方法从数据库检索数据 因为你们都知道它是异步的 我从 JS 调用这个方法 所以我需要同步是否可能 private static String retriveLocation String
  • GWT-出口商。工作示例

    我有一个 Java 库 我需要将其转换为 JS 我找到了解决方案GWT 创建实用的 javascript 库 https stackoverflow com questions 3125556 gwt to create utility j
  • GWT获取应用程序的路径

    我有一个 GWT 应用程序 当我在运行应用程序后部署本地主页时 其主页为 localhost 8888 myapp html 但当我们将其部署到服务器时 在应用程序运行后其主页为 107 20 239 198 8080 myapp myap
  • 从 gwt 中的代码触发点击事件

    我在 gwt 中创建了一个自定义小部件 它扩展了复合材料 我正在其中使用焦点面板 对于 FocusPanel 我添加了 ClickHandler 然后我添加了键盘监听器 现在按 Enter 键 它应该触发单击事件 任何人都可以提供帮助吗 我
  • 带下拉箭头的 GWT 文本框

    我想在文本框中有一个下拉箭头 在我的例子中实际上是 SuggestBox GMail 执行此操作是为了实现高级搜索功能 打开高级搜索对话框 要使该箭头显示在 TextBox 的右侧并可单击 正确的 GWT 布局是什么 看看 GMail 我发
  • Servlet 过滤器在 AWS 上返回“代理错误”

    我已经设置了一个Filter为我的 GWT Web 应用程序添加爬网程序支持 这个想法是捕获所有包含 escaped fragment 并为爬虫提供快照 我已经设置了Filter使用 Guice 如下 filter through Craw
  • SMARTGWT 数据源 (GWT-RPC-DATASource) LISTGRID

    我在使用 smartGWT 绑定 ListGrid 中的数据源时遇到问题 我有 GWT RPC DataSource 并将其设置为我的数据源 grid setDataSource ds 单击一键 我的数据源发生了一些更改 我正在生成新的数据
  • 如何使用 GWT 检测操作系统?

    Basically what I want to know is to find out if my GWT application is running on a MacOS or any other operating system t
  • 测试 GWT 代码的最佳方法是什么[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • gwt 谷歌应用引擎 HTTP 错误 404

    我在 Eclipse 中使用 google 应用程序引擎创建了一个新的 gwt 项目 但是当我运行该项目时 在浏览器中我收到以下消息 HTTP 错误 404 访问 Test html 时出现问题 原因 NOT FOUND 由码头提供动力 现
  • GWT 和 Guava 的问题

    我很难让 GWT 与 Guava 一起工作 我添加了guava r09 gwt jar到我的类路径 并且
  • Jackson:无法反序列化 START_OBJECT 令牌中的 Number 实例

    我的 GWT 服务返回LinkedList
  • 使用 GWT CellTableBuilder 构建树表

    Is it possible to build a tree table like this http www sencha com examples ExamplePlace basictreegrid with the new Cell
  • 从Python手动生成x-gwt-rpc

    我想从 Python 脚本访问 GWT 服务 因此我想手动生成 x gwt rpc 请求 似乎找不到有关 GWT RPC 调用格式的任何信息 因为每个人都是从 Java 执行此操作 因此调用是由框架生成的 在哪里可以找到有关此格式的详细文档
  • GWT/JAVA 未捕获的异常转义

    我的代码有问题 但似乎无法修复它 我想在提交按钮时将一些客户数据添加到 java GWT 中的数组列表中 我从中添加数据的表单 ok addClickHandler new ClickHandler public void onClick
  • GWT 身份验证和用户信息访问

    只是想知道我的以下身份验证方法是否正确 有没有什么陷阱或者遗漏的地方 非常欢迎建议和讨论 1 gt 用户提供用户名和密码 并通过RPC发送到服务器 与数据库中存储的哈希值进行比较 2 gt 假设用户名和密码准确 会话中会保存一个Auth T
  • gwt 中的垂直居中

    如何使用垂直面板在 gwt 中垂直居中 或者请告诉我有什么方法可以进行垂直居中 如果你想直接使用VerticalPanel从代码中 您需要使用setVerticalAlignment HasVerticalAlignment ALIGN M

随机推荐