- 浏览: 557534 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (340)
- Spring (4)
- Hibernate (2)
- Linux (34)
- Oracle (145)
- Eclipse (1)
- UML (1)
- HTML&&JAVASCRIPT (11)
- JAVA (33)
- 设计模式 (1)
- 版本控制 (1)
- wrap框架 (3)
- IBATIS (5)
- Ruby (1)
- DWR (1)
- MINA (11)
- JBPM (2)
- 缓存技术 (4)
- 网络 (3)
- 应用服务器 (1)
- GWT (5)
- 杂谈 (2)
- ICE (4)
- XML (2)
- ArcGis (2)
- Flex (8)
- junit单元测试 (1)
- SNMP (1)
- 存储 (1)
- office (1)
- MongoDB (0)
- Greenplum (3)
- 管理点滴 (1)
- C++ (6)
- 网络入门 (3)
- Tomcat (7)
- JMX (0)
- webservice (1)
- Oracle的10046事件 (1)
- Library cache内部机制详解 (1)
- expdp通过dblink来导入 (1)
最新评论
-
yuanliangding:
有没有关于mock的更多知识。
基于mock对象和JUnit框架简化Spring Web组件单元测试 -
saup007:
ssh端口不是22,怎么搞呢?
Greenplum 学习笔记 -
springmvc-freemarker:
java开源项目源码实例下载
Apache上全部JAVA开源项目简介 -
bobbell:
哇塞,你真厉害,整理的非常全面。我是一个java barcod ...
Greenplum 学习笔记 -
wsj55133245513324:
这不是bug,你将日志级别从debug提升到INFO 就好了 ...
Spring,smppapi,apache mina, ssl快速实现安全的smpp(5)
GWT的JSNI提供了java代码和javascript代码之间的交互功能,其中最重要的一个类就是 JavaScriptObject 。这是一个非常特殊的类:
1.不可以直接new创建,必须通过JSNI的native方法来创建。这也是为什么它只有protected修饰符的构造函数的原因了。
2.java代码可以把JavaScriptObject的对象通过native再次传回给js使用。
3.从JavaScriptObject类继承的类其构造函数的修饰符必须是protected,其公共方法必须加上final修饰符。
先一个应用的小例子,希望对朋友们理解代码有所帮助。
现假设我们有一个外联的javascript文件中有这么一个类
function Person() { } Person.prototype.setName = function(name) { this.name = name; }
我们就可以在java中构建一个JSPerson类对javascript的Person类进行封装
- public class JSPerson extends JavaScriptObjectWrapper {
- protected JSPerson() {
- }
- public static native JSPerson createNew() /*-{
- return new $wnd.Person();
- }-*/;
- }
public class JSPerson extends JavaScriptObjectWrapper { protected JSPerson() { } public static native JSPerson createNew() /*-{ return new $wnd.Person(); }-*/; }
然后使用这个类
JSPerson jsPerson = JSPerson.createNew(); jsPerson.invokeMethod("setName", "yingxia");
有了这样一个JSNI得通用类后,和外联js交互起来竟然如此的简单。
下面详细的解说,我们开始对JavaScriptObject类进行继承和封装,实现对外联的javascript库的方便操作。
1.首先我们建立类JavaScriptObjectWrapper继承自JavaScriptObject
- package com.yingxia.tonglin.client.common;
- import com.google.gwt.core.client.JavaScriptObject;
- public class JavaScriptObjectWrapper extends JavaScriptObject {
- protected JavaScriptObjectWrapper() {
- }
- }
package com.yingxia.tonglin.client.common; import com.google.gwt.core.client.JavaScriptObject; public class JavaScriptObjectWrapper extends JavaScriptObject { protected JavaScriptObjectWrapper() { } }
2.然后我们建立JSArrayHelper类,实现将java的Object数组转换为javascript的数组。这里请注意数组中每一个元素的类型的转换。
- package com.yingxia.tonglin.client.common;
- public class JSArrayHelper {
- /**
- *
- * @param objs : must be primitive type or JavaScriptObject, now just support few you can extend
- * @return
- */
- public static JavaScriptObjectWrapper toJSArray(Object... objs) {
- JavaScriptObjectWrapper jsArray = createJSArray();
- for(int i = 0; i < objs.length; i++) {
- setJSArray(jsArray, i, objs[i]);
- }
- return jsArray;
- }
- private static native JavaScriptObjectWrapper createJSArray() /*-{
- return [];
- }-*/;
- private static void setJSArray(JavaScriptObjectWrapper jsArray, int index, Object value) {
- if(value.getClass().equals(java.lang.Integer.class)) {
- setJSArray(jsArray, index, (int) Integer.valueOf(value.toString()));
- }
- if(value.getClass().equals(java.lang.Float.class)) {
- setJSArray(jsArray, index, (float) Float.valueOf(value.toString()));
- }
- if(value.getClass().equals(java.lang.Double.class)) {
- setJSArray(jsArray, index, (double) Double.valueOf(value.toString()));
- }
- if(value.getClass().equals(java.lang.Boolean.class)) {
- setJSArray(jsArray, index, (boolean) Boolean.valueOf(value.toString()));
- }
- if(value.getClass().equals(java.lang.String.class)) {
- setJSArray(jsArray, index, value.toString());
- }
- if(value.getClass().equals(JavaScriptObjectWrapper.class)) {
- setJSArray(jsArray, index, (JavaScriptObjectWrapper) value);
- }
- }
- private static native void setJSArray(JavaScriptObjectWrapper jsArray, int index, int value) /*-{
- jsArray[index] = value;
- }-*/;
- private static native void setJSArray(JavaScriptObjectWrapper jsArray, int index, float value) /*-{
- jsArray[index] = value;
- }-*/;
- private static native void setJSArray(JavaScriptObjectWrapper jsArray, int index, double value) /*-{
- jsArray[index] = value;
- }-*/;
- private static native void setJSArray(JavaScriptObjectWrapper jsArray, int index, boolean value) /*-{
- jsArray[index] = value;
- }-*/;
- private static native void setJSArray(JavaScriptObjectWrapper jsArray, int index, String value) /*-{
- jsArray[index] = value;
- }-*/;
- private static native void setJSArray(JavaScriptObjectWrapper jsArray, int index, JavaScriptObjectWrapper value) /*-{
- jsArray[index] = value;
- }-*/;
- }
package com.yingxia.tonglin.client.common; public class JSArrayHelper { /** * * @param objs : must be primitive type or JavaScriptObject, now just support few you can extend * @return */ public static JavaScriptObjectWrapper toJSArray(Object... objs) { JavaScriptObjectWrapper jsArray = createJSArray(); for(int i = 0; i < objs.length; i++) { setJSArray(jsArray, i, objs[i]); } return jsArray; } private static native JavaScriptObjectWrapper createJSArray() /*-{ return []; }-*/; private static void setJSArray(JavaScriptObjectWrapper jsArray, int index, Object value) { if(value.getClass().equals(java.lang.Integer.class)) { setJSArray(jsArray, index, (int) Integer.valueOf(value.toString())); } if(value.getClass().equals(java.lang.Float.class)) { setJSArray(jsArray, index, (float) Float.valueOf(value.toString())); } if(value.getClass().equals(java.lang.Double.class)) { setJSArray(jsArray, index, (double) Double.valueOf(value.toString())); } if(value.getClass().equals(java.lang.Boolean.class)) { setJSArray(jsArray, index, (boolean) Boolean.valueOf(value.toString())); } if(value.getClass().equals(java.lang.String.class)) { setJSArray(jsArray, index, value.toString()); } if(value.getClass().equals(JavaScriptObjectWrapper.class)) { setJSArray(jsArray, index, (JavaScriptObjectWrapper) value); } } private static native void setJSArray(JavaScriptObjectWrapper jsArray, int index, int value) /*-{ jsArray[index] = value; }-*/; private static native void setJSArray(JavaScriptObjectWrapper jsArray, int index, float value) /*-{ jsArray[index] = value; }-*/; private static native void setJSArray(JavaScriptObjectWrapper jsArray, int index, double value) /*-{ jsArray[index] = value; }-*/; private static native void setJSArray(JavaScriptObjectWrapper jsArray, int index, boolean value) /*-{ jsArray[index] = value; }-*/; private static native void setJSArray(JavaScriptObjectWrapper jsArray, int index, String value) /*-{ jsArray[index] = value; }-*/; private static native void setJSArray(JavaScriptObjectWrapper jsArray, int index, JavaScriptObjectWrapper value) /*-{ jsArray[index] = value; }-*/; }
3.创建JavaScriptObjectWrapperImpl类,全是static native方法,实现类似于java反射的机制,可以调用方法,可以获取和设置属性。
- package com.yingxia.tonglin.client.common;
- public class JavaScriptObjectWrapperImpl {
- public static native JavaScriptObjectWrapper invokeJSMethod(JavaScriptObjectWrapper jsObject, String methodName, JavaScriptObjectWrapper arguments) /*-{
- return jsObject[methodName].apply(jsObject, arguments);
- }-*/;
- public static native void setProperty(JavaScriptObjectWrapper object, String name, int value) /*-{
- object[name] = value;
- }-*/;
- public static native int getPropertyAsInt(JavaScriptObjectWrapper object, String name) /*-{
- var ret = object[name];
- return (ret === undefined) ? 0 : ret;
- }-*/;
- public static native void setProperty(JavaScriptObjectWrapper object, String name, String value) /*-{
- object[name] = value;
- }-*/;
- public static native String getPropertyAsString(JavaScriptObjectWrapper object, String name) /*-{
- var ret = object[name];
- return (ret === undefined) ? null : ret;
- }-*/;
- public static native void setProperty(JavaScriptObjectWrapper object, String name, boolean value) /*-{
- object[name] = value;
- }-*/;
- public static native boolean getPropertyAsBoolean(JavaScriptObjectWrapper object, String name) /*-{
- var ret = object[name];
- return (ret === undefined) ? 0 : ret;
- }-*/;
- public static native void setProperty(JavaScriptObjectWrapper object, String name, float value) /*-{
- object[name] = value;
- }-*/;
- public static native float getPropertyAsFloat(JavaScriptObjectWrapper object, String name) /*-{
- var ret = object[name];
- return (ret === undefined) ? 0 : ret;
- }-*/;
- public static native void setProperty(JavaScriptObjectWrapper object, String name, double value) /*-{
- object[name] = value;
- }-*/;
- public static native double getPropertyAsDouble(JavaScriptObjectWrapper object, String name) /*-{
- var ret = object[name];
- return (ret === undefined) ? 0 : ret;
- }-*/;
- public static native void setProperty(JavaScriptObjectWrapper object, String name, JavaScriptObjectWrapper value) /*-{
- object[name] = value;
- }-*/;
- public static native JavaScriptObjectWrapper getProperty(JavaScriptObjectWrapper object, String name) /*-{
- var ret = object[name];
- return (ret === undefined) ? null : ret;
- }-*/;
- }
package com.yingxia.tonglin.client.common; public class JavaScriptObjectWrapperImpl { public static native JavaScriptObjectWrapper invokeJSMethod(JavaScriptObjectWrapper jsObject, String methodName, JavaScriptObjectWrapper arguments) /*-{ return jsObject[methodName].apply(jsObject, arguments); }-*/; public static native void setProperty(JavaScriptObjectWrapper object, String name, int value) /*-{ object[name] = value; }-*/; public static native int getPropertyAsInt(JavaScriptObjectWrapper object, String name) /*-{ var ret = object[name]; return (ret === undefined) ? 0 : ret; }-*/; public static native void setProperty(JavaScriptObjectWrapper object, String name, String value) /*-{ object[name] = value; }-*/; public static native String getPropertyAsString(JavaScriptObjectWrapper object, String name) /*-{ var ret = object[name]; return (ret === undefined) ? null : ret; }-*/; public static native void setProperty(JavaScriptObjectWrapper object, String name, boolean value) /*-{ object[name] = value; }-*/; public static native boolean getPropertyAsBoolean(JavaScriptObjectWrapper object, String name) /*-{ var ret = object[name]; return (ret === undefined) ? 0 : ret; }-*/; public static native void setProperty(JavaScriptObjectWrapper object, String name, float value) /*-{ object[name] = value; }-*/; public static native float getPropertyAsFloat(JavaScriptObjectWrapper object, String name) /*-{ var ret = object[name]; return (ret === undefined) ? 0 : ret; }-*/; public static native void setProperty(JavaScriptObjectWrapper object, String name, double value) /*-{ object[name] = value; }-*/; public static native double getPropertyAsDouble(JavaScriptObjectWrapper object, String name) /*-{ var ret = object[name]; return (ret === undefined) ? 0 : ret; }-*/; public static native void setProperty(JavaScriptObjectWrapper object, String name, JavaScriptObjectWrapper value) /*-{ object[name] = value; }-*/; public static native JavaScriptObjectWrapper getProperty(JavaScriptObjectWrapper object, String name) /*-{ var ret = object[name]; return (ret === undefined) ? null : ret; }-*/; }
4.在其它两个类的支持下完善JavaScriptObjectWrapper类
- package com.yingxia.tonglin.client.common;
- import com.google.gwt.core.client.JavaScriptObject;
- public class JavaScriptObjectWrapper extends JavaScriptObject {
- protected JavaScriptObjectWrapper() {
- }
- public final JavaScriptObjectWrapper invokeJSMethod(String methodName, Object... objs) {
- JavaScriptObjectWrapper arguments = JSArrayHelper.toJSArray(objs);
- return JavaScriptObjectWrapperImpl.invokeJSMethod(this, methodName, arguments);
- }
- public final void setProperty(String name, int value){
- JavaScriptObjectWrapperImpl.setProperty(this, name, value);
- }
- public final int getPropertyAsInt(String name){
- return JavaScriptObjectWrapperImpl.getPropertyAsInt(this, name);
- }
- public final void setProperty(String name, String value){
- JavaScriptObjectWrapperImpl.setProperty(this, name, value);
- }
- public final String getPropertyAsString(String name){
- return JavaScriptObjectWrapperImpl.getPropertyAsString(this, name);
- }
- public final void setProperty(String name, boolean value){
- JavaScriptObjectWrapperImpl.setProperty(this, name, value);
- }
- public final boolean getPropertyAsBoolean(String name){
- return JavaScriptObjectWrapperImpl.getPropertyAsBoolean(this, name);
- }
- public final void setProperty(String name, float value){
- JavaScriptObjectWrapperImpl.setProperty(this, name, value);
- }
- public final float getPropertyAsFloat(String name){
- return JavaScriptObjectWrapperImpl.getPropertyAsFloat(this, name);
- }
- public final void setProperty(String name, double value){
- JavaScriptObjectWrapperImpl.setProperty(this, name, value);
- }
- public final double getPropertyAsDouble(String name){
- return JavaScriptObjectWrapperImpl.getPropertyAsDouble(this, name);
- }
- public final void setProperty(String name, JavaScriptObjectWrapper value){
- JavaScriptObjectWrapperImpl.setProperty(this, name, value);
- }
- public final JavaScriptObjectWrapper getProperty(String name){
- return JavaScriptObjectWrapperImpl.getProperty(this, name);
- }
- }
相关推荐
GWT-Servlet是GWT框架的一部分,主要负责处理服务器端的交互。`gwt-servlet-2.3.0.jar`是GWT 2.3.0版本的Servlet库,这个库包含了运行GWT应用所需的服务器端组件。 在GWT的应用程序中,客户端部分通常由JavaScript...
### Gwt-Ext:强大的网页开发控件库详解 Gwt-Ext,作为一个结合了Google Web Toolkit(GWT)和ExtJs的高级网页开发控件库,为纯Java语言的富互联网应用程序(RIA)开发提供了强有力的支持。尤其对于初学者而言,Gwt...
GWT-Developer-Plugin
结合标签“fireFox26 GWT-Dev_plug”,我们可以推断这个压缩包可能包含了安装或更新GWT-Dev_plugin到适用于Firefox 26版本的步骤、文件或者指南。可能的内容可能包括: 1. GWT-Dev_plugin的Firefox 26特定版本:这...
标题中的"gwt-dev-plugin-x86-对ie浏览器使用"指的是一个特定的GWT开发插件,适用于x86架构的机器,并且是专为Internet Explorer(IE)浏览器设计的。在GWT的早期版本中,为了实现Java到JavaScript的编译和在浏览器...
GWT-2.5.1是GWT的一个版本,包含了该框架的库文件和其他必要的组件。 在安装GWT-2.5.1之前,确保你的系统已经安装了Java Development Kit(JDK),因为GWT是基于Java的。接下来,我们将详细介绍GWT的安装步骤: 1....
### Gwt-ext学习笔记之基础篇 #### 一、安装CypalStudio工具 为了能够开始Gwt-ext的学习之旅,首先需要确保开发环境已经搭建好。CypalStudio是一款非常实用的工具,它能帮助开发者更高效地进行GWT项目的开发。 1....
在提供的文件列表中,`gwt-dev-plugin-1.26-rc1forFireFox` 是GWT-Dev Plugin针对Firefox 26的特定版本。"rc1"表示这是该版本的候选发布1(Release Candidate 1),意味着它可能还不是最终版本,但在功能和稳定性上...
gwt-user.jar 大小:2.86 MB
里面东西很多,都是关于GWT-COMET的内容,实现gwt的服务器推技术,包括gwt-comet-examples-1.2.3:google官网上的Test实例;gwt-comet-1.2.3.jar:jar包,gwt-example:聊天实例源代码(.java的),gwt-event-source...
gwt-dev-plugin
gwt-servlet.jar 最新版,由于文件太大、不可以上传、有需要可以留言、整包分享给你、
gwt-windows-1.7.1.zipgwt-windows-1.7.1.zipgwt-windows-1.7.1.zipgwt-windows-1.7.1.zipgwt-windows-1.7.1.zipgwt-windows-1.7.1.zip
gwt-dev-windows.jar 大小:9.60 MB
GWT-Ext是一个基于Google Web Toolkit (GWT)的JavaScript库,它提供了丰富的用户界面组件和强大的数据绑定机制,使得开发者能够构建出交互性强、视觉效果优秀的Web应用程序。本教程将深入探讨GWT-Ext的核心概念、...
标题 "gwt-maven-archetype source code" 暗示了我们正在讨论一个与Google Web Toolkit (GWT) 和 Maven 相关的项目模板。GWT 是一个用于开发富互联网应用程序(RIA)的开放源代码框架,它允许开发者使用 Java 语言...
GWT-Ext是一个基于Google Web Toolkit (GWT)的用户界面库,它为开发者提供了丰富的JavaScript组件和功能,使得在GWT应用中构建复杂的、交互式的Web界面变得更加容易。GWT是一个由Google开发的开放源代码框架,允许...
gwt-benchmark-viewer.jar
2. **gwt-dev-plugin-x86.msi**:这是一个Windows安装程序包,用于32位系统。MSI是Microsoft Installer的文件格式,用户可以通过双击此文件进行标准的Windows安装过程。 3. **gwt-dev-plugin.xpi**:这是Firefox...
gwt-2.7.0.part2.rar 官网下载最新版,提供给大家使用