【转】JSNI详解——被桐星豆博客编辑过
在使用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 代码
public native void method()/*-{
//此处写 javascript 代码
$wnd.alert('run in 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的方法
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已经会自动提示了,他会帮你自动补全方法签名,记不住也关系不大
原文出处:来自网络

转载请注明:文章转载自:桐星豆 [https://txdou.com]
本文标题:【转】JSNI详解——被桐星豆博客编辑过
本文地址:http://txdou.com/article46


- 注意:“桐星豆”只会以“回复”的身份出现,不会以“咨询”的身份出现在留言或评论中,凡是以“咨询”的身份出现的留言或评论均为他人盗用!
- 本站用以回复网友评论的唯一名称是“桐星豆”,除此外均无效,网友不得用此名进行相应文章的评论或回复!
- 用户言论只代表其个人观点,不代表桐星豆的观点或立场!
- 非诚勿扰,请友好如实的评论,杜绝谩骂、人格攻击等一切伤人言论,请严格遵循中华人民共和国法律法规!
- 桐星豆拥有最终解释权,如有网友违规,本站将有权删除或屏蔽违规评论,情节严重者账户加入黑名单、永久封IP并报司法部门严惩!
- 您一旦参与评论本站则默认为您已经同意以上条款,否则“非诚勿扰”,谢谢合作!