GWT JSNI(JavaScript Native Interface) JavaScript本地接口

在使用GWT后,我们将用JAVA来编码,可能我们之前已经写了一些javascript类库,现在转用GWT是不是意味着这些都无法使用,需要重新实现一遍呢
    其实不需要,因为GWT给我们提供了嵌入javascript的技术,叫做JSNI(JavaScript Native Interface,JavaScript本地接口)。 
    JSNI可以实现以下功能 
1.从JavaScript中直接执行Java方法 
2.从JavaScript中调用Java代码,或从Java代码中调用JavaScript代码 
3.在Java和Javascript之间抛异常 
4。在JavaScript中读写Java域属性 

JSNI的写法如下: 
Java 代码
  1. public native void method()/*-{
  2.      //此处写 javascript 代码
  3.      $wnd.alert('run in JSNI');
  4. }-*/;  

方法体以/*-{开头 以}-*/结尾,最后要加分号。 
在这个方法体里面就可以写javascript代码了,上面的例子就会执行alert语句。 
在alert前面我们加了$wnd,是因为我们的js代码会加载到一个iframe里面,直接使用alert会调用iframe里面的 window对象,因此gwt给我们提供了$wnd用来指向主页面的window对象。 
跟这个类似的还有document对象,在jsni中我们用$doc来指向主页面的document对象。 

在JAVA代码中调用这个method()方法,就可以与javascript互动了 

下面如何在javascript中调用JAVA的方法 
Java 代码
  1. package com.single.test.client;  
  2. import com.google.gwt.core.client.EntryPoint;  
  3. public class Test implements EntryPoint {  
  4.     private String name="field";  
  5.     public void onModuleLoad() {  
  6.          invokeJavaMethod();  
  7.      }  
  8.     /**
  9.       * 静态JAVA方法
  10.       * @param s
  11.       */  
  12.     public static void staticLog(String s){  
  13.          System.out.println("run in static method and input="+s);  
  14.      }  
  15.     /**
  16.       * 非静态JAVA方法
  17.       * @param s
  18.       */  
  19.     public void log(String s){  
  20.          System.out.println("run in non-static method and input="+s);  
  21.      }  
  22.     /**
  23.       * javascript 调用JAVA方法示例
  24.       */  
  25.     public native void invokeJavaMethod()/*-{
  26.          // 调用JAVA静态方法
  27.          // 规则: @全路径类名::静态方法名(方法签名)(传入参数)
  28.          @com.single.test.client.Test::staticLog(Ljava/lang/String;)('javascript string');
  29.          //调用JAVA非静态方法
  30.          //规则:实例对象.@全路径类名::方法名(方法签名)(传入参数)
  31.          this.@com.single.test.client.Test::log(Ljava/lang/String;)('javascript string');
  32.         
  33.          //调用JAVA的非静态属性
  34.          //规则:实例对象.@全路径类名::属性名
  35.          var name=this.@com.single.test.client.Test::name;
  36.          $wnd.alert(name);
  37.      }-*/;  
  38. }  

在调用过程中的方法签名比较难理解,他有以下对应关系 
类型签名 JAVA数据类型
Z boolean
B byte
C char
S short
I int
J long
F float
D double
L 全路径类名
[type type[]

全路径类名举例 
类型签名 JAVA数据类型
Ljava/lang/String; java.lang.String

目前在写JSNI时GWT已经会自动提示了,他会帮你自动补全方法签名,记不住也关系不大
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值