I'm a tree and wating for the spring!
|

【转】JSNI详解——被桐星豆博客编辑过

★作者:桐星豆博客   |  ★类别: 技术文章   |  ★发布时间: 2011-01-26 14:35   |  ★更新时间: 2011-01-26 14:35   |  ★浏览次数:1793   |  ★ 评论(0)

在使用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已经会自动提示了,他会帮你自动补全方法签名,记不住也关系不大

原文出处:来自网络

请尊重他人的劳动果实,转载时务必注明出处! 请尊重他人的劳动果实,转载时务必注明出处!
转载请注明:文章转载自:桐星豆博客 [http://blog.txdou.com]
本文标题:【转】JSNI详解——被桐星豆博客编辑过
本文地址:http://blog.txdou.com/article46
分享到QQ空间 分享到腾讯朋友

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

您的姓名或昵称: 选填
您的E-Mail地址: ☆必填--仅站长可见
您个人网站地址: 选填 ( 如果填写,请务必加上 http:// 或 https:// 等等 )
留言内容:

验证码: 点击重新生成验证码  [ ctrl + enter ]

CopyRight © 2009-2020 by 桐星豆 All Rights Reserved. ICP证:京ICP备20021364号