Java 中文官方教程 2022 版(十一)(4)

简介: Java 中文官方教程 2022 版(十一)

Java 中文官方教程 2022 版(十一)(3)https://developer.aliyun.com/article/1486355

接下来,考虑一个名为DataSummaryApplet的小程序类。DataSummaryApplet类执行以下操作。

  • 调用JSObjectsetMember方法将userName变量设置为"John Doe"。
  • 检索年龄、地址和电话号码,并构建包含这些数据摘要的字符串。
  • 调用writeSummary JavaScript 函数将摘要写回网页。

该小程序首先需要按以下方式检索对JSObject的引用:

...
JSObject window = JSObject.getWindow(this);
...

将前述语句放入 try…catch…块中以处理netscape.javascript.JSException

现在,小程序已经有了对JSObject的引用,它可以通过JSObjectevalcall方法调用相关的 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 事件列表。

  1. 创建一个 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>  
  1. body标签的 onload 方法中调用先前创建的registerAppletStateHandler函数。这样可以确保在注册 applet 的事件处理程序之前,applet 的 HTML 标签已经在网页的文档对象模型(DOM)树中创建。
<body onload="registerAppletStateHandler()">
• 1
• 2
  1. 将 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示例。

相关文章
|
2月前
|
Java 开发工具 Android开发
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
|
4月前
|
Java 开发者 UED
【实战宝典】Java异常处理大师级教程:throws关键字,让异常声明成为你的专属标签!
【实战宝典】Java异常处理大师级教程:throws关键字,让异常声明成为你的专属标签!
63 3
|
25天前
|
安全 Java 编译器
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
|
25天前
|
Java 开发工具 Android开发
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
|
25天前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
Kotlin教程笔记(28) -Kotlin 与 Java 混编
|
11天前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
Kotlin教程笔记(28) -Kotlin 与 Java 混编
10 0
|
2月前
|
JSON Java Maven
实现Java Spring Boot FCM推送教程
本指南介绍了如何在Spring Boot项目中集成Firebase云消息服务(FCM),包括创建项目、添加依赖、配置服务账户密钥、编写推送服务类以及发送消息等步骤,帮助开发者快速实现推送通知功能。
75 2
|
2月前
|
Java 数据库连接 编译器
Kotlin教程笔记(29) -Kotlin 兼容 Java 遇到的最大的“坑”
Kotlin教程笔记(29) -Kotlin 兼容 Java 遇到的最大的“坑”
|
2月前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
本系列教程笔记详细讲解了Kotlin语法,适合希望深入了解Kotlin的开发者。对于需要快速学习Kotlin的小伙伴,推荐查看“简洁”系列教程。本篇笔记重点介绍了Kotlin与Java混编的技巧,包括代码转换、类调用、ProGuard问题、Android库开发建议以及相互调用时的注意事项。
26 3
|
2月前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
Kotlin教程笔记(28) -Kotlin 与 Java 混编
23 3