Java 中文官方教程 2022 版(十二)(1)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Java 中文官方教程 2022 版(十二)

将诊断信息写入标准输出和错误流

原文:docs.oracle.com/javase/tutorial/deployment/applet/stdout.html

一个 Java 小程序可以将消息写入标准输出和标准错误流。在调试 Java 小程序时,将诊断信息写入标准输出可以是一个非常有价值的工具。

以下代码片段将消息写入标准输出流和标准错误流。

*// Where instance variables are declared:*
boolean DEBUG = true;
// ...
*// Later, when we want to print some status:*
if (DEBUG) {
    try {
        // ...
        //some code that throws an exception
        System.out.
            println("Called someMethod(" + x + "," + y + ")");
    } catch (Exception e) {
        e.printStackTrace()
    }
}

检查 Java 控制台日志,查看写入标准输出流或标准错误流的消息。要将消息存储在日志文件中,请在 Java 控制面板中启用日志记录。消息将被写入用户主目录中的日志文件(例如,在 Windows 上,日志文件可能位于C:\Documents and Settings\someuser\Application Data\Sun\Java\Deployment\log)。


注意: 在发布小程序之前,请务必禁用所有调试输出。


开发可拖动的小程序

原文:docs.oracle.com/javase/tutorial/deployment/applet/draggableApplet.html

通过指定draggable参数部署的 Java 小程序可以在浏览器之外拖动,并动态转换为 Java Web Start 应用程序。可以通过按下 Alt 键和左鼠标按钮并拖动鼠标来拖动 Java 小程序。拖动操作开始时,小程序将从其父容器(AppletJApplet)中移除,并放置在一个新的无装饰顶级窗口(FrameJFrame)中。拖动的小程序旁边会显示一个小浮动关闭按钮。单击浮动关闭按钮后,小程序将放回浏览器中。可以拖出浏览器的 Java 小程序将从此被称为可拖动小程序

您可以通过以下方式自定义可拖动小程序的行为:

  • 您可以更改用于将小程序拖出浏览器的按键和鼠标按钮序列。
  • 您可以添加一个桌面快捷方式,用于在浏览器之外启动应用程序。
  • 您可以定义小程序在拖出浏览器后应如何关闭。

以下部分描述了如何实现和自定义可拖动小程序。MenuChooserApplet 类用于演示可拖动小程序的开发和部署。在浏览器中打开AppletPage.html以在新页面上查看菜单选择器小程序。


注意: 如果您看不到小程序运行,请至少安装Java SE Development Kit (JDK) 6 update 10版本。



注意: 如果您看不到示例运行,请确保在浏览器中启用 JavaScript 解释器,以便部署工具包脚本能够正常运行。


启用拖动小程序的功能

您可以通过在部署小程序时将draggable参数设置为true来启用拖动小程序的功能,如下面的代码片段所示:

<script src="https://www.java.com/js/deployJava.js"></script>
<script>
    var attributes = { code:'MenuChooserApplet', width:900, height:300 };
    var parameters = { jnlp_href: 'draggableapplet.jnlp', draggable: 'true' };
    deployJava.runApplet(attributes, parameters, '1.6');
</script>

更改用于拖动小程序的按键和鼠标按钮序列

您可以通过实现isAppletDragStart方法来更改用于拖动小程序的按键和鼠标按钮序列。在以下代码片段中,可以通过按下左鼠标按钮并拖动鼠标来拖动小程序:

public boolean isAppletDragStart(MouseEvent e) {
        if(e.getID() == MouseEvent.MOUSE_DRAGGED) {
            return true;
        } else {
            return false;
        }
    }

当小程序与浏览器断开连接时,可以添加桌面快捷方式

如果用户在将 applet 拖出页面后关闭浏览器窗口或离开页面,就说 applet 与浏览器断开连接。当 applet 与浏览器断开连接时,您可以为 applet 创建桌面快捷方式。桌面快捷方式可用于在浏览器之外启动应用程序。要启用桌面快捷方式的创建,请将 offline-allowedshortcut 标签添加到 applet 的 Java 网络启动协议(JNLP)文件中。

