`
John_Kong19
  • 浏览: 272175 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JSNI

    博客分类:
  • GWT
阅读更多
一、History and Bookmarks
书签对于Ajax应用来说是一个特殊的问题,因为用户只和单个的页面进行交互,因此这儿存在许多不同的片段、状态。GWT解决了这些问题。
处理返回按钮和用户保存有用的标签的秘密是历史标识。
历史标识仅仅是一个字符串,用于保存你想保存的状态。Google没有记载历史标识的最大长度,但是推荐为在100个字符以内。
要通过编程来改变历史标识,可以调用方法:History.newItem(),History.back(),History.forward()。
如果一个用户用web anchor把一个URL作为书签,当重载那些页面时,GWT将把anchor作为一个历史标识。它会传递标识到listener,不用知道它是怎样处理的。如果你想改变状态,可使用Hyperlink类来代替。
在内部,历史是通过一个特殊的标签<iframe>来管理的。GWT脚手架脚本自动地为你加入:
HistoryProject/src/com/xyz/public/HistoryExample.html
--------------------------------------
<!-- OPTIONAL: include this if you want history support -->
<iframe id="__gwt_historyFrame" style="width:0;height:0;border:0">
</iframe>
--------------------------------------
浏览器的“返回”和“向前”按钮简单地保存你访问过的一堆URL。通过在应用程序中进行设置,GWT使它和历史标识保持一致。
下面的例子显示了怎样处理初始化标识,建立事件监听,处理事件。
HistoryProject/src/com/xyz/client/HistoryExample.java(来源 www.iocblog.net)
--------------------------------------
public class HistoryExample implements EntryPoint, HistoryListener{
  private Label lbl=new Label();
  public void onModuleLoad(){
    //Create three hyperlinks that change the application's history.
    Hyperlink link0=new Hyperlink("link to foo","foo");
    Hyperlink link1=new Hyperlink("link to bar","bar");
    Hyperlink link2=new Hyperlink("link to baz","baz");
    //If the application starts with no history token, start it
    // off in the 'baz' state.
    String initToken=History.getToken();
    if(initToken.length()==0)
      initToken="baz";
    //onHistoryChanged() is not called when the application first
    //runs. Call it now in order to reflect the initial state.
    onHistoryChanged(initToken);
    //Add widgets to the root panel.
    Panel panel=new VerticalPanel();
    panel.add(lbl);
    panel.add(link0);
    panel.add(link1);
    panel.add(link2);
    RootPanel.get().add(panel);
    //Add history listener
    History.addHistoryListener(this);
  }
  public void onHistoryChanged(String historyToken){
    lbl.setText("The current history token is: "+historyToken);
  }
}
--------------------------------------
二、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方法,但还是该留意它,或许用得上。
分享到:
评论

相关推荐

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

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

    GWT-JSNI.pdf

    GWT-JSNI.pdf GWT-JSNI.pdfGWT-JSNI.pdf

    gwt-test-json-speed-jsni

    gwt-test-json-speed-jsniJSON编码器的测试速度选定的框架[AutoBeans]( ) [RestyGWT]( ) [JSNI叠加层]( )JSON树结构单父节点,很少的属性,以及单个的,较大的子列表,每个子节点都有很少的属性。初步结果(在...

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

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

    GWT揭秘(书签整理版)

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

    GWT(Google Web Toolkit)

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

    Ajax详解.rar

    Ajax 由 HTML、JavaScript™ 技术、DHTML 和 DOM 组成,这一杰出的方法可以将笨拙的 Web 界面转化成交互性的 Ajax 应用程序。本系列的作者是一位 ...1.7 用 JSNI 调用本机 JavaScript 181 1.8 为什么使用 GWT? 183

    cometd4gwt:由 GWT 完成现有的 CometD 项目

    使用 GWT 的 JSNI 来包装现有 CometD 项目的 JavaScript? 客户端并利用 GWT 现有的序列化框架将对象(实现 IsSerializable?)从服务器传输到客户端。 源代码包括一个示例项目以及 Google Eclipse 插件的 Eclipse ...

    gwt-maps3:Google Maps API v3 的 GWT 绑定

    gwt-maps3 这是从 Google Code ... 尚未实现的内容(但您可以使用 JSNI 实现):地理编码、控件、折线、方向、海拔、自定义叠加 没有正式版本,但正在积极使用代码。 您可以签出代码并使用 Eclipse 和 ant 轻松构建。

    GwtBingMaps:Bing Maps AJAX 控件的 GWT 包装器,版本 7.0

    GwtBingMaps 是一组 JSNI 覆盖,用于将与 GWT 一起使用。 快速开始 下载 ,将其添加到您的 /war/WEB_INF/lib 文件夹,并将其添加到您的构建路径中。 或者,如果您使用的是 Maven: 使用以下命令将此存储库克隆到...

    some-gwt-module:通过一些基本示例,讨论如何帮助更新GWT模块以供将来使用

    具体来说,JSNI,Generators和JavaScriptObject在GWT 3中将不起作用; 我们必须改为使用JsInterop和Java注释处理器(或其他代码生成器/构建工具)。 通过现在进行此移植,我们可以改进和更新这些模块而不会冒着向后...

    gwt-spring-jpa-jta-jms-comet-hibernate

    目的为 GWT、Spring、JMS、Comet、JTA 提供一个集成的启动项目,由 Hibernate 和 Derby ...技术MavenHibernateJPA 注释德比GWT GWT JavaScript 对象覆盖GWT JavaScript 本机接口 (JSNI) JMS/ActiveMQ 彗星春天必创 JTA

    gwt-cell-widgets

    该存储库试图通过删除旧的浏览器支持,GWT.create()和JSNI,使GWT SDK 2.x单元,视图和单元视图API与GWT 3兼容。 提交可以随时重写。 [travis]: : [travis-img]: ://travis-ci.org/frankhossfeld//gwt-cell-...

    liferay帮助文档

    这个是环境搭建的说明,希望对你们有帮助

Global site tag (gtag.js) - Google Analytics