该教程适用于JDK 8。本页面中描述的示例和实践不会利用后续版本中引入的改进,并且可能使用不再可用的技术。
请参阅Java语言变更,了解Java SE 9及后续版本中更新的语言特性的摘要。
请参阅JDK发布说明,了解所有JDK版本的新功能、增强功能以及已删除或弃用选项的信息。
Java applets可以调用与applet相同网页中的JavaScript函数。 LiveConnect规范描述了JavaScript代码如何与Java代码进行通信的详细信息。
netscape.javascript.JSObject
类使Java applets能够获取对JavaScript对象的引用并与网页进行交互。下面描述的Data Summary applet调用JavaScript代码从网页中检索信息,并将数据摘要写回到网页。
假设您有一个带有几个JavaScript函数的网页。例子
有用于检索年龄、地址和电话号码的JavaScript函数。还有一个名为AppletPage.html
userName
的变量,在一开始时没有值。
<head> <title>Data Summary Applet Page - Java to JavaScript LiveConnect</title> <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"/> <script language="javascript"> var userName = ""; // 返回数字 function getAge() { return 25; } // 返回对象 function address() { this.street = "1 Example Lane"; this.city = "Santa Clara"; this.state = "CA"; } // 返回数组 function getPhoneNums() { return ["408-555-0100", "408-555-0102"]; } function writeSummary(summary) { summaryElem = document.getElementById("summary"); summaryElem.innerHTML = summary; } </script> <!-- ... --> </head> <body> <script src = "https://www.java.com/js/deployJava.js"></script> <script> <!-- ... --> deployJava.runApplet(attributes, parameters, '1.6'); </script> <!-- ... --> <p id="summary"/> // 这个HTML元素包含 // 数据摘要 <!-- ... --> </body>
接下来,考虑一个名为DataSummaryApplet
的applet类。 DataSummaryApplet
类执行以下操作:
JSObject
的setMember
方法将userName
变量设置为"John Doe"。writeSummary
JavaScript函数将摘要写回到网页。此applet首先需要检索对JSObject
的引用,如下所示:
... JSObject window = JSObject.getWindow(this); ...
将上述语句放入try...catch...块中来处理netscape.javascript.JSException
异常。
现在,applet已经有了对JSObject
的引用,可以使用JSObject
的eval
和call
方法来调用相关的JavaScript函数。
package javatojs; import java.applet.Applet; import netscape.javascript.*; // 在编译时将plugin.jar添加到类路径中 public class DataSummaryApplet extends Applet { public void start() { try { JSObject window = JSObject.getWindow(this); String userName = "John Doe"; // 设置JavaScript变量 window.setMember("userName", userName); // 调用JavaScript函数 Number age = (Number) window.eval("getAge()"); // 获取JavaScript对象并检索其内容 JSObject address = (JSObject) window.eval("new address();"); String addressStr = (String) address.getMember("street") + ", " + (String) address.getMember("city") + ", " + (String) address.getMember("state"); // 从JavaScript获取数组并检索其内容 JSObject phoneNums = (JSObject) window.eval("getPhoneNums()"); String phoneNumStr = (String) phoneNums.getSlot(0) + ", " + (String) phoneNums.getSlot(1); // 动态更改页面中的HTML;写入数据摘要 String summary = userName + " : " + age + " : " + addressStr + " : " + phoneNumStr; window.call("writeSummary", new Object[] {summary}) ; } catch (JSException jse) { jse.printStackTrace(); } } }
要编译引用了netscape.javascript
包中类的Java代码,请在类路径中包含<您的JDK路径>/jre/lib/plugin.jar
。在运行时,Java插件软件会自动将这些类提供给applet使用。
Data Summary applet在网页上显示以下结果:
applet对此页面上的JavaScript的Java调用的结果 John Doe : 25 : 1 Example Lane, Santa Clara, CA : 408-555-0100, 408-555-0102
在浏览器中打开
以查看Data Summary applet。AppletPage.html