PKGIS 的Java Applet的实现读书笔记

作者:如文来源:中华励志网 2011-06-26

读书笔记之二王文俊专题:PKGIS的JAVA APPLET实现时间:2002/4/8 --- 2002/4/14书目:1、 2、 202.110.225.196:80网站:1、 www.esri.com JavaApplet反编译工具:1、mDeJava molesoftware.hypermart.com2DeCafe3JAD目标:1、 探索GEO UNION的APPLET的解决方案 读书体会:1. JavaScript 与Java的通信1.1 概述要实现PKGis的灵活交互性及二次开发功能,就必须实现JavaScript和Java Applet之间的相互通信。如何通过灵活使用从JavaScript语言中访问Java Applet的方法、从JavaScript中访问JavaScript小程序的方法与变量,以及在Java Applet小程序中使用JavaScript等技术,实现这几种网页开发语言的互相补充,以开发更完美的Web应用程序是很重要的。 JavaScript是用于HTML环境的开发语言,提供了能够响应Web页面事件的脚本,可以完全访问浏览器窗口的各个方面,善于合并HTML、Java Applet小程序、插入件、服务器方程序和其他Web组件,形成完全集成的Web应用程序。而Java是功能强大的著名开发语言,能够支持Web应用程序的开发,用于开发高级Web对象,并提供实现嵌入Web页面的可执行内容,具有更强的编程功能,可以作为JavaScript功能的良好补充,只不过这些功能被限制在有限的浏览器窗口区中。 要解决以下问题: 一、从JavaScript中访问Java方法 在HTML脚本中可以用JavaScript直接调用Java中的方法,只需要在调用语句前用“java.lang.”加以表示即可。具体语句用法如下例所示:java.Lang.System.Out.println(“Hello!”) 但此种方法只适用于Netscape Navigator,一般不提倡在Web应用程序中使用。二、从JavaScript中访问Java Applet小程序中的方法和变量 通过JavaScript提供的Applet对象,JavaScript代码可以访问Java的变量和方法,具体步骤和用法示例如下。需要注意的是,JavaScript提供的applet对象具有name属性,而没有方法和事件处理器。步骤:1) 将要访问的Java Applet小程序的方法和变量声明为Public,且必须在Public类中声明;2) Java Applet小程序要先装入才能访问,尽管applet对象没有定义onLoad事件,但可以在HTML文档的〈body〉标志中,指定使用Window对象的onLoad事件处理器;3) Java Applet小程序可以用JavaScript的applet对象来访问。三、在Java Applet小程序中使用JavaScriptLive Connect提供了Java与JavaScript的接口,可以允许在Java Applet小程序中使用JavaScript。具体步骤如下:1) 在HTML脚本中使用〈APPLET〉标志的MAYSCRIPT属性,以允许Java Applet小程序访问脚本;2) 将netscape. JavaScript包导入Java Applet小程序;3) 在Java Applet小程序中用JSObject类的getWindow( )方法创建JavaScript窗口的句柄4) 在Java Applet小程序中用JSObject类的getMember( )方法访问JavaScript对象;5) 在Java Applet小程序中用JSObject类的eval( )方法调用JavaScript方法。1.2 JavaScript 至 Java 的通信  当引用一个 Java 程序包或类,或使用一个 Java 对象或数组时,您可以使用某个特殊的 LiveConnect 对象。所有的 JavaScript 访问 Java 代替这些对象,下表为总结: 对象 描述 JavaArray 一个包裹的 Java 数组,在 JavaScript 代码中访问 JavaClass 一个 Java 类的 JavaScript 引用 JavaObject 一个包裹的 Java 对象,在 JavaScript 代码中访问 JavaPackage 一个 Java 程序包的 JavaScript 引用 从另一方面来说,LiveConnect 对象的实体是透明的,例如您可以创建一个 Java String 对象并将其赋为一个 JavaScript 变量:myString,这只需您在 Java 构造函数中使用 new 运算符即可,如下:var myString = new java.lang.String("Hello world") 在上例中,变量 myString 是一个 JavaObject,因为它保存了一个 Java 对象 String 的实例,作为一个 JavaObject,myString 是 java.lang.String 和它的超类(superclass)公共实例方法的入口,您可以在 JavaScript 中这样来调用它:myString.length() //返回 111.2.1 处理 Java 数组  当 Java 方法创建了一个数组并且您在 JavaScript 中对它进行引用,这就要用到一个 JavaArray。例如下面的代码创建一个有十个整型量元素的 JavaArray x :theInt = java.lang.Class.forName("java.lang.Integer")

