在使用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的写法如下:
方法体以/*-{开头 以}-*/结尾,最后要加分号。
在这个方法体里面就可以写javascript代码了,上面的例子就会执行alert语句。
在alert前面我们加了$wnd,是因为我们的js代码会加载到一个iframe里面,直接使用alert会调用iframe里面的 window对象,因此gwt给我们提供了$wnd用来指向主页面的window对象。
跟这个类似的还有document对象,在jsni中我们用$doc来指向主页面的document对象。
在JAVA代码中调用这个method()方法,就可以与javascript互动了
下面如何在javascript中调用JAVA的方法
在调用过程中的方法签名比较难理解,他有以下对应关系
全路径类名举例
目前在写JSNI时GWT已经会自动提示了,他会帮你自动补全方法签名,记不住也关系不大
其实不需要,因为GWT给我们提供了嵌入javascript的技术,叫做JSNI(JavaScript Native Interface,JavaScript本地接口)。
JSNI可以实现以下功能
1.从JavaScript中直接执行Java方法
2.从JavaScript中调用Java代码,或从Java代码中调用JavaScript代码
3.在Java和Javascript之间抛异常
4。在JavaScript中读写Java域属性
JSNI的写法如下:
- public native void method()/*-{
- //此处写 javascript 代码
- $wnd.alert('run in JSNI');
- }-*/;
方法体以/*-{开头 以}-*/结尾,最后要加分号。
在这个方法体里面就可以写javascript代码了,上面的例子就会执行alert语句。
在alert前面我们加了$wnd,是因为我们的js代码会加载到一个iframe里面,直接使用alert会调用iframe里面的 window对象,因此gwt给我们提供了$wnd用来指向主页面的window对象。
跟这个类似的还有document对象,在jsni中我们用$doc来指向主页面的document对象。
在JAVA代码中调用这个method()方法,就可以与javascript互动了
下面如何在javascript中调用JAVA的方法
- package com.single.test.client;
- import com.google.gwt.core.client.EntryPoint;
- public class Test implements EntryPoint {
- private String name="field";
- public void onModuleLoad() {
- invokeJavaMethod();
- }
- /**
- * 静态JAVA方法
- * @param s
- */
- public static void staticLog(String s){
- System.out.println("run in static method and input="+s);
- }
- /**
- * 非静态JAVA方法
- * @param s
- */
- public void log(String s){
- System.out.println("run in non-static method and input="+s);
- }
- /**
- * javascript 调用JAVA方法示例
- */
- public native void invokeJavaMethod()/*-{
- // 调用JAVA静态方法
- // 规则: @全路径类名::静态方法名(方法签名)(传入参数)
- @com.single.test.client.Test::staticLog(Ljava/lang/String;)('javascript string');
- //调用JAVA非静态方法
- //规则:实例对象.@全路径类名::方法名(方法签名)(传入参数)
- this.@com.single.test.client.Test::log(Ljava/lang/String;)('javascript string');
- //调用JAVA的非静态属性
- //规则:实例对象.@全路径类名::属性名
- var name=this.@com.single.test.client.Test::name;
- $wnd.alert(name);
- }-*/;
- }
在调用过程中的方法签名比较难理解,他有以下对应关系
类型签名 | 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已经会自动提示了,他会帮你自动补全方法签名,记不住也关系不大