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 说明.
GWT-JSNI.pdf GWT-JSNI.pdfGWT-JSNI.pdf
gwt-jsni 用于 GWT 项目的 JSNI 实用程序。 用法 将依赖项添加到您的 Maven POM: < groupId>com.bytebybyte.gwt</ groupId> < artifactId>jsni < version>1.0.0 < scope>provided 和你的 .gwt.xml 文件: ...
gwt-test-json-speed-jsniJSON编码器的测试速度选定的框架[AutoBeans]( ) [RestyGWT]( ) [JSNI叠加层]( )JSON树结构单父节点,很少的属性,以及单个的,较大的子列表,每个子节点都有很少的属性。初步结果(在...
使用 GWT 的 JSNI 来包装现有 CometD 项目的 JavaScript? 客户端并利用 GWT 现有的序列化框架将对象(实现 IsSerializable?)从服务器传输到客户端。 源代码包括一个示例项目以及 Google Eclipse 插件的 Eclipse ...
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) 是 Google 最近推出的一个开发 Ajax 应用的框架,它支持用 Java 开发和调试 Ajax 应用,本文... 如果你觉得GWT提供的API不能满足需求,你可以利用JSNI将Javascript语句直接嵌入至Java代码中。
gwt-maps3 这是从 Google Code ... 尚未实现的内容(但您可以使用 JSNI 实现):地理编码、控件、折线、方向、海拔、自定义叠加 没有正式版本,但正在积极使用代码。 您可以签出代码并使用 Eclipse 和 ant 轻松构建。
GwtBingMaps 是一组 JSNI 覆盖,用于将与 GWT 一起使用。 快速开始 下载 ,将其添加到您的 /war/WEB_INF/lib 文件夹,并将其添加到您的构建路径中。 或者,如果您使用的是 Maven: 使用以下命令将此存储库克隆到...
但是,Ajax 不仅仅 是一种时尚,它是一种构建网站的强大方法,而且不像学习一种全新的语言那样困难。 目录 第 1 部分: Ajax 简介 3 1.1 老技术,新技巧 4 1.2 XMLHttpRequest 对象 4 1.3 获取 Request 对象 6 ...
具体来说,JSNI,Generators和JavaScriptObject在GWT 3中将不起作用; 我们必须改为使用JsInterop和Java注释处理器(或其他代码生成器/构建工具)。 通过现在进行此移植,我们可以改进和更新这些模块而不会冒着向后...
目的为 GWT、Spring、JMS、Comet、JTA 提供一个集成的启动项目,由 Hibernate 和 Derby ...技术MavenHibernateJPA 注释德比GWT GWT JavaScript 对象覆盖GWT JavaScript 本机接口 (JSNI) JMS/ActiveMQ 彗星春天必创 JTA
该存储库试图通过删除旧的浏览器支持,GWT.create()和JSNI,使GWT SDK 2.x单元,视图和单元视图API与GWT 3兼容。 提交可以随时重写。 [travis]: : [travis-img]: ://travis-ci.org/frankhossfeld//gwt-cell-...
这个是环境搭建的说明,希望对你们有帮助