`

JSNI 学习例子

阅读更多
JSNI 学习例子

native JavaScriptObject init(JavaScriptObject myColumns,JavaScriptObject myData)/*-{  
  try{  
    $wnd.mygrid = new $wnd.AW.UI.Grid;  
    $wnd.mygrid.setSize(75 0, 35 0);  
 
    // provide cells and headers text  
    $wnd.mygrid.setCellText(myData);  
    $wnd.mygrid.setHeaderText(myColumns);  
 
    // set number of rows/columns  
    $wnd.mygrid.setRowCount(myData.length);  
    $wnd.mygrid.setColumnCount(myColumns.length);  
    ...  
    $doc.getElementById('mygrid').innerHTML = $wnd.mygrid;  
 
    return $wnd.mygrid;  
  }  
  catch(e){  
    $wnd.alert(e.description);  
  }  
 
  return null;  
 
}-*/;  

native JavaScriptObject init(JavaScriptObject myColumns,JavaScriptObject myData)/*-{
  try{
    $wnd.mygrid = new $wnd.AW.UI.Grid;
    $wnd.mygrid.setSize(75 0, 35 0);

    // provide cells and headers text
    $wnd.mygrid.setCellText(myData);
    $wnd.mygrid.setHeaderText(myColumns);

    // set number of rows/columns
    $wnd.mygrid.setRowCount(myData.length);
    $wnd.mygrid.setColumnCount(myColumns.length);
    ...
    $doc.getElementById('mygrid').innerHTML = $wnd.mygrid;

    return $wnd.mygrid;
  }
  catch(e){
    $wnd.alert(e.description);
  }

  return null;

}-*/;  




JSNI 可以视为内联汇编代码的 Web 对等物,可以用来:


    * 直接在 JavaScript 内实现 Java 代码。

    * 为现有的 JavaScript 包装上类型安全的 Java 方法签名。

    * 从 JavaScript 调用 Java 代码,反之亦然。

    * 跨 Java/JavaScript 界线抛出异常。

    * 从 JavaScript 读写 Java 字段。

    * 使用宿主模式调试 Java 源代码(通过 Java 调试器)和
      JavaScript(通过脚本调试器)。


GWT 开发文档提示说必须慎重使用 JSNI
,因为不能保证浏览器的可移植性,而且编译代码的优化是有限制的。至于商业控件,您可以依赖供应商的承诺来支持多个浏览器类型和部署平台。

当从 JSNI 访问浏览器窗口和文档对象时,必须将其分别作为
$wnd 和 $doc
加以引用。而所编译的脚本则在嵌套的框架中运行,$wnd 和
$doc 会自动初始化以正确指代宿主页面的窗口和文档。

示例代码展示了一种很好的技巧,即使用 JSNI 来将一维或二维的 Java
字符串数组转换成 JavaScript 数组,以便于用数据填充数组,如清单 2
所示:

清单2. Java 到 JavaScript
数组的转换

public static JavaScriptObject arrayConvert(String[] array) {   
    JavaScriptObject result = newJSArray(array.length);   
    for (int i = 0; i<array.length; i++) {   
      arraySet(result, i, array[i]);   
    }   
    return result;   
}   
  
private static native JavaScriptObject newJSArray(int length) /*-{  
    return new Array(length);   
}-*/;   
  
public static native int arrayLength(JavaScriptObject array) /*-{  
    return array.length;  
}-*/;   
  
public static native String arrayGetObject(JavaScriptObject array, int index) /*-{  
    return array[index];  
}-*/;   
  
public static native void arraySet(JavaScriptObject array,int index,String value) /*-{  
    array[index] = value;  
}-*/;  

public static JavaScriptObject arrayConvert(String[] array) {
    JavaScriptObject result = newJSArray(array.length);
    for (int i = 0; i<array.length; i++) {
      arraySet(result, i, array[i]);
    }
    return result;
}

private static native JavaScriptObject newJSArray(int length) /*-{
    return new Array(length); 
}-*/;

public static native int arrayLength(JavaScriptObject array) /*-{
    return array.length;
}-*/;

public static native String arrayGetObject(JavaScriptObject array, int index) /*-{
    return array[index];
}-*/;

public static native void arraySet(JavaScriptObject array,int index,String value) /*-{
    array[index] = value;
}-*/;  

 

 




处理事件

在 JavaScript 中定义的事件处理程序可与用 Java
代码实现的方法相关联。清单 3 展示了网格控件的
onRowClicked 事件是如何调用 onRowSelect
Java 函数的:



清单 3. 从 JavaScript 调用 Java
函数

public void onRowSelect(String index){   
  GWT.log("Row #" + index + "selected", null);   
}   
  
native JavaScriptObject init(JavaScriptObject myColumns, JavaScriptObject myData)/*-{  
  var widget = this;  
   
  try{  
      ...  
      // set click action handler  
      $wnd.mygrid.onRowClicked = function(event, index){  
 
widget.@com.mycompany.project.client.GwtGrid::onRowSelect(Ljava/lang/String;)(index);  
      };  
 
      ...  
 }  
 catch(e){  
  $wnd.alert(e.description);  
 }  
}-*/;  

public void onRowSelect(String index){
  GWT.log("Row #" + index + "selected", null);
}

native JavaScriptObject init(JavaScriptObject myColumns, JavaScriptObject myData)/*-{
  var widget = this;
 
  try{
      ...
      // set click action handler
      $wnd.mygrid.onRowClicked = function(event, index){

widget.@com.mycompany.project.client.GwtGrid::onRowSelect(Ljava/lang/String;)(index);
      };

      ...
 }
 catch(e){
  $wnd.alert(e.description);
 }
}-*/;  



您必须使用如下表示法在 JavaScript 中引用 Java 方法:
instance-expr.@class-name::method-name(param-signature)(arguments)


    * instance-expr
      在调用实例方法时必须使用,在调用静态方法时必须去掉。

    * class-name
      是类的完全限定名,方法在此类(或其子类)中声明。

    * param-signature 是这里指定的内部 Java
      方法签名,但无此方法返回类型的尾随签名(因为不需要选择重载)。

    * arguments
      是实际要传递给被调方法的参数列表。




使用
JavaScript 控件 API


清单 1 所示,实现 Java 类的 init 方法返回
JavaScriptObject,它代表一个网格实例。您可以将其作为一个类属性加以存储并随后在代码中引用,以调用
JavaScript 控件 API 方法。清单 4 展示了 Delete 按钮单击事件在 Java
代码中是如何处理的:


清单 4. JavaScript
方法调用

protected JavaScriptObject grid = null;   
  
...   
  
public void onload(){   
  if(grid == null){   
    grid = init(...);   
  }   
}   
  
public void onDeleteButtonClick(){   
  delete(grid, getCurrentRow(grid));   
}   
  
  
public native void delete(JavaScriptObject obj, int index) /*-{  
 
 try{  
    obj.deleteRow(index);  
 }  
 catch(e){  
    $wnd.alert(e.description);  
 }  
 
}-*/;     
  
public native int getCurrentRow(JavaScriptObject obj) /*-{  
   
  try{  
    return obj.getCurrentRow();  
  }  
  catch(e){  
    $wnd.alert(e.description);  
  }  
 
  return -1;  
 
}-*/;  

protected JavaScriptObject grid = null;

...

public void onload(){
  if(grid == null){
    grid = init(...);
  }
}

public void onDeleteButtonClick(){
  delete(grid, getCurrentRow(grid));
}


public native void delete(JavaScriptObject obj, int index) /*-{

 try{
    obj.deleteRow(index);
 }
 catch(e){
    $wnd.alert(e.description);
 }

}-*/;  

public native int getCurrentRow(JavaScriptObject obj) /*-{
 
  try{
    return obj.getCurrentRow();
  }
  catch(e){
    $wnd.alert(e.description);
  }

  return -1;

}-*/;  
分享到:
评论

相关推荐

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

    ### 关于 JSNI 调用 Java 方法时的 Type Signatures 说明 #### 一、Type Signatures 的概念与重要性 在 Java Native Interface (JNI) 和 Google Web Toolkit (GWT) 中,Type Signatures 是一种特殊的表示法,用于...

    GWT-JSNI.pdf

    ### GWT-JSNI 关键知识点解析 #### 一、GWT与JSNI概述 - **GWT(Google Web Toolkit)**: 是一个开源框架,用于创建高性能的客户端应用程序。GWT 支持开发者使用 Java 编写前端代码,并将其编译成浏览器可以执行的...

    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-test-json-speed-jsni

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

    GWT in Action

    作者会介绍GWT提供的模块化支持,并给出实际的例子来演示如何划分不同的功能模块。 #### 四、高级技术 **第10章:与GWT-RPC通信** GWT-RPC是GWT内置的一个远程过程调用框架,用于简化客户端与服务器之间的通信。...

    GWT ajax开发(Eclipse Ajax)基础学习

    【GWT(AJAX)基础学习】 GWT (Google Web Toolkit) 是Google为开发者提供的一款强大的框架,专门用于构建基于Ajax技术的Web应用程序。通过使用Java语言,GWT简化了客户端和服务器端的代码编写,并且自动将Java代码...

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

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

    gwt开发问题

    ### GWT开发问题详解 #### 一、GWT Web实现右键菜单的多种方式 GWT(Google Web Toolkit)作为一款强大的...上述知识点仅是GWT开发中的一小部分,更多深入的实践和技术细节有待于开发者在项目实践中不断探索和学习。

    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 IN Action

    这部分深入探讨了GWT的高级特性和开发技巧,包括自定义小部件、客户端捆绑包的使用、界面设计、远程过程调用(RPC)、请求工厂、编辑器框架、数据呈现组件、JavaScript Native Interface (JSNI)、经典Ajax和HTML表单...

    GWT_2BEXT_2BSTRUTS2完整实例

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

    Java和JavaScript库进行交互

    8. **JavaScript Native Interface (JSNI)**:在GWT项目中,JSNI提供了一种直接在JavaScript和Java之间编写互操作代码的方法,允许在Java类中直接嵌入JavaScript代码,并调用JavaScript函数。 文件"ImangazalievM-...

    GWT开发者手册_v2

    虽然文档中提到 JSNI“未完成,不提倡使用”,但在某些情况下,可能需要直接调用 JavaScript 代码。GWT 提供了 JSNI 功能来实现这一点,尽管建议尽量避免使用。 #### 七、GWT 应用程序自定义应用程序框架 这部分...

    gwt项目开发的经验集

    以下是一个使用`float`属性实现并排布局的例子: ```java public class FloatLayoutExample extends Composite { public FloatLayoutExample() { VerticalPanel root = new VerticalPanel(); initWidget(root); ...

    藏经阁-一站式服务型开发生态——YunOS开发生态介绍.pdf

    YunOS 开发生态提供了IDE 插件集,包括 YunOS Studio、Emulator、JSNI compiler 等多种插件。这些插件可以帮助开发者快速构建高质量的应用程序,並且提供了更好的开发体验。 开发实例集 YunOS 开发生态提供了开发...

    GWT(Google Web Toolkit)

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

    网页表格组件 GWT Advanced Table

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

Global site tag (gtag.js) - Google Analytics