x = java.lang.reflect.Array.newInstance(theInt, 10)正象 JavaScript 的 Array 对象一样,JavaArray 也有一个 length 属性,它返回数组中元素数量;但不同于 Array.length 的是:JavaArray.length 具有只读属性,因为 Java 数组的元素数量在创建时是固定的。但我们必须清楚一点—当您将 JavaClass 对象作为参数传递到 Java 方法中时,它不能自动转换为 java.lang.Class 的实例,您必须创建一个 java.lang.Class 的包装(wrapper),如下例:theClass = java.lang.Class.forName("java.lang.String")

theArray = java.lang.reflect.Array.newInstance(theClass, 5)另外,您不能将一个单字符的字符串赋予一个需要 char 类型参数的 Java 方法,您必须使用字符的 Unicode 值,如将值 "H" 变量 c 的表达式应为:c = new java.lang.Character(72)1.2.2 控制 Java Applets我们可以用 JavaScript 来控制一个 Java applet 的行为,而不必关心 applet 的内部构造。所有公共的 applet 变量、方法和属性都能用 JavaScript 来进行访问。例如您可以用 HTML 的表单按钮来启动或停止一个 Java applet。文档中的每一个 applet 都可用 JavaScript 的 document.appletName 语句来访问,这里 appletName 是<applet> 标记中的 NAME 属性值,当然您还可以用 applets 数组的索引值来引用它1.3 Java 至 JavaScript 的通信  如果您需要在 Java 中使用 JavaScript 对象,您必须在您的 Java 文件中引入 netscape.javascript 包,其定义如下: netscape.javascript.JSObject 允许 Java 代码访问 JavaScript 方法和属性; netscape.javascript.JSException 允许 Java 代码处理 JavaScript 异

常; netscape.plugin.Plugin 允许客户端 JavaScript 和 applets 操作一个插件(plug-in)。   从 JavaScript 1.2 开始,这些类被递交到一个后缀为 .jar 的文件,而这以前的 JavaScript 版本,这些类被递交到一个后缀为 .zip 的文件。为了访问 LiveConnect 类,您可以有两种方法将 .jar 或 .zip 文件置于 JDK 编译器的 CLASSPATH 中:创建一个 CLASSPATH 环境变量以指定这些文件的路径和名称; 当您用 -classpath 命令行参数编译时指定这些文件的位置。 1.3.1 用 JSObject 访问 JavaScriptJSObject 是一个Java类,不是JavaScript 对象,所以不能用于JavaScript 程序。Java applets使用JSObject来读/写JavaScript 属性和数组元素,调用JavaScript 的方法,估算或执行任意JavaScript代码串。 Java applet 在使用JSObject 类时,要先取得运行该applet的web browser 窗口的初始 JSObject instance。该类没有构造方法,所以只有通过调用静态 getWindow() 方法,将JSObject instance 传给java.applet.Applet 。也可以使用getMember() and getSlot() 方法获取applet 需要的其它JSObjects的对象。若该applet 使用了JSObject类,在<APPLET> tag中要设MAYSCRIPT 属性,否则不允许在Java中操作JavaScript。在APPLET的程序中分使用以下语句: import netscape.javascript.JSObject;  假设您有一个名为 JavaDog 的 Java 类,JavaDog 构造函数设置了 JavaScript 对象 jsDog,它被定义为 JSObject 类型,其代码如下:import netscape.javascript.*;

