`
shuaigg.babysky
  • 浏览: 567542 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

JSNI GWT中的东东

阅读更多

二、JavaScript Native Interface
JavaScript本地接口JSNI。
1)声明一个本地方法
在JSNI中声明一个本地方法时,使用Java的标准native关键字,就像在JNI(Java Native Interface)中一样。在JNI中,本地C代码是一个单独的文件,独立编译且在运行时动态加载。
在JSNI中,本地JavaScript代码用一种特殊的注释格式直接嵌入到Java源代码中。
JSNIProject/src/com/xyz/client/Alert.java
--------------------------------------
public class Alert{
  public static native void alert(String msg) /*-{
    $wnd.alert(msg);
    }-*/;
}
--------------------------------------
JSNI注释块以“/*-{”开头,以“}-*/”结束。
这个例子显示,当用JSNI访问浏览器窗口和文档对象时,必须分别用$wnd和$doc引用它们。在嵌套的框架中运行已编译的脚本时,$wnd和$doc会自动的初始化,用主机页窗口和文档来代替框架。
2)它的工作机制
在WEB模式中,GWT编译器把客户端一半的Java程序转换成JavaScript。
正常情况,当编译器看到方法声明时,其括号内部的代码必须经历解释过程。如果方法是本地方法,编译器处理更为简单。它直接复制JavaScript本地代码到已编译的结果中。
一旦JavaScript被解释后,JavaScript代码中的任何错误就只能在运行时才能发现。
3)从Java中调用JSNI
在Java中调用JSNI与调用其它Java方法没有什么不同。
JSNIProject/src/com/xyz/client/LSNIExample.java
--------------------------------------
button1.addClickListener(new ClickListener(){
  public void onClick(Widget sender){
    Alert.alert("Clicked!");
  }
});
--------------------------------------
4)从JSNI中调用Java
假定你传递一个对象到JSNI方法,你需要访问一个字段或在对象中调用一个方法。你还需知道GWT编译器怎样弄糟Java域和方法名,因此你可以在JavaScript代码中访问它们。
(1)访问Java域(field)
访问Java域的语法如下:
--------------------------------------
obj.@class::field
--------------------------------------
obj 是引用对象的实例
class 是具有full-qualified的类
field 访问域的域名
(2)调用Java方法
调用Java方法的语法和访问Java域的语法相似,语法如下:
--------------------------------------
obj.@class::method(sig)(args)
--------------------------------------
method 调用方法的方法名
sig 内部的Java方法签名
args 方法传递的参数列表
(3)方法签名(Method Signature)
JSNI方法签名确切地说和JNI方法签名一样,除了方法返回类型有所不同。
下面的表显示了这些方法签名
--------------------------------------
Type Signature        Java Type
--------------------------------------
Z                     boolean
B                     byte
C                     char
S                     short
I                     int
J                     long
F                     float
D                     double
[type                 type()
Lfully-qualified-class;      fully-qualified-class
--------------------------------------
例如:Java方法:
long f(int n, String s, int[] arr);
有如下的类型签名:
ILjava/lang/String;[I)
(4)例子
下面的代码显示了通过JSNI访问Java域和方法的例子。它说明了传递数字、字符串、布尔型和Java对象到JavaScript。它还显示了JavaScript方法怎样调用传递过来的Java对象。
--------------------------------------
Java类型           它是怎样出现在JavaScript代码中的
a Java numeric primitive    var x=42;
String             var s="my string";
boolean            var b=true;
JavaScriptObject   从JavaScript代码中初始化,典型的是作为其它JSNI方法的返回值
Java Object        通过特殊语法得到的不透明的值
--------------------------------------
JSNIProject/src/com/xyz/client/j2js.java
----------------------------------------------------------
public class J2JS{
  /** Pass a Java numeric primitive */
  public static void testJ2JSNumeric(){
    int x=42;
    jsNumeric(x);
  }
  privae static native void jsNumeric(int x)/*-{
    $wnd.alert("x is "+x);
  }-*/;
  /** Pass a Java String */
  public static void testJ2JSString(){
    String s="my string";
    jsString(s);
  }
  private static native void jsString(String s) /*-{
    $wnd.alert("s is "+s);
  }-*/;
  /** Pass a boolean */
  public static void testJ2JSBoolean(){
    boolean b=true;
    jsBoolean(b);
  }
  private static native void jsBoolean(boolean b) /*-{
    $wnd.alert("b is "+b);
  }-*/;
  /** Pass an arbitrary Java Object */
  public static void testJ2JSObject(){
    MyJavaObject obj=new MyJavaObject();
    jsObject(obj);
  }
  private static native void jsObject(MyJavaObject obj) /*-{
    $wnd.alert("Calling getText():"+obj.@MyJavaObject::getTextAt(I)(3));
  }-*/;
}
----------------------------------------------------------
如果你看GWT的源码时,可以看到许多安装JSNI定义的东东。大多数GWT编程者不需要定义JSNI方法,但还是该留意它,或许用得上

分享到:
评论

相关推荐

    GWT-JSNI.pdf

    - **JSNI (JavaScript Native Interface)**: GWT 提供的一种特殊机制,允许开发者在 GWT 应用程序中直接调用 JavaScript 代码或从 JavaScript 调用 Java 代码。 #### 二、调用 JavaScript 从 Java - **方法格式**:...

    GWT揭秘(书签整理版)

    5. 在GWT中使用XML 6. GWT控件详解 7. 使用GWT控件 8. GWT-RPC 9. Ext GWT 10. (实战)俄罗斯方块游戏 11. (实战)费用申请审批流程 12. GWT与Flex整合 13. 图片缓存 CSS Sprite 14. 本地化 15. 其他高级功能

    gwt-jsni:用于 GWT 项目的 JSNI 实用程序

    gwt-jsni 用于 GWT 项目的 JSNI 实用程序。 用法 将依赖项添加到您的 Maven POM: < groupId>com.bytebybyte.gwt</ groupId> < artifactId>jsni < version>1.0.0 < scope>provided 和你的 .gwt.xml 文件: ...

    GWT安装和使用

    在这种情况下,GWT 支持 JavaScript Native Interface (JSNI),允许开发者直接在 Java 代码中嵌入 JavaScript 代码。这种机制为开发者提供了极大的灵活性,使其能够在需要时使用原生 JavaScript 功能。 #### 二、用...

    关于 JSNI 调用 Java 方法时的 Type Signatures 说明

    在 Java Native Interface (JNI) 和 Google Web Toolkit (GWT) 中,Type Signatures 是一种特殊的表示法,用于描述 Java 类型。这种表示法在 JSNI(Java Script Native Interface)中尤为重要,因为它可以帮助开发者...

    gwt开发问题

    然而,在实际开发过程中,GWT用户会遇到各种各样的问题,其中“如何在GWT应用中实现右键菜单”是一个常见需求。 **GWT方式实现右键菜单:** GWT提供了一种较为直接的方法来实现右键菜单功能。这种方式的优点在于...

    GWT (GOOGLE WEB TOOLKIT)介绍PPT

    - **可扩展性**:GWT提供了JSNI(Java to JavaScript Native Interface),允许开发者在必要时直接编写JavaScript代码,增强了灵活性。 **4. GWT的主要组成部分** - **Java-to-JavaScript编译器**:负责将Java代码...

    gwt技术介绍

    5. 可扩展性,GWT提供了JSNI(JavaScript Native Interface)允许开发者在Java代码中嵌入JavaScript代码,提供了强大的自定义和扩展能力。 GWT的四大组成部分包括: 1. Java-to-JavaScript编译器,负责将Java代码...

    GWT(Google Web Toolkit)

    GWT(Google Web Toolkit) 是 Google 最近推出的一个开发 Ajax 应用的框架,它支持用 Java 开发和调试 Ajax 应用,本文... 如果你觉得GWT提供的API不能满足需求,你可以利用JSNI将Javascript语句直接嵌入至Java代码中。

    GWT技术介绍

    1. **Host Mode(宿主模式)**:在开发过程中,可以直接在GWT提供的模拟浏览器中查看应用的效果,便于调试。 2. **Web Mode**:编译后的应用可以在真实的Web浏览器中运行。 #### 七、GWT应用开发流程 1. **创建项目*...

    GWT开发者手册_v2

    - **编译过程**:当 GWT 应用程序在主机模式下编译和运行时,如果编译过程中没有出现错误,则该应用程序将以相同的方式在 Web 浏览器中运行,提供了一种无缝过渡的方法。 - **语言兼容性**:GWT 支持 J2SE 1.4.2 或...

    GWT_2BEXT_2BSTRUTS2完整实例

    1. **JSNI集成**:开发者可以通过JSNI在GWT中直接引用EXT JS的JavaScript代码,创建EXT JS组件并集成到GWT应用中。 2. **交互集成**:GWT和EXT JS可以通过共享数据和事件来协同工作,例如,GWT应用可以触发EXT JS的...

    GWT in Action

    在这一部分中,作者详细介绍了GWT中的各种小部件(Widget),这些小部件是构成用户界面的基础单元。通过对不同类型的小部件的学习,读者能够掌握如何构建美观且功能丰富的用户界面。本章还会涉及到如何自定义小部件...

    网页表格组件 GWT Advanced Table

    - **GWT框架**:理解GWT的工作原理,包括模块系统、编译过程和JSNI(JavaScript Native Interface)。 - **HTML和CSS**:虽然GWT会自动处理一部分布局,但理解基本的HTML和CSS可以帮助你更好地定制表格样式。 - **...

    gwt项目开发的经验集

    如果希望自定义这个菜单的行为,可以通过GWT提供的API或JavaScript Native Interface (JSNI)来实现。 #### 实现方法 - **GWT方式**:基于GWT的事件机制实现。这种方式的优点是能够确保跨浏览器的兼容性,但是可能...

Global site tag (gtag.js) - Google Analytics