Java 中文官方教程 2022 版(十一)(3)https://developer.aliyun.com/article/1486355
接下来,考虑一个名为DataSummaryApplet
的小程序类。DataSummaryApplet
类执行以下操作。
- 调用
JSObject
的setMember
方法将userName
变量设置为"John Doe"。 - 检索年龄、地址和电话号码,并构建包含这些数据摘要的字符串。
- 调用
writeSummary
JavaScript 函数将摘要写回网页。
该小程序首先需要按以下方式检索对JSObject
的引用:
... JSObject window = JSObject.getWindow(this); ...
将前述语句放入 try…catch…块中以处理netscape.javascript.JSException
。
现在,小程序已经有了对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 代码,请在类路径中包含<您的 JDK 路径>/jre/lib/plugin.jar
。在运行时,Java 插件软件会自动使这些类对小程序可用。
数据摘要小程序在网页上显示以下结果:
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
以查看数据摘要小程序。
注意: 如果您看不到小程序运行,请安装至少Java SE Development Kit (JDK) 6 update 10版本。
注意: 如果您看不到示例运行,请确保在浏览器中启用 JavaScript 解释器,以便部署工具包脚本能够正常运行。
下载源代码以进一步实验从小程序调用 JavaScript 代码示例。
从 JavaScript 代码调用 Applet 方法
原文:
docs.oracle.com/javase/tutorial/deployment/applet/invokingAppletMethodsFromJavaScript.html
网页上的 JavaScript 代码可以与嵌入在页面上的 Java applet 进行交互。JavaScript 代码可以执行以下操作:
- 调用 Java 对象上的方法
- 获取并设置 Java 对象中的字段
- 获取和设置 Java 数组元素
LiveConnect 规范描述了 JavaScript 代码如何与 Java 代码通信的详细信息。
当 JavaScript 代码调用 Java applet 时,会显示安全警告。要抑制这些警告,需要在 JAR 文件清单中添加Caller-Allowable-Codebase
属性。指定允许调用 applet 的 JavaScript 代码的位置。有关Caller-Allowable-Codebase
属性的信息,请参阅安全的 JAR 文件清单属性。
本主题探讨了使用 Math applet 示例进行 JavaScript 代码到 Java applet 通信。MathApplet
类和支持的Calculator
类提供了一组公共方法和变量。网页上的 JavaScript 代码调用和评估这些公共成员以传递数据并检索计算结果。
Math Applet 和相关类
这是MathApplet
类的源代码。getCalculator
方法返回Calculator
辅助类的引用。
package jstojava; import java.applet.Applet; public class MathApplet extends Applet{ public String userName = null; public String getGreeting() { return "Hello " + userName; } public Calculator getCalculator() { return new Calculator(); } public DateHelper getDateHelper() { return new DateHelper(); } public void printOut(String text) { System.out.println(text); } }
Calculator
类中的方法允许用户设置两个值,相加数字,并在范围内检索数字。
package jstojava; public class Calculator { private int a = 0; private int b = 0; // assume b > a public void setNums(int numA, int numB) { a = numA; b = numB; } public int add() { return a + b; } public int [] getNumInRange() { int x = a; int len = (b - a) + 1; int [] range = new int [len]; for (int i = 0; i < len; i++) { range[i]= x++; System.out.println("i: " + i + " ; range[i]: " + range[i]); } return range; } }
DateHelper
类的getDate
方法返回当前日期。
package jstojava; import java.util.Date; import java.text.SimpleDateFormat; public class DateHelper { public static String label = null; public String getDate() { return label + " " + new SimpleDateFormat().format(new Date()); } }
部署 Applet
在网页中部署 applet,AppletPage.html
。部署 applet 时,请确保为 applet 指定一个 id。稍后将使用 applet id 获取对 applet 对象的引用。
<script src= "https://www.java.com/js/deployJava.js"></script> <script> <!-- applet id can be used to get a reference to the applet object --> var attributes = { id:'mathApplet', code:'jstojava.MathApplet', width:1, height:1} ; var parameters = { jnlp_href: 'math_applet.jnlp'} ; deployJava.runApplet(attributes, parameters, '1.6'); </script>
接下来,在AppletPage.html
网页中添加一些 JavaScript 代码。JavaScript 代码可以使用 applet id 作为对 applet 对象的引用,并调用 applet 的方法。在下面的示例中,JavaScript 代码设置了 applet 的公共成员变量,调用了公共方法,并检索了由 applet 引用的另一个对象(Calculator
)的引用。JavaScript 代码能够处理基本类型、数组和对象返回类型。
<script language="javascript"> function enterNums(){ var numA = prompt('Enter number \'a\'?','0'); var numB = prompt( 'Enter number \'b\' (should be greater than number \'a\' ?','1'); // set applet's public variable mathApplet.userName = "John Doe"; // invoke public applet method var greeting = mathApplet.getGreeting(); // get another class referenced by applet and // invoke its methods var calculator = mathApplet.getCalculator(); calculator.setNums(numA, numB); // primitive datatype returned by applet var sum = calculator.add(); // array returned by applet var numRange = calculator.getNumInRange(); // check Java console log for this message mathApplet.printOut("Testing printing to System.out"); // get another class, set static field and invoke its methods var dateHelper = mathApplet.getDateHelper(); dateHelper.label = "Today\'s date is: "; var dateStr = dateHelper.getDate(); <!-- ... --> </script>
当数字 a = 0 和 b = 5 时,Math applet 在网页上显示以下结果:
Results of JavaScript to Java Communication Hello John Doe a = 0 ; b = 5 Sum: 5 Numbers in range array: [ 0, 1, 2, 3, 4, 5 ] Today's date is: 5/28/13 4:12 PM //*shows current date*
在浏览器中打开AppletPage.html
以查看数学小程序。
注意: 如果您看不到小程序运行,请至少安装Java SE 开发工具包(JDK)6 更新 10版本。
注意: 如果您看不到示例运行,请确保在浏览器中启用 JavaScript 解释器,以便部署工具包脚本能够正常运行。
检查由 JavaScript 代码调用的小程序所受到的安全限制。
下载源代码以进一步进行实验的通过 JavaScript 代码调用小程序方法示例。
使用事件处理程序处理初始化状态
原文:
docs.oracle.com/javase/tutorial/deployment/applet/appletStatus.html
在 applet 初始化之前,applet 无法处理来自网页中 JavaScript 代码的请求。从 JavaScript 代码调用 applet 方法或访问 applet 变量将被阻塞,直到 applet 的init()
方法完成或 applet 首次从部署的网页中调用 JavaScript 代码。由于许多浏览器中 JavaScript 实现是单线程的,因此在 applet 启动期间,网页可能会出现冻结的情况。
从 JDK 7 版本开始,您可以在 applet 加载时检查status
变量,以确定 applet 是否准备好处理来自 JavaScript 代码的请求。您还可以注册事件处理程序,在 applet 初始化的各个阶段自动调用。为了利用这个功能,应该将 applet 部署时的java_status_events
参数设置为"true"
。
在状态和事件处理程序示例中,JavaScript 代码向 applet 注册了一个onLoad
处理程序。当 applet 初始化完成时,Java 插件软件会自动调用onLoad
处理程序。onLoad
处理程序调用 applet 的其他方法,在网页上绘制图形。DrawingApplet
类的init
方法休眠两秒,模拟长时间的 applet 初始化过程。
以下步骤描述了如何注册事件处理程序并检查 applet 的状态。请参阅Applet 状态和事件处理程序,了解可以注册事件处理程序的完整的 applet 状态值和 applet 事件列表。
- 创建一个 JavaScript 函数来注册事件处理程序。以下代码片段显示了
registerAppletStateHandler
函数,如果 applet 尚未加载,则注册一个onLoad
事件处理程序。
<script> <!-- ... --> var READY = 2; function registerAppletStateHandler() { // register onLoad handler if applet has // not loaded yet if (drawApplet.status < READY) { drawApplet.onLoad = onLoadHandler; } else if (drawApplet.status >= READY) { // applet has already loaded or there // was an error document.getElementById("mydiv").innerHTML = "Applet event handler not registered because applet status is: " + drawApplet.status; } } function onLoadHandler() { // event handler for ready state document.getElementById("mydiv").innerHTML = "Applet has loaded"; draw(); } <!-- ... --> </script>
- 在
body
标签的 onload 方法中调用先前创建的registerAppletStateHandler
函数。这样可以确保在注册 applet 的事件处理程序之前,applet 的 HTML 标签已经在网页的文档对象模型(DOM)树中创建。
<body onload="registerAppletStateHandler()"> • 1 • 2
- 将 applet 部署时的
java_status_events
参数设置为"true"
。
<script src= "https://www.java.com/js/deployJava.js"></script> <script> // set java_status_events parameter to true var attributes = { id:'drawApplet', code:'DrawingApplet.class', archive: 'applet_StatusAndCallback.jar', width:600, height:400} ; var parameters = {java_status_events: 'true', permissions:'sandbox' } ; deployJava.runApplet(attributes, parameters, '1.7'); </script>
在浏览器中打开AppletPage.html
以查看 applet 事件处理程序的行为。在AppletPageUpdatedDuringLoading.html
页面中,检查 applet 的status
变量以确定 applet 是否已加载。根据状态,当 applet 被加载时,网页会持续更新。
注意: 如果您看不到 applet 运行,请安装至少 Java SE Development Kit (JDK) 7 版本。
注意: 如果您看不到示例运行,您可能需要在浏览器中启用 JavaScript 解释器,以便 Deployment Toolkit 脚本能够正常运行。
下载源代码 以进一步进行实验的 状态和事件处理程序 示例。
操作小程序网页的 DOM
原文:
docs.oracle.com/javase/tutorial/deployment/applet/manipulatingDOMFromApplet.html
每个网页由一系列嵌套对象组成。这些对象构成了文档对象模型(DOM)。Java 小程序可以使用Common DOM API
遍历和修改其父网页的对象。
考虑一个 Java 小程序的示例,它会转储其父网页的内容。
为了遍历和操作 DOM 树,您必须首先获取网页的Document
对象的引用。您可以使用com.sun.java.browser.plugin2.DOM
类中的getDocument
方法来实现。以下是在DOMDump
小程序的start
方法中检索Document
对象引用的代码片段。请查看代码中的内联注释。
public void start() { try { // use reflection to get document Class c = Class.forName("com.sun.java.browser.plugin2.DOM"); Method m = c.getMethod("getDocument", new Class[] { java.applet.Applet.class }); // cast object returned as HTMLDocument; // then traverse or modify DOM HTMLDocument doc = (HTMLDocument) m.invoke(null, new Object[] { this }); HTMLBodyElement body = (HTMLBodyElement) doc.getBody(); dump(body, INDENT); } catch (Exception e) { System.out.println("New Java Plug-In not available"); // In this case, you could fallback to the old // bootstrapping mechanism available in the // com.sun.java.browser.plugin.dom package } }
现在您已经获得了Document
对象的引用,您可以使用 Common DOM API 遍历和修改 DOM 树。DOMDump
小程序遍历 DOM 树并将其内容写入 Java 控制台日志。
private void dump(Node root, String prefix) { if (root instanceof Element) { System.out.println(prefix + ((Element) root).getTagName() + " / " + root.getClass().getName()); } else if (root instanceof CharacterData) { String data = ((CharacterData) root).getData().trim(); if (!data.equals("")) { System.out.println(prefix + "CharacterData: " + data); } } else { System.out.println(prefix + root.getClass().getName()); } NamedNodeMap attrs = root.getAttributes(); if (attrs != null) { int len = attrs.getLength(); for (int i = 0; i < len; i++) { Node attr = attrs.item(i); System.out.print(prefix + HALF_INDENT + "attribute " + i + ": " + attr.getNodeName()); if (attr instanceof Attr) { System.out.print(" = " + ((Attr) attr).getValue()); } System.out.println(); } } if (root.hasChildNodes()) { NodeList children = root.getChildNodes(); if (children != null) { int len = children.getLength(); for (int i = 0; i < len; i++) { dump(children.item(i), prefix + INDENT); } } } }
在浏览器中打开AppletPage.html
以查看DOMDump
小程序的运行情况。检查 Java 控制台日志以获取网页 DOM 树的转储。
注意: 如果您看不到小程序运行,请至少安装Java SE Development Kit (JDK) 6 update 10版本。
注意: 如果您看不到示例运行,您可能需要在浏览器中启用 JavaScript 解释器,以便 Deployment Toolkit 脚本能够正常运行。
下载源代码以进一步进行实验的DOM Dump示例。