<information>
    <!-- ... -->
    <offline-allowed />
    <shortcut online="false">
        <desktop />
    </shortcut>
</information>

注意: 根据用户 Java 控制面板中的快捷方式创建设置,用户可能会在创建快捷方式之前收到确认提示。


定义 Applet 如何关闭

您可以定义您的 applet 如何关闭。例如,您的 Swing applet 可以有一个 JButton 来关闭 applet,而不是依赖默认的浮动 Close 按钮。

Java 插件软件为 applet 提供了 ActionListener 类的实例。这个 ActionListener 类的实例,也称为关闭监听器,可用于修改 applet 的默认关闭行为。

要定义 applet 如何关闭,请在您的 applet 中实现 setAppletCloseListenerappletRestored 方法。

在以下代码片段中,MenuChooserApplet 类接收关闭监听器并将其传递给 MenuItemChooser 类的实例:

MenuItemChooser display = null;
// ...
display = new MenuItemChooser();
// ...
public void setAppletCloseListener(ActionListener cl) {
    display.setCloseListener(cl);
}
public void appletRestored() {
    display.setCloseListener(null);
}

MenuItemChooser 类负责控制 applet 的用户界面。MenuItemChooser 类定义了一个标记为“Close”的 JButton。当用户点击此 Close 按钮时,将执行以下代码:

private void close() {
    // invoke actionPerformed of closeListener received
    // from the Java Plug-in software.
    if (closeListener != null) {
        closeListener.actionPerformed(null);
    }
}

请求和自定义 Applet 装饰

从 Java SE 7 发行版开始,在部署 applet 时,您可以指定拖动 applet 窗口应该使用默认或自定义窗口标题进行装饰。

要启用拖动 applet 的窗口装饰,请使用值为"true"java_decorated_frame 参数。还要指定 java_applet_title 参数以启用自定义窗口标题。此参数的值应为窗口标题的文本。

<script src="https://www.java.com/js/deployJava.js"></script>
<script>
    var attributes =
      { code:'SomeDraggableApplet', width:100, height:100 };
    var parameters =
      { jnlp_href: 'somedraggableapplet.jnlp', 
          java_decorated_frame: 'true',
          java_applet_title: 'A Custom Title'   
      };
    deployJava.runApplet(attributes, parameters, '1.7');
</script>

java_decorated_framejava_applet_title 参数也可以在 applet 的 JNLP 文件中指定,如下面的代码片段所示:

<applet-desc main-class="SayHello" name="main test" height="150" width="300">
    <param name="java_decorated_frame" value="true" />
    <param name="java_applet_title" value="" />
</applet-desc>

下载源代码以进一步实验可拖动 Applet示例。

与其他小程序通信

原文:docs.oracle.com/javase/tutorial/deployment/applet/iac.html

一个 Java 小程序可以通过在父网页中使用 JavaScript 函数与其他 Java 小程序通信。JavaScript 函数通过接收来自一个小程序的消息并调用其他小程序的方法来实现小程序之间的通信。有关 Java 代码与 JavaScript 代码交互的更多信息,请参阅以下主题:

  • 从小程序调用 JavaScript 代码
  • 从 JavaScript 代码调用小程序方法

您应避免使用以下机制来查找其他小程序并在小程序之间共享数据:

  • 避免使用静态变量在小程序之间共享数据。
  • 不要使用AppletContext类的getAppletgetApplets方法来查找其他小程序。这些方法只能找到在同一 Java 运行时环境软件实例中运行的小程序。

小程序必须来自服务器上的同一目录,以便彼此通信。

发送器和接收器小程序如下所示。当用户点击按钮增加计数器时,发送器小程序调用 JavaScript 函数向接收器小程序发送请求。接收器小程序在接收请求后增加一个计数器变量并显示变量的值。

//

发送器小程序

//

接收器小程序

//


注意: 如果您看不到小程序运行,请至少安装Java SE Development Kit (JDK) 6 update 10版本。



