12.3 在JavaScript中使用Java
利用JavaScript可以把Java语言的小应用程序(applet),插件以及包括表单、超 级链接和图象在内的各种Web元素有机地联系起来。
JavaScript用一个叫做applets的applet对象数组来访问Java的applet。applets数 组是浏览器对象document的一个属性。这个数组中的每一个applet对象都按照它们 在HTML源代码中出现的顺序排列,下标值从0开始。
<applet code="Blink.class" name="Blink" width=300 height=100>
则相应的JavaScript语言中的applet对象既可以使用类似document.applets[0]形 式表示,也可以使用document.Blink来访问,Blink是这个小应用程序的名称。
有一种特殊的情况,在JavaScript中不能通过网络访问Java的属性,也就是说 JavaScript只能调用本地的Java小应用程序中的各种公用变量和属性。这样的设计 是为了保障Java的安全性。
除了可以在JavaScript中访问Java的小应用程序以外,还可以利用JavaScript访问 Java包名字空间的任何一个类。Java语言中提到的类(class)的概念同 JavaScript中的对象概念是一致的。
提示:Java中的各种对象被组织成类,类又被组织成包,包中的子类从它的基类中 继承属性和方法,并加以扩充和改变。
任何一个Java中的类都可以使用一个简单的语法对应一个JavaScript中的对象。例 如: var javaSystem=Java.lang.System;
则JavaScript中的对象javaSystem就对应Java语言中的Java.lang.System对象,从 而直接在JavaScript中访问Java.lang.System中的各种方法和属性。例如可以在 JavaScript中使用 javaSystem.err.println("从JavaScript中调用Java!!"); 来利用Java的方法输出一个字符串。
除了可以直接使用Java提供的类以外,还可以在JavaScript中动态地创建一个Java 类的实例,就好象这个类是JavaScript本身定义的一样。例如可以在JavaScript中 创建一个Java中的Date类: var myNewDate=new Java.util.Date(); 这样创建的myNewDate对象就可以访问所有Java类Date的数据。
通过使用JavaScript的这些直接访问Java类库的功能,就可以大大地扩展 JavaScript的使用范围,使它不再局限在狭小的范围之内,而可以拥有Java语言能 够实现的大多数功能,例如网络访问和复杂的窗口响应等。
例:一个小应用程序 import java.applet.Applet; import java.awt.Graphics; import java.awt.Font;
public class ControlJava extends Applet { Font f=new Font("TimesRoman",Font.BOLD,60); String Text;
public void init() { Text=new String("这是一个Java的小应用程序,可以在JavaScript中控制。"); }
public void SetText(String newText) { Text=newText; repaint(); }
public void paint(Graphics g) { g.setFont(f); g.drawString(Text,15,50); } }
这个小应用程序提供一个叫做SetText()的公共方法,这个方法可以设置这个小应 用程序所显示的文字,下面在JavaScript中使用这个方法来控制Java小应用程序的 输入。
例: <html> <body> <form name="JavaScriptForm"> <input type="Text" name="text1"> <input type="Button" value="出现在Java小应用程序中" onClick="document.Java1.SetNewText(document.JavaScriptForm.text1.value); "> </form>
<applet name="Java1" code="ControlJava.class" width=450 height=125> </applet> </body> </html>
只要在网页中输入一个字符串,JavaScript就负责接受这个字符串。由于Java小应 用程序提供一个公共的接口方法SetNewText(),这个新输入的字符串也就可以被 Java小应用程序所访问到。
Java语言还允许从applet中直接调用JavaScript的方法和访问JavaScript对象的属 性。
由于Java语言本身的安全机制,必须显式地指定让applet访问相对较不安全的 JavaScript代码,这可以通过在<applet>标记中加上MAYSCRIPT属性来实现。例 如: <applet code="some.class" width=java Applet" mayscript>
在Java语言中处理和JavaScript通信的类库是netscape.javaScript.*。这个包定 义了JSObject类和JSException对象。在JavaScript中使用的对象都可以表示成 netscape.javaScript.JSObject的实例。
在Java中准备这个包后,访问一个JavaScript对象的属性可以分两步进行: 创建一个netscape.javaScript.JSObject实例,用来对应JavaScript中的对象; 使用JSObject类的getMember()方法可以访问相应JavaScript中的属性。
提示:如果通过这样的getMember()方法得到的JavaScript属性是一个对象,这样 的操作还可以进行下去。
JavaScript中的各种浏览器和界面对象都是分层的。处于对象从属表最顶层的是浏 览器对象window,再下面是document对象,这个对象可以包容表单以及表单中的界 面对象。每一个下层对象是上层对象的一个属性。所以,按照刚才的方法,可以采 用如下的代码得到JavaScript语言中的一个界面对象: JSObject windowHandle=JSObject.getWindow(this); JSObject documentHandle=(JSObject) windowHandle.getMember("document"); JSObject formHandle=(JSObject) documentHandle.getMember("myform"); JSObject buttonHandle=(JSObject) formHandle.getMember("mybutton"); 在得到这个JavaScript对象后,就可以获得或设定对象的属性。
为了调用JavaScript对象的有关方法,可以采用下面的两种方法之一: 使用JSObject类中的call("methodName",arguments)方法:这个Java方法接受一个 JavaScript对象的方法名称以及必要的参数,自动调用对应JavaScript的对象中的 方法。 使用JSObject类中的eval("expression")方法:这个Java方法接受一个字符串,这 个字符串由JavaScript的命令组成,这个方法自动执行这个字符串中的命令,就好 象这个命令是在JavaScript中的一样。
例:Java程序在代码中访问JavaScript中的window对象的alert()方法 import netscape.javascript.JSObject; import netscape.javascript.JSException;
public class jsAlert extends java.applet.Applet implements Runnable { JSObject windowObject;
public void init() { windowObject=JSObject.getWindow(this); }
public void main() { windowObject.eval("alert(/"Hello, World!/");"); }
public void stop() {}
public void paint() {}
public void run() {} }
12.4 JavaScript的局限性以及未来的展望
这里说的局限性首先是指JavaScript在安全处理上的局限性,其次是指JavaScript 在功能上的局限性。
已经报告的JavaScript安全性缺陷主要有: JavaScript脚本程序可以读取用户计算机上URL的历史信息,并在用户不知道的情 况下把这些信息发送到远方的服务器上。 JavaScript脚本程序可以得到用户计算机硬盘上的文件列表。 JavaScript脚本程序可以在用户不知道的情况下使用用户的E-mail账号发送 E-mail。
由于JavaScript只能在浏览器的小空间中运行,所以除了特别重要的场所以外,一 般使用的用户不必太担心浏览网页中的JavaScript程序会给用户计算机带来怎样的 损失,至少JavaScript程序不能越过浏览器的限制而强行把用户的硬盘格式化掉。 上面提到的一些小的安全性隐患也会在将来的JavaScript发布版本中逐步予以清 除。
JavaScript的第二个局限性体现在功能上: 由于JavaScript只是一种脚本设计语言,在图形和多媒体处理方面的功能非常弱。 若想实现比较完整的媒体操纵功能,目前比较好的解决方法可能是利用Java小应用 程序来补充。 JavaScript是解释执行的,所以执行的速度非常慢,这是所有脚本语言的通病。
|