Java 中文官方教程 2022 版(十二)(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日志并进行多维度分析。
相关文章
|
9天前
|
Java 测试技术 Python
《手把手教你》系列技巧篇(二十九)-java+ selenium自动化测试- Actions的相关操作上篇(详解教程)
【4月更文挑战第21天】本文介绍了Selenium中处理特殊测试场景的方法,如鼠标悬停。Selenium的Actions类提供了鼠标悬停功能,用于模拟用户在网页元素上的悬停行为。文中通过实例展示了如何使用Actions悬停并展开下拉菜单,以及在搜索时选择自动补全的字段。代码示例包括了打开百度首页,悬停在“更多”元素上显示下拉菜单并点击“音乐”,以及在搜索框输入关键词并自动补全的过程。
33 0
|
2天前
|
Java 测试技术 Python
《手把手教你》系列技巧篇(三十六)-java+ selenium自动化测试-单选和多选按钮操作-番外篇(详解教程)
【4月更文挑战第28天】本文简要介绍了自动化测试的实战应用,通过一个在线问卷调查(&lt;https://www.sojump.com/m/2792226.aspx/&gt;)为例,展示了如何遍历并点击问卷中的选项。测试思路包括找到单选和多选按钮的共性以定位元素,然后使用for循环进行点击操作。代码设计方面,提供了Java+Selenium的示例代码,通过WebDriver实现自动答题。运行代码后,可以看到控制台输出和浏览器的相应动作。文章最后做了简单的小结,强调了本次实践是对之前单选多选操作的巩固。
10 0
|
2天前
|
Java 测试技术 项目管理
Java基础教程(22)-构建工具Maven的基本使用
【4月更文挑战第22天】Maven是Java项目管理及构建工具,简化构建、测试、打包和部署等任务。遵循约定优于配置原则,核心是`pom.xml`配置文件,用于管理依赖和项目信息。安装涉及下载、解压、配置环境变量。在IDEA中使用Maven创建项目,通过`pom.xml`添加依赖和管理版本。常用命令包括`clean`、`compile`、`test`、`package`、`install`和`deploy`。IDEA支持直接执行这些命令。
|
2天前
|
NoSQL Java 关系型数据库
Java基础教程(21)-Java连接MongoDB
【4月更文挑战第21天】MongoDB是开源的NoSQL数据库,强调高性能和灵活性。Java应用通过MongoDB Java驱动与之交互,涉及MongoClient、MongoDatabase、MongoCollection和Document等组件。连接MongoDB的步骤包括:配置连接字符串、创建MongoClient、选择数据库和集合。伪代码示例展示了如何建立连接、插入和查询数据。
|
3天前
|
存储 前端开发 测试技术
《手把手教你》系列技巧篇(三十五)-java+ selenium自动化测试-单选和多选按钮操作-下篇(详解教程)
【4月更文挑战第27天】本文介绍了使用Java+Selenium进行Web自动化测试时,如何遍历和操作多选按钮的方法。文章分为两个部分,首先是一个本地HTML页面的示例,展示了多选按钮的HTML代码和页面效果,并详细解释了遍历多选按钮的思路:找到所有多选按钮的共同点,通过定位这些元素并放入list容器中,然后使用for循环遍历并操作。 第二部分介绍了在JQueryUI网站上的实战,给出了被测网址,展示了代码设计,同样使用了findElements()方法获取所有多选按钮并存储到list中,然后遍历并进行点击操作。最后,文章对整个过程进行了小结,并推荐了作者的其他自动化测试教程资源。
11 0
|
3天前
|
Java 关系型数据库 MySQL
Java基础教程(20)-Java连接mysql数据库CURD
【4月更文挑战第19天】MySQL是流行的关系型数据库管理系统,支持SQL语法。在IDEA中加载jar包到项目类路径:右击项目,选择“Open Module Settings”,添加库文件。使用JDBC连接MySQL,首先下载JDBC驱动,然后通过`Class.forName()`加载驱动,`DriverManager.getConnection()`建立连接。执行CRUD操作,例如创建表、插入数据和查询,使用`Statement`或`PreparedStatement`,并确保正确关闭数据库资源。
|
4天前
|
设计模式 算法 Java
Java基础教程(19)-设计模式简述
【4月更文挑战第19天】设计模式是软件设计中反复使用的代码设计经验,旨在提升代码的可重用性、可扩展性和可维护性。23种模式分为创建型、结构型和行为型三类。创建型模式如工厂方法、抽象工厂、建造者、原型和单例,关注对象创建与使用的分离。结构型模式涉及对象组合,如适配器、装饰器、外观等,增强结构灵活性。行为型模式专注于对象间职责分配和算法合作,包括责任链、命令、观察者等。设计模式提供标准化解决方案,促进代码交流和复用。
|
5天前
|
前端开发 测试技术 Python
《手把手教你》系列技巧篇(三十三)-java+ selenium自动化测试-单选和多选按钮操作-上篇(详解教程)
【4月更文挑战第25天】本文介绍了自动化测试中如何处理单选和多选按钮的操作,包括它们的定义、HTML代码示例以及如何判断和操作这些元素。文章通过一个简单的HTML页面展示了单选和多选框的示例,并提供了Java+Selenium实现的代码示例,演示了如何检查单选框是否选中以及如何进行全选操作。
11 0
|
5天前
|
网络协议 Java 网络架构
Java基础教程(18)-Java中的网络编程
【4月更文挑战第18天】Java网络编程简化了底层协议处理,利用Java标准库接口进行TCP/IP通信。TCP协议提供可靠传输,常用于HTTP、SMTP等协议;UDP协议则更高效但不保证可靠性。在TCP编程中,ServerSocket用于监听客户端连接,Socket实现双进程间通信。UDP编程中,DatagramSocket处理无连接的数据报文。HTTP编程可以通过HttpURLConnection发送请求并接收响应。
|
6天前
|
前端开发 Java 测试技术
《手把手教你》系列技巧篇(三十二)-java+ selenium自动化测试-select 下拉框(详解教程)
【4月更文挑战第24天】本文介绍了在自动化测试中处理HTML下拉选择(select)的方法。使用Selenium的Select类,可以通过index、value或visible text三种方式选择选项,并提供了相应的取消选择的方法。此外,文章还提供了一个示例HTML页面(select.html)和相关代码实战,演示了如何使用Selenium进行选择和取消选择操作。最后,文章提到了现代网页中类似下拉框的新设计,如12306网站的出发地选择,并给出了相应的代码示例,展示了如何定位并选择特定选项。
16 0