注意: 如果您看不到示例运行,请确保在浏览器中启用 JavaScript 解释器,以便部署工具包脚本能够正常运行。


要启用与另一个小程序的通信,获取 netscape.javascript.JSObject 类的实例的引用。使用此实例调用 JavaScript 函数。Sender 小程序使用 netscape.javascript.JSObject 类的实例来调用名为 sendMsgToIncrementCounter 的 JavaScript 函数。

try {
    JSObject window = JSObject.getWindow(this);
    window.eval("sendMsgToIncrementCounter()");
} catch (JSException jse) {
    // ...
}

注意: 要编译具有对 netscape.javascript 包中类的引用的 Java 代码,请在类路径中包含 /jre/lib/plugin.jar。在运行时,Java 插件软件会自动使这些类对小程序可用。


编写 JavaScript 函数,该函数将接收来自一个小程序的请求,并调用网页上另一个小程序的方法。sendMsgToIncrementCounter JavaScript 函数调用接收器小程序的 incrementCounter 方法。

<script>
    function sendMsgToIncrementCounter() {
        var myReceiver = document.getElementById("receiver");
        myReceiver.incrementCounter();
    } 
<script>

请注意,JavaScript 代码使用名称 receiver 来获取网页上接收器小程序的引用。此名称应与部署接收器小程序时指定的 id 属性的值相同。

下面显示了 Receiver 小程序的 incrementCounter 方法。

public void incrementCounter() {
    ctr++;
    String text = " Current Value Of Counter: "
        + (new Integer(ctr)).toString();
    ctrLbl.setText(text);
}

部署小程序在网页上,如下面的代码片段所示。您可以在 AppletPage.html 中查看发送器和接收器小程序以及相关的 JavaScript 代码。

<!-- Sender Applet -->
<script src="https://www.java.com/js/deployJava.js"></script>
<script> 
    var attributes = { code:'Sender.class',
        archive:'examples/dist/applet_SenderReceiver/applet_SenderReceiver.jar',
        width:300, height:50} ;
    var parameters = { permissions:'sandbox' };
    deployJava.runApplet(attributes, parameters, '1.6');
</script>
<!-- Receiver Applet -->
<script> 
    var attributes = { id:'receiver', code:'Receiver.class',
        archive:'examples/dist/applet_SenderReceiver/applet_SenderReceiver.jar',
        width:300, height:50} ;
    var parameters = { permissions:'sandbox' };
    deployJava.runApplet(attributes, parameters, '1.6');
</script>

下载源代码 以进一步进行实验的 发送器接收器小程序 示例。

与服务器端应用程序一起工作

原文:docs.oracle.com/javase/tutorial/deployment/applet/server.html

Java 小程序与其他 Java 程序一样,可以使用java.net包中定义的 API 在网络上进行通信。Java 小程序可以与在与小程序相同主机上运行的服务器应用程序进行通信。这种通信不需要服务器上的任何特殊设置。


**注意:**根据小程序加载到的网络环境以及运行小程序的浏览器,小程序可能无法与其来源主机通信。例如,在防火墙内部主机上运行的浏览器通常无法获取有关防火墙外部世界的许多信息。因此,一些浏览器可能不允许小程序与防火墙外部主机通信。


当小程序部署到 Web 服务器时,请使用AppletgetCodeBase方法和java.net.URLgetHost方法来确定小程序来自哪个主机,如下所示:

String host = getCodeBase().getHost();

如果小程序部署在本地,getCodeBase方法将返回 null。建议使用 Web 服务器。

在获得正确的主机名后,您可以使用自定义网络教程中记录的所有网络代码。


**注意:**并非所有浏览器都完美支持所有网络代码。例如,一个与 Java 技术兼容的广泛使用的浏览器不支持向 URL 发布内容。


有关实现作为网络客户端的小程序的示例,请参见网络客户端小程序示例。

网络客户端小程序示例

原文:docs.oracle.com/javase/tutorial/deployment/applet/clientExample.html

