该教程适用于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.htmluserName的变量,在一开始时没有值。
<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