使用GWT JSNI与js文件集成

时间:2017-01-04 17:19:55

标签: javascript java gwt smartgwt smartgwt-pro

我目前正在开发一个GWT项目,它现在需要由外部JavaScript文件使用。我现在正在创建一个测试原型,以确保双方都正常工作。

当我运行并编译时,我看到控制台从正在调用的事件中登录浏览器。但是,没有调用GWT java方法。

在尝试了很多场景之后,我还注意到如果从$entry中删除exportStaticMethods()包装器,则会发生相反的情况。我看到在我的java代码中调用了System.out,但是没有调用浏览器中JavaScript的控制台日志。

我正在试图找出造成这种行为的原因,如果我忽略了一个小小的缺失部分。

我已经查看了calling a Java method from js的GWT JSNI文档,并尝试在StackOverflow上找到其他相关问题的解决方案。

GWT和Java方

我已经进入onModuleLoad()类的EntryPoint方法并添加了一个名为exportStaticMethods()的静态方法。我还创建了下面列出的PokePingClass.java文件。

EntryPointClass.java

public class EntryPointClass implements EntryPoint {

    @Override public void onModuleLoad() {
        exportStaticMethods();
        // load application here.
    }

    public static native void exportStaticMethods() /*-{

        $wnd.pingApp = $entry((function) {
                           @com.application.PokePingClass::pingApp()();
                       });

        $wnd.pokeApp = $entry((function) {
                           @com.application.PokePingClass::pokeApp()();
                       });
    }-*/
}

PokePingClass.java

public class PokePingClass {

    public static void pokeApp() {
        System.out.println("pokeApp() called");
    }

    public static void pingApp() {
        System.out.println("pingApp() called");
    }
}

HTML和js

在项目的.html文件中,我添加了一个名为“pokePing”的隐藏div元素,以及pokeping.js文件。

<html>
    <head>
        .
        . <!-- other stuff -->
        .
        <script type='text/javascript' src='pokeping.js</script> 
    </head>

    <body>
        .
        . <!-- other stuff -->
        .
        <div id="pokePing" style="visibility: hidden;"></div>
    </body>
</html>

pokeping.js

$(document).ready(function) {

    var $pp = $('#pokePing');

    var pokeApp = function() {
        console.log("app handling poke event");
        window.parent.pokeApp();
    }

    var pingApp = function() {
        console.log("app handling ping event");
        window.parent.pingApp();
    }

    $pp.trigger('pokeApp');
    $pp.trigger('pingApp');
}

2 个答案:

答案 0 :(得分:3)

public static native void exportStaticMethods() /*-{

    $wnd.pingApp = $entry(function) {
                       @com.application.PokePingClass.pingApp()();
                   }

    $wnd.pokeApp = $entry(function) {
                       @com.application.PokePingClass.pokeApp()();
                   }
}-*/

这不是有效的JS,并且作为JSNI没有意义。试试这个:

    $wnd.pingApp = $entry(function() {
                       @com.application.PokePingClass::pingApp()();
                   });

    $wnd.pokeApp = $entry(function() {
                       @com.application.PokePingClass::pokeApp()();
                   });

编辑,因为我仍然错了,忘了成员的::运算符。

答案 1 :(得分:0)

我找到了类似的帖子,但关键是实际返回JSNI函数中的方法调用。在那之后,一切运作良好。

public static native void exportStaticMethods() /*-{

    $wnd.pingApp = $entry((function) {
                       return @com.application.PokePingClass::pingApp()();
                   });

    $wnd.pokeApp = $entry((function) {
                       return @com.application.PokePingClass::pokeApp()();
                   });
}-*/