QuoteClientApplet类允许您从与此小程序运行在同一主机上的服务器端应用程序中获取引语。该类还显示从服务器收到的引语。

QuoteServer.javaQuoteServerThread.java类构成返回引语的服务器端应用程序。这里有一个文本文件(one-liners.txt),其中包含许多引语。

执行以下步骤来测试QuoteClientApplet

  1. 下载并保存以下文件到您的本地计算机。
  • QuoteClientApplet
  • QuoteServer.java
  • QuoteServerThread.java
  • one-liners.txt
  • quoteApplet.html
  1. 在网页中包含以下 HTML 代码以部署QuoteClientApplet
<script src=
  "https://www.java.com/js/deployJava.js"></script>
<script> 
    var attributes =
      { code:'QuoteClientApplet.class',  width:500, height:100} ; 
    var parameters =
      { codebase_lookup:'true', permissions:'sandbox' };
    deployJava.runApplet(attributes, parameters, '1.6'); 
</script>
  1. 或者,您可以使用已包含此 HTML 代码的quoteApplet.html页面。
  2. 编译QuoteClientApplet.java类。将生成的类文件复制到保存网页的相同目录中。
  3. 编译服务器端应用程序的类,QuoteServer.javaQuoteServerThread.java
  4. 将文件one-liners.txt复制到具有服务器端应用程序类文件(在上一步生成)的目录中。
  5. 启动服务器端应用程序。
java QuoteServer
  1. 您应该看到一个带有端口号的消息,如下例所示。请注意端口号。
QuoteServer listening on port:3862
  1. 在浏览器中打开包含小程序的网页,输入网页的 URL。URL 中的主机名应与运行服务器端应用程序的主机名相同。
    例如,如果服务器端应用程序在名为JohnDoeMachine的计算机上运行,则应输入类似的 URL。确切的端口号和路径将根据您的 Web 服务器设置而变化。
http://JohnDoeMachine:8080/quoteApplet/quoteApplet.html
  1. QuoteClientApplet将显示在网页上。
  2. 在小程序的文本字段中输入服务器端应用程序的端口号,然后单击“确定”。将显示一个引语。

这是小程序运行时的屏幕截图。

QuoteServer示例输出

小程序可以和不能做什么

原文:docs.oracle.com/javase/tutorial/deployment/applet/security.html

当用户访问包含小程序的页面时,Java 小程序将加载到客户端。Java 小程序背后的安全模型旨在保护用户免受恶意小程序的侵害。

小程序可以是沙箱小程序或特权小程序。沙箱小程序在仅允许一组安全操作的安全沙箱中运行。特权小程序可以在安全沙箱之外运行,并具有广泛的访问客户端的能力。

未签名的小程序受限于安全沙箱,仅在用户接受小程序时才运行。由认可的证书颁发机构签名的小程序可以在安全沙箱中运行,或者可以请求权限在安全沙箱之外运行。在任何情况下,用户必须接受小程序的安全证书,否则小程序将被阻止运行。

建议您使用 Java 网络启动协议(JNLP)启动您的小程序,以利用扩展功能并改善用户体验。有关逐步说明小程序部署的详细信息,请参阅部署小程序。

建议您将您的小程序部署到 Web 服务器上,即使是用于测试。要在本地运行小程序,请将小程序添加到例外站点列表中,该列表可以从 Java 控制面板的安全选项卡中管理。

在本主题中,我们将讨论小程序的安全限制和功能。

沙箱小程序

沙箱小程序受限于安全沙箱,可以执行以下操作:

  • 它们可以与它们来自的主机和端口建立网络连接。协议必须匹配,如果使用域名加载小程序,则必须使用域名连接回主机,而不是 IP 地址。
  • 使用java.applet.AppletContext类的showDocument方法,它们可以轻松显示 HTML 文档。
  • 它们可以调用同一页面上其他小程序的公共方法。
  • 从本地文件系统(用户的CLASSPATH中的目录)加载的小程序没有网络加载的小程序所具有的任何限制。
  • 它们可以读取安全系统属性。有关安全系统属性列表,请参阅 System Properties。
  • 使用 JNLP 启动时,沙箱小程序还可以执行以下操作:
  • 它们可以在客户端打开、读取和保存文件。
  • 它们可以访问共享的系统剪贴板。
  • 它们可以访问打印功能。
  • 它们可以在客户端存储数据,决定如何下载和缓存小程序等。有关使用 JNLP API 开发小程序的更多信息,请参阅 JNLP API。

