从 Servlets 调用 JavaScript 代码
Java applet 可以调用与 applet 在同一网页中的 JavaScript 函数。 LiveConnect Specification描述了有关 JavaScript 代码与 Java 代码如何通信的详细信息。
netscape.javascript.JSObject
类使 Java applet 能够检索对 JavaScript 对象的引用并与网页进行交互。接下来描述的数据摘要 Servlets 调用 JavaScript 代码从网页中检索信息,并将数据摘要写回到网页中。
假设您有一个带有一些 JavaScript 函数的网页。示例AppletPage.html具有 JavaScript 函数来检索年龄,地址和电话 Numbers。还有一个名为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 = "";
// returns number
function getAge() {
return 25;
}
// returns an object
function address() {
this.street = "1 Example Lane";
this.city = "Santa Clara";
this.state = "CA";
}
// returns an array
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"/> // this HTML element contains
// the summary
<!-- ... -->
</body>
接下来,考虑一个名为DataSummaryApplet
的 Servlets 类。 DataSummaryApplet
类执行以下操作。
-
调用
JSObject
的setMember
方法将userName
变量设置为“ John Doe”。 -
检索年龄,地址和电话 Numbers,并构建一个包含此数据摘要的字符串。
-
调用
writeSummary
JavaScript 函数将摘要写回到网页。
该小应用程序首先需要检索对JSObject
的引用,如下所示:
...
JSObject window = JSObject.getWindow(this);
...
将前面的语句放在 try ... catch ..块中以处理netscape.javascript.JSException
。
现在,Servlets 已经引用了JSObject
,它可以通过使用JSObject
的eval
和call
方法来调用相关的 JavaScript 函数。
package javatojs;
import java.applet.Applet;
import netscape.javascript.*; // add plugin.jar to classpath during compilation
public class DataSummaryApplet extends Applet {
public void start() {
try {
JSObject window = JSObject.getWindow(this);
String userName = "John Doe";
// set JavaScript variable
window.setMember("userName", userName);
// invoke JavaScript function
Number age = (Number) window.eval("getAge()");
// get a JavaScript object and retrieve its contents
JSObject address = (JSObject) window.eval("new address();");
String addressStr = (String) address.getMember("street") + ", " +
(String) address.getMember("city") + ", " +
(String) address.getMember("state");
// get an array from JavaScript and retrieve its contents
JSObject phoneNums = (JSObject) window.eval("getPhoneNums()");
String phoneNumStr = (String) phoneNums.getSlot(0) + ", " +
(String) phoneNums.getSlot(1);
// dynamically change HTML in page; write data summary
String summary = userName + " : " + age + " : " +
addressStr + " : " + phoneNumStr;
window.call("writeSummary", new Object[] {summary}) ;
} catch (JSException jse) {
jse.printStackTrace();
}
}
}
要编译引用了netscape.javascript
包中的类的 Java 代码,请在 Classpath 中包含<your JDK path>/jre/lib/plugin.jar
。在运行时,Java 插件软件会自动将这些类提供给 applet。
数据摘要 Servlets 在网页上显示以下结果:
Result of applet's Java calls to JavaScript on this page
John Doe : 25 : 1 Example Lane, Santa Clara, CA : 408-555-0100, 408-555-0102
在浏览器中打开AppletPage.html以查看“数据摘要”Servlets。
Note:
如果看不到 Servlets 正在运行,则需要至少安装Java SE 开发套件(JDK)6 更新 10版本。
Note:
如果看不到示例正在运行,则可能需要在浏览器中启用 JavaScript 解释器,以便 Deployment Toolkit 脚本能够正常运行。
下载源代码用于“从 Applet 调用 JavaScript 代码”示例,以进行进一步的实验。