public class JavaDog{

public String dogBreed;

public String dogColor;

public String dogSex;

// define the class constructor

public JavaDog(JSObject jsDog) {

// use try...catch to handle JSExceptions here

this.dogBreed = (String)jsDog.getMember("breed");

this.dogColor = (String)jsDog.getMember("color");

this.dogSex = (String)jsDog.getMember("sex");

}

}  现在来看看如何用 Java 来访问客户端 JavaScript,然而 HTML 页必须允许一个 Java applet 访问 JavaScript— 通过在 <APPLET> 标记中指定 MAYSCRIPT 属性。当您在 Navigator 中访问 JavaScript 之前,您必须获得 Navigator 窗口的句柄,您可以在 netscape.javascript.JSObject 类中使用的 getWindow 方法来达到这个目的。例如,如果先前定义了一个 JSObject 类的变量 win,下面的代码将窗口句柄赋予 win:public class myApplet extends Applet {

public void init() {

JSObject win = JSObject.getWindow(this);

}

}1.3.2 在 Java 中处理 JavaScript 的异常  当从 Java 中调用的 JavaScript 代码发生了运行时的错误,它就会发出一个异常,这时您可以用 try...catch 语句来捕获该异常。例如:try {

global.eval("foo.bar = 999;");

} catch (Exception e) {

if (e instanceof JSException) {

jsCodeFailed()";

} else {

otherCodeFailed();

}

}1.3.3 访问 JavaScript 的对象和属性  我们用 getMember 方法来访问 JavaScript 的对象和属性,例如下面的代码允许您通过变量 myForm 来访问 JavaScript 对象 document.testForm:public void init() {

win = JSObject.getWindow(this);

myForm=win.eval("document.testForm")

}您也可以用下面的语句来代替 myForm=win.eval("document.testForm"):JSObject doc = (JSObject) win.getMember("document");

JSObject myForm = (JSObject) doc.getMember("testForm");如果 JavaScript 对象 document.testForm.jazz 是一个 checkbox,下面的语句允许您访问它的 checked 属性:public void init() {

win = JSObject.getWindow(this);

JSObject doc = (JSObject) win.getMember("document");

JSObject myForm = (JSObject) doc.getMember("testForm");

JSObject check = (JSObject) myForm.getMember("jazz");

Boolean isChecked = (Boolean) check.getMember("checked");

}1.3.4 访问 JavaScript 方法  在 netscape.javascript.JSObject 类中的方法可以让您求出任一 JavaScript 表达式,先用 getWindow 来获得 JavaScript 窗口的句柄,然后再用 eval 来访问一个 JavaScript 方法,如下:JSObject.getWindow().eval("表达式")2. 附录2.1 netscape.javascript.JSObjectpublic final class JSObject extends Object JSObject allows Java to manipulate objects that are defined in JavaScript. Values passed from Java to JavaScript are converted as follows: JSObject is converted to the original JavaScript object Any other Java object is converted to a JavaScript wrapper, which can be used to access methods and fields of the java object. Converting this wrapper to a string will call the toString method on the original object, converting to a number will call the floatValue method if possible and fail otherwise. Java arrays are wrapped with a JavaScript object that understands array.length and array[index] A Java boolean is converted to a JavaScript boolean Java byte, char, short, int, long, float, and double are converted to JavaScript numbers Values passed from JavaScript to Java are converted as follows: objects which are wrappers around java objects are unwrapped other objects are wrapped with a JSObject strings, numbers and booleans are converted to String, Float, and Boolean objects respectively 2.1.1 方法索引call(String, Object[]) Calls a JavaScript method. eval(String) Evaluates a JavaScript expression. finalize() Finalization decrements the reference count on the corresponding JavaScript object. getMember(String) Retrieves a named member of a JavaScript object. getSlot(int) Retrieves an indexed member of a JavaScript object. removeMember(String) Removes a named member of a JavaScript object. setMember(String, Object) Sets a named member of a

JavaScript object. setSlot(int, Object) Sets an indexed member of a JavaScript object. toString() Converts a JSObject to a String. 2.1.2 方法getMember public Object getMember(String name)Retrieves a named member of a JavaScript object. Equivalent to "this.name" in JavaScript. getSlot public Object getSlot(int index)Retrieves an indexed member of a JavaScript object. Equivalent to "this[index]" in JavaScript. setMember public void setMember(String name, Object value)Sets a named member of a JavaScript object. Equivalent to "this.name = value" in JavaScript. setSlot public void setSlot(int index, Object value)Sets an indexed member of a JavaScript object. Equivalent to "this[index] = value" in JavaScript. removeMember public void removeMember(String name)Removes a named member of a JavaScript object. call public Object call(String methodName, Object args[])Calls a JavaScript method. Equivalent to "this.methodName(args[0], args, ...)" in JavaScript. eval public Object eval(String s)Evaluates a JavaScript expression. The expression is a string of JavaScript source code which will be evaluated in the context given by "this". toString public String toString()Converts a JSObject to a String. Overrides: toString in class Object finalize protected void finalize()Finalization decrements the reference count on the corresponding JavaScript object. Overrides: finalize in class Object

点击显示

励志和正能量的网站:集青春励志、人生感悟、生活哲理等,融思想性和实用性为一体的海量学习资源共享平台。

励志网 · 浙ICP备12031268号