沙箱小程序无法执行以下操作:

  • 他们无法访问客户端资源,如本地文件系统、可执行文件、系统剪贴板和打印机。
  • 他们无法连接或从任何第三方服务器检索资源(任何不同于其来源服务器的服务器)。
  • 他们无法加载本地库。
  • 他们无法更改 SecurityManager。
  • 他们无法创建一个 ClassLoader。
  • 他们无法读取某些系统属性。请参见系统属性以获取被禁止的系统属性列表。

特权小程序

特权小程序不受强制执行在沙盒小程序上的安全限制,可以在安全沙箱之外运行。


注意: JavaScript 代码被视为未签名代码。当特权小程序从 HTML 页面中的 JavaScript 代码访问时,该小程序在安全沙箱内执行。这意味着特权小程序基本上表现得像一个沙盒小程序。


参见富互联网应用程序中的安全性以了解如何处理小程序。

附加信息

有关小程序安全性警告框的更多信息,请参见探索安全警告功能(oracle.com/technetwork 上的文章)

Java 中文官方教程 2022 版(十二)(2)https://developer.aliyun.com/article/1486358

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
11天前
|
Java 开发工具 Android开发
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
|
2月前
|
Java 开发者 UED
【实战宝典】Java异常处理大师级教程:throws关键字,让异常声明成为你的专属标签!
【实战宝典】Java异常处理大师级教程:throws关键字,让异常声明成为你的专属标签!
48 3
|
5天前
|
Java 数据库连接 编译器
Kotlin教程笔记(29) -Kotlin 兼容 Java 遇到的最大的“坑”
Kotlin教程笔记(29) -Kotlin 兼容 Java 遇到的最大的“坑”
|
8天前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
本系列教程笔记详细讲解了Kotlin语法,适合希望深入了解Kotlin的开发者。对于需要快速学习Kotlin的小伙伴,推荐查看“简洁”系列教程。本篇笔记重点介绍了Kotlin与Java混编的技巧,包括代码转换、类调用、ProGuard问题、Android库开发建议以及相互调用时的注意事项。
14 3
|
10天前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
Kotlin教程笔记(28) -Kotlin 与 Java 混编
18 3
|
11天前
|
安全 Java 编译器
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
|
17天前
|
消息中间件 存储 JSON
rabbitmq基础教程(ui,java,springamqp)
本文提供了RabbitMQ的基础教程,包括如何使用UI创建队列和交换机、Java代码操作RabbitMQ、Spring AMQP进行消息发送和接收,以及如何使用不同的交换机类型(fanout、direct、topic)进行消息路由。
13 0
rabbitmq基础教程(ui,java,springamqp)
|
18天前
|
存储 前端开发 Java
Java后端如何进行文件上传和下载 —— 本地版(文末配绝对能用的源码,超详细,超好用,一看就懂,博主在线解答) 文件如何预览和下载?(超简单教程)
本文详细介绍了在Java后端进行文件上传和下载的实现方法,包括文件上传保存到本地的完整流程、文件下载的代码实现,以及如何处理文件预览、下载大小限制和运行失败的问题,并提供了完整的代码示例。
117 1
|
9天前
|
安全 Java 编译器
Kotlin教程笔记(27) -Kotlin 与 Java 共存(2)
Kotlin教程笔记(27) -Kotlin 与 Java 共存(2)
|
9天前
|
Java 开发工具 Android开发
Kotlin教程笔记(26) -Kotlin 与 Java 共存(1)
Kotlin教程笔记(26) -Kotlin 与 Java 共存(1)