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

原文:docs.oracle.com/javase/tutorial/reallybigindex.html

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

原文: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 函数向接收器小程序发送请求。接收器小程序在接收请求后增加一个计数器变量并显示变量的值。

//<![CDATA[ function sendMsgToIncrementCounter() { var myReceiver = document.getElementById("receiver"); myReceiver.incrementCounter(); } //]]>

发送器小程序

//<![CDATA[ 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'); //]]>

接收器小程序

//<![CDATA[ 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'); //]]>


注意: 如果您看不到小程序运行,请至少安装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 代码,请在类路径中包含 <your JDK path>/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

  2. 在网页中包含以下 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>
    
    

    或者,您可以使用已包含此 HTML 代码的quoteApplet.html页面。

  3. 编译QuoteClientApplet.java类。将生成的类文件复制到保存网页的相同目录中。

  4. 编译服务器端应用程序的类,QuoteServer.javaQuoteServerThread.java

  5. 将文件one-liners.txt复制到具有服务器端应用程序类文件(在上一步生成)的目录中。

  6. 启动服务器端应用程序。

    java QuoteServer
    
    

    您应该看到一个带有端口号的消息,如下例所示。请注意端口号。

    QuoteServer listening on port:3862
    
    
  7. 在浏览器中打开包含小程序的网页,输入网页的 URL。URL 中的主机名应与运行服务器端应用程序的主机名相同。

    例如,如果服务器端应用程序在名为JohnDoeMachine的计算机上运行,则应输入类似的 URL。确切的端口号和路径将根据您的 Web 服务器设置而变化。

    http://JohnDoeMachine:8080/quoteApplet/quoteApplet.html
    
    

    QuoteClientApplet将显示在网页上。

  8. 在小程序的文本字段中输入服务器端应用程序的端口号,然后单击“确定”。将显示一个引语。

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

QuoteServer 示例输出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 上的文章)

解决常见小程序问题

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

本节涵盖了在编写 Java 小程序时可能遇到的一些常见问题。每个问题后面都列出了可能的原因和解决方案。

问题: 我的小程序没有显示。

  • 检查 Java 控制台日志以查看错误。

  • 检查小程序的 Java 网络启动协议(JNLP)文件的语法。不正确的 JNLP 文件是失败的最常见原因,而没有明显的错误。

  • 如果使用部署工具包的runApplet函数部署,请检查 JavaScript 语法。有关详细信息,请参阅部署小程序。

问题: Java 控制台日志显示 java.lang.ClassNotFoundException。

  • 确保你的 Java 源文件编译正确。

  • 如果使用<applet>标签部署,请检查archive属性中小程序 JAR 文件的路径是否准确。

  • 如果使用 JNLP 文件启动,请检查 JNLP 文件中jar标签中的路径。

  • 确保小程序的 JAR 文件、JNLP 文件和网页位于正确的目录中,并准确引用彼此。

问题: 我曾经能够构建代码,但现在即使没有编译错误,构建也失败了。

  • 关闭浏览器并重新运行构建。浏览器很可能锁定了 JAR 文件,导致构建过程无法重新生成 JAR 文件。

问题: 当我尝试加载一个包含小程序的网页时,我的浏览器会在没有任何警告的情况下将我重定向到www.java.com

  • 网页上的小程序很可能是使用部署工具包脚本部署的。小程序可能需要比客户端当前存在的 Java 运行时环境软件版本更高的版本。检查小程序网页中runApplet函数的minimumVersion参数。有关详细信息,请参阅部署小程序。

问题: 我修复了一些错误并重新构建了我的小程序源代码。当我重新加载小程序的网页时,我的修复并没有显示出来。

  • 你可能正在查看之前缓存的小程序版本。关闭浏览器。打开 Java 控制面板并删除临时互联网文件。这将从缓存中删除你的小程序。尝试重新查看你的小程序。

问题和练习:Applets

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

问题

  1. 一个 applet 可以继承哪些类?

  2. 你如何使用start()方法?

  3. 真或假:一个 applet 可以与互联网上的任何主机建立网络连接。

  4. 如何从 applet 的代码中获取在 JNLP 文件中指定的参数的值?

  5. 哪个类使 applets 能够与 applet 网页中的 JavaScript 代码交互?

  6. 真或假:Applets 可以修改父网页的内容。

练习

  1. Exercise applet 的父网页有一个名为memberId的 JavaScript 变量。写出在 applet 的start方法中将memberId的值设置为"123489"的代码。

检查你的答案。

教程:Java Web Start

原文:docs.oracle.com/javase/tutorial/deployment/webstart/index.html

Java Web Start 软件提供了一键启动功能,可以启动功能齐全的应用程序。用户可以下载和启动应用程序,例如完整的电子表格程序或互联网聊天客户端,而无需经历冗长的安装过程。

使用 Java Web Start 软件,用户可以通过在网页中点击链接来启动 Java 应用程序。该链接指向一个 Java 网络启动协议(JNLP)文件,该文件指示 Java Web Start 软件下载、缓存和运行应用程序。

Java Web Start 软件为 Java 开发人员和用户提供了许多部署优势:

  • 使用 Java Web Start 软件,您可以将单个 Java 应用程序放在 Web 服务器上,以便在各种平台上部署,包括 Windows、Linux 和 Solaris。

  • Java Web Start 软件支持多个同时运行的 Java 平台版本。应用程序可以请求特定版本的 Java 运行时环境(JRE)软件,而不会与其他应用程序的需求发生冲突。

  • 用户可以创建桌面快捷方式以在浏览器外启动 Java Web Start 应用程序。

  • Java Web Start 软件利用了 Java 平台固有的安全性。默认情况下,应用程序对本地磁盘和网络资源的访问受到限制。

  • 使用 Java Web Start 软件启动的应用程序会在本地缓存以提高性能。

  • Java Web Start 应用程序的更新会在用户从桌面独立运行应用程序时自动下载。

Java Web Start 软件作为 JRE 软件的一部分安装。用户无需单独安装 Java Web Start 软件或执行其他任务即可使用 Java Web Start 应用程序。

其他参考资料

本课程旨在帮助您开始使用 Java Web Start 技术,并不包括所有可用文档。有关 Java Web Start 技术的更多信息,请参阅以下内容:

开发 Java Web Start 应用程序

原文:docs.oracle.com/javase/tutorial/deployment/webstart/developing.html

使用基于组件的架构设计的软件可以轻松地开发和部署为 Java Web Start 应用程序。考虑具有基于 Swing 的图形用户界面(GUI)的 Java Web Start 应用程序的示例。通过基于组件的设计,GUI 可以使用更小的构建块或组件构建。以下是用于创建应用程序 GUI 的一般步骤:

  • 创建一个MyTopJPanel类,它是JPanel的子类。在MyTopJPanel类的构造函数中布局应用程序的 GUI 组件。

  • 创建一个名为MyApplication的类,它是JFrame类的子类。

  • MyApplication类的main方法中,实例化MyTopJPanel类,并将其设置为JFrame的内容窗格。

以下各节通过使用 Dynamic Tree Demo 应用程序更详细地探讨了这些步骤。如果您对 Swing 不熟悉,请参阅使用 Swing 创建 GUI 以了解更多关于使用 Swing GUI 组件的信息。

单击以下启动按钮以启动 Dynamic Tree Demo 应用程序。

//<![CDATA[ var url = "https://docs.oracle.com/javase/tutorialJWS/samples/deployment/dynamictree_webstartJWSProject/dynamictree_webstart.jnlp"; deployJava.createWebStartLaunchButton(url, '1.7.0'); //]]>


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


创建顶级JPanel

创建一个JPanel的子类。这个顶级JPanel充当所有其他 UI 组件的容器。在下面的示例中,DynamicTreePanel类是最顶层的JPanelDynamicTreePanel类的构造函数调用其他方法来正确创建和布局 UI 控件。

public class DynamicTreePanel extends JPanel implements ActionListener {
    private int newNodeSuffix = 1;
    private static String ADD_COMMAND = "add";
    private static String REMOVE_COMMAND = "remove";
    private static String CLEAR_COMMAND = "clear";

    private DynamicTree treePanel;

    public DynamicTreePanel() {
        super(new BorderLayout());

        //Create the components.
        treePanel = new DynamicTree();
        populateTree(treePanel);

        JButton addButton = new JButton("Add");
        addButton.setActionCommand(ADD_COMMAND);
        addButton.addActionListener(this);

        JButton removeButton = new JButton("Remove");
        ....

        JButton clearButton = new JButton("Clear");
        ...

        //Lay everything out.
        treePanel.setPreferredSize(
            new Dimension(300, 150));
        add(treePanel, BorderLayout.CENTER);

        JPanel panel = new JPanel(new GridLayout(0,3));
        panel.add(addButton);
        panel.add(removeButton); 
        panel.add(clearButton);
        add(panel, BorderLayout.SOUTH);
    }
    // ...
}

创建应用程序

对于具有基于 Swing 的 GUI 的应用程序,请创建一个是javax.swing.JFrame的子类的类。

在应用程序的main方法中,实例化您的顶级JPanel类,并将其设置为JFrame的内容窗格。DynamicTreeApplication类的main方法在 AWT 事件分发线程中调用createGUI方法。

package webstartComponentArch;

import javax.swing.JFrame;

public class DynamicTreeApplication extends JFrame {
    public static void main(String [] args) {
        DynamicTreeApplication app = new DynamicTreeApplication();
        app.createGUI();
    }

    private void createGUI() {
        //Create and set up the content pane.
        DynamicTreePanel newContentPane = new DynamicTreePanel();
        newContentPane.setOpaque(true); 
        setContentPane(newContentPane);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setVisible(true);
    }    
}

将核心功能与最终部署机制分离的好处

另一种创建应用程序的方法是去掉抽象层(单独的顶级JPanel)并在应用程序的main方法中布局所有控件。直接在应用程序的main方法中创建 GUI 的缺点是,如果以后选择将功能部署为小程序,部署将更加困难。

在动态树演示示例中,核心功能被分离到DynamicTreePanel类中。现在,将DynamicTreePanel类放入JApplet中并将其部署为小程序变得非常简单。

因此,为了保持可移植性并保持部署选项开放,请按照本主题中描述的基于组件的设计方法进行操作。

下载源代码以进一步进行动态树演示示例的实验。

检索资源

docs.oracle.com/javase/tutorial/deployment/webstart/retrievingResources.html

使用getResource方法从 JAR 文件中读取资源。例如,以下代码从 JAR 文件中检索图像。

// Get current classloader
ClassLoader cl = this.getClass().getClassLoader();
// Create icons
Icon saveIcon  = new ImageIcon(cl.getResource("images/save.gif"));
Icon cutIcon   = new ImageIcon(cl.getResource("images/cut.gif"));

该示例假设应用程序的 JAR 文件中存在以下条目:

  • images/save.gif

  • images/cut.gif

部署 Java Web Start 应用程序

原文:docs.oracle.com/javase/tutorial/deployment/webstart/deploying.html

要部署您的 Java Web Start 应用程序,首先编译源代码,将其打包为 JAR 文件,并对 JAR 文件进行签名。

Java Web Start 应用程序通过使用 Java 网络启动协议(JNLP)启动。因此,您必须创建一个 JNLP 文件来部署您的应用程序。

部署工具包脚本包含有用的 JavaScript 函数,可用于在网页上部署 Java Web Start 应用程序。

如果您对这些部署技术不熟悉,请在继续之前查看深入部署课程。

以下是一些逐步说明,用于打包和部署您的应用程序。动态树演示应用程序用于说明 Java Web Start 应用程序的部署。您可能希望设置构建脚本来执行以下一些步骤。

单击以下启动按钮以启动动态树演示应用程序。

//<![CDATA[ var url = "https://docs.oracle.com/javase/tutorialJWS/samples/deployment/dynamictree_webstartJWSProject/dynamictree_webstart.jnlp" deployJava.createWebStartLaunchButton(url, '1.7.0'); //]]>


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


  1. 编译您的应用程序的 Java 代码,并确保所有类文件和资源(如图像)位于单独的目录中。

    在动态树演示应用程序中,编译后的类文件放置在build/classes/webstartComponentArch目录中。

  2. 创建一个包含您的小程序所需的任何 JAR 文件清单属性的文本文件。

    对于 DynamicTree 演示小程序,创建一个名为mymanifest.txt的文件,放在build/classes目录中,并添加PermissionsCodebaseApplication-Name属性。该小程序不需要访问用户系统资源,因此对于权限使用sandbox。对于代码库,请使用将加载示例的域,例如myserver.com。将以下属性添加到mymanifest.txt文件中。

    Permissions: sandbox
    Codebase: myserver.com
    Application-Name: Dynamic Tree Demo
    
    

    其他清单属性可用于限制小程序仅使用受信任的代码,并为需要在特权 Java 代码和沙箱 Java 代码之间进行调用,或具有调用小程序的 JavaScript 代码的小程序提供安全性。请参阅使用清单属性增强安全性课程,了解更多可用的清单属性。

  3. 创建一个包含应用程序类文件和资源的 JAR 文件。在上一步中创建的mymanifest.txt文件中包含清单属性。

    例如,以下命令将在build/classes/webstartComponentArch目录中的类文件和build/classes目录中的清单文件创建一个 JAR 文件。

    % cd build/classes
    % jar cvfm  DynamicTreeDemo.jar  mymanifest.txt webstartComponentArch
    
    

    参见在 JAR 文件中打包程序课程,了解有关创建和使用 JAR 文件的更多信息。

  4. 为您的小程序签署 JAR 文件并为签名加上时间戳。使用由受信任的证书颁发机构颁发的有效、当前的代码签名证书,向您的用户提供确保可以安全运行小程序的保证。

    有关更多信息,请参见签署 JAR 文件课程。

    如果您想要为安全性使用已签名的 JNLP 文件,请按照下一步中的说明创建 JNLP 文件,并在签名 JAR 文件之前将其包含在 JAR 文件中。有关详细信息,请参阅已签名的 JNLP 文件中的 Java 平台标准版部署指南。

  5. 创建一个描述应用程序如何启动的 JNLP 文件。

    以下是用于启动动态树演示应用程序的 JNLP 文件。对于此应用程序,不会请求权限,因此它在安全沙箱中运行。dynamictree_webstart.jnlp的源代码如下:

    
    <?xml version="1.0" encoding="UTF-8"?>
    <jnlp spec="1.0+" codebase=
    "https://docs.oracle.com/javase/tutorialJWS/samples/deployment/webstart_ComponentArch_DynamicTreeDemo" 
        href="dynamictree_webstart.jnlp">
        <information>
            <title>Dynamic Tree Demo</title>
            <vendor>Dynamic Team</vendor>
        </information>
        <resources>
            <!-- Application Resources -->
            <j2se version="1.7+"
                  href="http://java.sun.com/products/autodl/j2se"/>
            <jar href="DynamicTreeDemo.jar"
                main="true" />
    
        </resources>
        <application-desc
             name="Dynamic Tree Demo Application"
             main-class=
               "webstartComponentArch.DynamicTreeApplication"
             width="300"
             height="300">
         </application-desc>
         <update check="background"/>
    </jnlp>                                   
    
    

    JNLP 文件的结构描述了 JNLP 文件的语法和选项。


    注意: 在部署将在至少 Java SE 6 更新 18 版本或更高版本上运行的 Java Web Start 应用程序时,codebasehref 属性是可选的。在部署将在早期版本的 Java Runtime Environment 软件上运行的 Java Web Start 应用程序时,必须指定 codebasehref 属性。


  6. 创建 HTML 页面,从中启动您的应用程序。调用部署工具包函数来部署 Java Web Start 应用程序。

    在示例中,动态树演示应用程序部署在JavaWebStartAppPage.html中。

    <body>
        <!-- ... -->
        <script src=
          "https://www.java.com/js/deployJava.js"></script>
        <script>
            // using JavaScript to get location of JNLP
            // file relative to HTML page
            var dir = location.href.substring(0,
                location.href.lastIndexOf('/')+1);
            var url = dir + "dynamictree_webstart.jnlp";
            deployJava.createWebStartLaunchButton(url, '1.7.0');
        </script>
        <!-- ... -->
    </body>
    
    

    如果您不确定最终用户的浏览器中是否启用了 JavaScript 解释器,您可以通过直接创建指向 JNLP 文件的链接来部署 Java Web Start 应用程序,如下所示:

    <a href="/*absolute path to JNLP file*/dynamictree_webstart.jnlp">Launch Notepad Application</a>
    
    

    如果您通过直接链接部署 Java Web Start 应用程序,则无法利用部署工具包函数提供的额外检查。有关详细信息,请参阅部署 Java Web Start 应用程序中的深入部署课程。

  7. 将应用程序的 JAR 文件、JNLP 文件和 HTML 页面放在适当的文件夹中。

    对于这个示例,将DynamicTreeDemo.jardynamictree_webstart.jnlpJavaWebStartAppPage.html放在本地计算机或 Web 服务器上的同一目录中。最好使用 Web 服务器。要从本地计算机运行,必须将应用程序添加到例外站点列表中,该列表可从 Java 控制面板的安全选项卡中管理。

  8. 在浏览器中打开应用程序的 HTML 页面以查看应用程序。在提示时同意运行应用程序。检查 Java 控制台日志以查看错误和调试消息。

下载源代码以进一步尝试动态树演示示例。

设置 Web 服务器

原文:docs.oracle.com/javase/tutorial/deployment/webstart/settingUpWebServerMimeType.html

您可能需要配置您的 web 服务器来处理 Java 网络启动协议(JNLP)文件。如果 web 服务器没有正确设置,当您单击 JNLP 文件的链接时,Java Web 启动应用程序将无法启动。

配置 web 服务器,使具有.jnlp扩展名的文件设置为application/x-java-jnlp-file MIME 类型。

设置 JNLP MIME 类型的具体步骤将根据 web 服务器的不同而有所变化。例如,要配置 Apache web 服务器,您应该在mime.types文件中添加以下行。

application/x-java-jnlp-file JNLP

对于其他 web 服务器,请查阅文档以获取设置 MIME 类型的说明。

运行 Java Web Start 应用程序

原文:docs.oracle.com/javase/tutorial/deployment/webstart/running.html

用户可以通过以下方式运行 Java Web Start 应用程序:

  • 从浏览器中运行 Java Web Start 应用程序

  • 从 Java 缓存查看器中运行 Java Web Start 应用程序

  • 从桌面中运行 Java Web Start 应用程序


注意: 要运行使用 Java Web Start 技术部署的应用程序,您必须具有兼容版本的 Java 运行时环境(JRE)软件。不需要完整的 Java 开发工具包(JDK)。


从浏览器中运行 Java Web Start 应用程序

您可以通过点击应用程序的 JNLP 文件的链接来从浏览器中运行 Java Web Start 应用程序。以下文本是指向 JNLP 文件的链接的示例。

<a href="/some/path/Notepad.jnlp">Launch Notepad Application</a>

Java Web Start 软件根据 JNLP 文件中的指令加载和运行应用程序。

立即尝试:运行记事本

从 Java 缓存查看器中运行 Java Web Start 应用程序

如果您至少使用的是 Java 平台标准版 6 或更高版本,则可以通过 Java 缓存查看器运行 Java Web Start 应用程序。

当 Java Web Start 软件首次加载应用程序时,应用程序的 JNLP 文件中的信息将存储在本地 Java 缓存查看器中。要再次启动应用程序,您无需返回首次启动它的网页;您可以从 Java 缓存查看器中启动它。

要打开 Java 缓存查看器:

  1. 打开控制面板。

  2. 双击 Java 图标。Java 控制面板将打开。

  3. 选择“常规”选项卡。

  4. 点击“查看”。Java 缓存查看器将打开。

应用程序将列在 Java 缓存查看器屏幕上。

Java 缓存查看器应用程序的屏幕截图Java 缓存查看器应用程序

要运行应用程序,请选择它并单击“运行”按钮,运行按钮,或双击应用程序。应用程序将像从网页中启动一样启动。

从桌面中运行 Java Web Start 应用程序

您可以为 Java Web Start 应用程序添加桌面快捷方式。在 Java 缓存查看器中选择应用程序。右键单击并选择“安装快捷方式”或单击“安装”按钮,安装按钮

桌面上添加了一个快捷方式。

然后,您可以像启动任何本地应用程序一样启动 Java Web Start 应用程序。

Java Web Start 和安全性

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

本节描述了通过 Java Web Start 部署的应用程序的安全基础知识,包括:

使用 Java Web Start 启动的应用程序默认在被称为沙盒的受限环境中运行。在这个沙盒中,Java Web Start:

  • 保护用户免受可能影响本地文件的恶意代码

  • 保护企业免受可能试图访问或破坏网络数据的代码

通过 Java Web Start 启动的沙箱应用程序仍保持在此沙箱中,这意味着它们无法访问本地文件或网络。有关详细信息,请参阅富互联网应用程序中的安全性

动态下载 HTTPS 证书

Java Web Start 动态导入证书,就像浏览器通常做的那样。为此,Java Web Start 设置了自己的https处理程序,使用java.protocol.handler.pkgs系统属性来初始化SSLSocketFactoryHostnameVerifier的默认值。它使用方法HttpsURLConnection.setDefaultSSLSocketFactoryHttpsURLConnection.setDefaultHostnameVerifier设置默认值。

如果您的应用程序使用这两种方法,请确保它们在 Java Web Start 初始化https处理程序之后被调用,否则您的自定义处理程序将被 Java Web Start 默认处理程序替换。

您可以确保使用自定义的SSLSocketFactoryHostnameVerifier之一:

  • 安装您自己的https处理程序,以替换 Java Web Start 的https处理程序。

  • 在您的应用程序中,只有在创建第一个https URL对象之后才调用HttpsURLConnection.setDefaultSSLSocketFactoryHttpsURLConnection.setDefaultHostnameVerifier,这会首先执行 Java Web Start 的https处理程序初始化代码。

常见的 Java Web 启动问题

原文:docs.oracle.com/javase/tutorial/deployment/webstart/problems.html

本节涵盖了在开发和部署 Java Web 启动应用程序时可能遇到的一些常见问题。每个问题后面都列出了可能的原因和解决方案。

问题: 我的浏览器将我的应用程序的 Java 网络启动协议(JNLP)文件显示为纯文本。

很可能,您的 Web 服务器不知道 JNLP 文件的正确 MIME 类型。有关更多信息,请参阅设置 Web 服务器部分。

此外,如果您正在使用代理服务器,请确保更新文件的时间戳,以便在 Web 服务器上更新资源的情况下,代理服务器将更新其缓存。

问题: 当我尝试启动我的 JNLP 文件时,我收到以下错误:

MissingFieldException[ The following required field is missing from the launch
  file: (<application-desc>|<applet-desc>|<installer-desc>|<component-desc>)]
        at com.sun.javaws.jnl.XMLFormat.parse(Unknown Source)
        at com.sun.javaws.jnl.LaunchDescFactory.buildDescriptor(Unknown Source)
        at com.sun.javaws.jnl.LaunchDescFactory.buildDescriptor(Unknown Source)
        at com.sun.javaws.jnl.LaunchDescFactory.buildDescriptor(Unknown Source)
        at com.sun.javaws.Main.launchApp(Unknown Source)
        at com.sun.javaws.Main.continueInSecureThread(Unknown Source)
        at com.sun.javaws.Main.run(Unknown Source)
        at java.lang.Thread.run(Unknown Source)

通常,当您的 XML 格式不正确时会出现此错误。您可以盯着代码直到找到问题所在,但更容易的方法是在文件上运行 XML 语法检查器。(NetBeans IDE 和 jEdit 都提供 XML 语法检查器。)

然而,此错误可能在其他情况下发生,上述情况是由另一个情况引起的,在其他情况下,这是由一个在其他情况下是格式良好的 XML 文件中的以下行引起的:

<description kind="short">Demonstrates choosing the drop location in the target <code>TransferHandler</code></description>

错误是由非法嵌入的code标签引起的。

问题和练习:Java Web Start

原文:docs.oracle.com/javase/tutorial/deployment/webstart/QandE/questions.html

问题

  1. 在要运行 Java Web Start 应用程序的链接中,指定了哪个文件作为a标签的href属性?

  2. Web 服务器必须识别哪种 MIME 类型才能托管 Java Web Start 应用程序?

  3. 在应用程序的JNLP文件中,resources元素内必须指定哪两个元素?

  4. 哪个接口提供了控制 Java Web Start 应用程序资源如何被缓存的能力?

    1. BasicService

    2. DownloadService

    3. PersistenceService

    4. ExtendedService

  5. 真或假:Java Web Start 应用程序默认在安全沙箱中运行。

  6. 真或假:如果 Java Web Start 应用程序在安全沙箱中运行,则应用程序的 JAR 文件可以位于不同的服务器上。

  7. 要使 Java Web Start 应用程序支持安全沙箱之外的操作,您必须做什么?

练习

  1. 编写您将添加到JNLP文件中的 XML 代码,以请求应用程序完全访问客户端系统。

  2. 对于一个 Java Web Start 应用程序,在 JAR 文件的images目录中有两个图标,one.giftwo.gif。编写您将用于访问这些图像的应用程序代码。

检查您的答案。

课程:使用 Java 丰富的互联网应用程序做更多事情

译文:docs.oracle.com/javase/tutorial/deployment/doingMoreWithRIA/index.html

通过使用 Java 网络启动协议(JNLP)启动的小程序具有类似于 Java Web Start 应用程序的功能。本课程包含了开发和部署小程序和 Java Web Start 应用程序(统称为丰富的互联网应用程序)的共同主题。如果您对小程序或 Java Web Start 应用程序不熟悉,您可以在 Java 教程的以下课程中了解更多:

  • 要了解更多关于小程序开发和部署的信息,请访问 Java 小程序课程。

  • 要了解更多关于开发和部署 Java Web Start 应用程序的信息,请访问 Java Web Start 课程。


注意: 请确保您的客户端机器上至少安装了Java SE 开发工具包(JDK)6 更新 10版本,然后再继续。您将需要这个版本来查看示例丰富的互联网应用程序,并在没有中断的情况下阅读后续章节。


设置可信参数和安全属性

原文:docs.oracle.com/javase/tutorial/deployment/doingMoreWithRIA/settingArgsProperties.html

你可以在富互联网应用程序(RIA)的 Java 网络启动协议(JNLP)文件中设置特定的 Java 虚拟机参数和安全属性。对于小程序,你还可以在<applet>标签的java_arguments参数中设置参数。虽然有一组预定义的安全属性,但你也可以通过在属性名称前加上"jnlp."或"javaws."来定义新的安全属性。可以通过使用System.getProperty方法在你的 RIA 中检索属性。

考虑属性和参数演示小程序。以下 Java 虚拟机参数和属性在小程序的 JNLP 文件appletpropsargs.jnlp中设置。

  • -Xmx – 一个安全参数,设置为"256M"

  • sun.java2d.noddraw – 一个预定义的安全属性,设置为"true"

  • jnlp.myProperty – 一个用户定义的安全属性,设置为"a user-defined property"

<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+" codebase="" href="">
    <information>
        <title>Properties and Arguments Demo Applet</title>
        <vendor>Dynamic Team</vendor>
    </information>
    <resources>
        <!-- Application Resources -->
        <j2se version="1.6+"
              href="http://java.sun.com/products/autodl/j2se"
              <!-- secure java vm argument -->
              java-vm-args="-Xmx256M"/>
        <jar href="applet_PropertiesAndVMArgs.jar"
            main="true" />
            <!-- secure properties -->
        <property name="sun.java2d.noddraw"
            value="true"/>
        <property name="jnlp.myProperty"
            value="a user-defined property"/>
    </resources>
    <applet-desc 
         name="Properties and Arguments Demo Applet"
         main-class="PropertiesArgsDemoApplet"
         width="800"
         height="50">             
     </applet-desc>
     <update check="background"/>
</jnlp>

PropertiesArgsDemoApplet类使用System.getProperty方法检索在 JNLP 文件中设置的java.version属性和其他属性。PropertiesArgsDemoApplet类还显示这些属性。


import javax.swing.JApplet;
import javax.swing.SwingUtilities;
import javax.swing.JLabel;

public class PropertiesArgsDemoApplet extends JApplet {
    public void init() {
        final String javaVersion = System.getProperty("java.version");
        final String  swing2dNoDrawProperty = System.getProperty("sun.java2d.noddraw");
        final String  jnlpMyProperty = System.getProperty("jnlp.myProperty");        

        try {
            SwingUtilities.invokeAndWait(new Runnable() {
                public void run() {
                    createGUI(javaVersion, swing2dNoDrawProperty, jnlpMyProperty);
                }
            });
        } catch (Exception e) {
            System.err.println("createGUI didn't successfully complete");
        }
    }
    private void createGUI(String javaVersion, String swing2dNoDrawProperty, String jnlpMyProperty) {
        String text = "Properties: java.version = " + javaVersion + 
                ",  sun.java2d.noddraw = " + swing2dNoDrawProperty +
                ",   jnlp.myProperty = " + jnlpMyProperty;
        JLabel lbl = new JLabel(text);
        add(lbl);
    }
}

接下来显示属性和参数演示小程序。你也可以在AppletPage.html中看到小程序运行。

//<![CDATA[ var attributes = { code:'PropertiesArgsDemoApplet.class', archive:'examples/dist/applet_PropertiesAndVMArgs/applet_PropertiesAndVMArgs.jar', width:800, height:50} ; var parameters = { jnlp_href: 'examples/dist/applet_PropertiesAndVMArgs/appletpropsargs.jnlp' }; deployJava.runApplet(attributes, parameters, '1.6'); //]]>


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



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


下载源代码以进一步实验属性和参数演示小程序示例。

查看系统属性以获取可以被 RIA 访问的完整系统属性集。

系统属性

原文:docs.oracle.com/javase/tutorial/deployment/doingMoreWithRIA/properties.html

本主题列出了受限于安全沙箱并使用或不使用 Java 网络启动协议(JNLP)启动的富互联网应用程序(RIA)可以访问的系统属性。一些系统属性无法被沙箱式富互联网应用程序访问。

所有富互联网应用程序都可以检索以下安全系统属性:

所有 RIA 都可以检索以下安全系统属性:

  • java.class.version

  • java.vendor

  • java.vendor.url

  • java.version

  • os.name

  • os.arch

  • os.version

  • file.separator

  • path.separator

  • line.separator

通过使用 JNLP 启动的 RIA 可以访问的安全系统属性

通过使用 JNLP 启动的 RIA 可以设置和检索以下安全属性:

  • awt.useSystemAAFontSettings

  • http.agent

  • http.keepAlive

  • java.awt.syncLWRequests

  • java.awt.Window.locationByPlatform

  • javaws.cfg.jauthenticator

  • javax.swing.defaultlf

  • sun.awt.noerasebackground

  • sun.awt.erasebackgroundonresize

  • sun.java2d.d3d

  • sun.java2d.dpiaware

  • sun.java2d.noddraw

  • sun.java2d.opengl

  • swing.boldMetal

  • swing.metalTheme

  • swing.noxp

  • swing.useSystemFontSettings

禁止访问的系统属性

沙箱式富互联网应用程序无法访问以下系统属性:

  • java.class.path

  • java.home

  • user.dir

  • user.home

  • user.name

JNLP API

原文:docs.oracle.com/javase/tutorial/deployment/doingMoreWithRIA/jnlpAPI.html

富互联网应用程序(RIAs)可以使用 Java 网络启动协议(JNLP)API 对用户环境执行广泛的操作。当使用 JNLP 启动时,即使未签名的 RIAs 也可以在用户许可的情况下执行以下操作:

查看JNLP API 文档以查看通过 JNLP 启动的 RIA 可用功能的完整列表。

使用 JNLP API 访问客户端

原文:docs.oracle.com/javase/tutorial/deployment/doingMoreWithRIA/usingJNLPAPI.html

当使用 Java 网络启动协议(JNLP)启动时,富互联网应用程序(RIA)可以在用户许可的情况下访问客户端。考虑文本编辑器小程序示例,以了解如何使用基于 JNLP API 的服务。文本编辑器具有文本区域和标有打开、保存和另存为的按钮。文本编辑器可用于打开现有文本文件,编辑它,并将其保存回磁盘。

接下来显示文本编辑器小程序。

//<![CDATA[ var attributes = { code:'TextEditorApplet.class', archive:'examples/dist/applet_JNLP_API/applet_JNLP_API.jar', width:500, height:300} ; var parameters = { jnlp_href: 'examples/dist/applet_JNLP_API/texteditor_applet.jnlp' }; deployJava.runApplet(attributes, parameters, '1.6'); //]]>


注意: 如果您看不到小程序运行,请至少安装Java SE 开发工具包(JDK)6 更新 10版本。



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


TextEditorTextEditorApplet类布局用户界面并将其显示为小程序。FileHandler类包含了关于使用基于 JNLP API 的服务的核心功能。

记住,本主题中描述的技术也适用于 Java Web Start 应用程序。

要使用 JNLP 服务,首先检索对服务的引用。FileHandler类的initialize方法检索 JNLP 服务的引用,如下面的代码片段所示:

private static synchronized void initialize() {
    ...
    try {
        fos = (FileOpenService)
            ServiceManager.lookup("javax.jnlp.FileOpenService");
        fss = (FileSaveService)
            ServiceManager.lookup("javax.jnlp.FileSaveService");
    } catch (UnavailableServiceException e) {
        ...
    }
}

在获得所需服务的引用之后,调用服务上的方法执行必要的操作。FileHandler类的open方法调用FileOpenService类的openFileDialog方法以显示文件选择器。open方法返回所选文件的内容。

public static String open() {
    initialize();
    try {
        fc = fos.openFileDialog(null, null);
        return readFromFile(fc);
    } catch (IOException ioe) {
        ioe.printStackTrace(System.out);
        return null;
    }
}

类似地,FileHandler类的savesaveAs方法调用FileSaveService类的相应方法,以使用户能够选择文件名并将文本区域的内容保存到磁盘。

public static void saveAs(String txt) {
    initialize();
    try {
        if (fc == null) {
            // If not already saved.
            // Save-as is like save
            save(txt);
        } else {
            fc = fss.saveAsFileDialog(null, null,
                                         fc);
            save(txt);
        }
    } catch (IOException ioe) {
        ioe.printStackTrace(System.out);
    }
}

在运行时,当 RIA 尝试打开或保存文件时,用户会看到一个安全对话框,询问他们是否允许该操作。只有在用户允许 RIA 访问其环境时,操作才会继续进行。

下面显示了FileHandler类的完整源代码。


// add javaws.jar to the classpath during compilation 
import javax.jnlp.FileOpenService;
import javax.jnlp.FileSaveService;
import javax.jnlp.FileContents;
import javax.jnlp.ServiceManager;
import javax.jnlp.UnavailableServiceException;
import java.io.*;

public class FileHandler {

    static private FileOpenService fos = null;
    static private FileSaveService fss = null;
    static private FileContents fc = null;

    // retrieves a reference to the JNLP services
    private static synchronized void initialize() {
        if (fss != null) {
            return;
        }
        try {
            fos = (FileOpenService) ServiceManager.lookup("javax.jnlp.FileOpenService");
            fss = (FileSaveService) ServiceManager.lookup("javax.jnlp.FileSaveService");
        } catch (UnavailableServiceException e) {
            fos = null;
            fss = null;
        }
    }

    // displays open file dialog and reads selected file using FileOpenService
    public static String open() {
        initialize();
        try {
            fc = fos.openFileDialog(null, null);
            return readFromFile(fc);
        } catch (IOException ioe) {
            ioe.printStackTrace(System.out);
            return null;
        }
    }

    // displays saveFileDialog and saves file using FileSaveService
    public static void save(String txt) {
        initialize();
        try {
            // Show save dialog if no name is already given
            if (fc == null) {
                fc = fss.saveFileDialog(null, null,
                        new ByteArrayInputStream(txt.getBytes()), null);
                // file saved, done
                return;
            }
            // use this only when filename is known
            if (fc != null) {
                writeToFile(txt, fc);
            }
        } catch (IOException ioe) {
            ioe.printStackTrace(System.out);
        }
    }

    // displays saveAsFileDialog and saves file using FileSaveService
    public static void saveAs(String txt) {
        initialize();
        try {
            if (fc == null) {
                // If not already saved. Save-as is like save
                save(txt);
            } else {
                fc = fss.saveAsFileDialog(null, null, fc);
                save(txt);
            }
        } catch (IOException ioe) {
            ioe.printStackTrace(System.out);
        }
    }

    private static void writeToFile(String txt, FileContents fc) throws IOException {
        int sizeNeeded = txt.length() * 2;
        if (sizeNeeded > fc.getMaxLength()) {
            fc.setMaxLength(sizeNeeded);
        }
        BufferedWriter os = new BufferedWriter(new OutputStreamWriter(fc.getOutputStream(true)));
        os.write(txt);
        os.close();
    }

    private static String readFromFile(FileContents fc) throws IOException {
        if (fc == null) {
            return null;
        }
        BufferedReader br = new BufferedReader(new InputStreamReader(fc.getInputStream()));
        StringBuffer sb = new StringBuffer((int) fc.getLength());
        String line = br.readLine();
        while (line != null) {
            sb.append(line);
            sb.append("\n");
            line = br.readLine();
        }
        br.close();
        return sb.toString();
    }
}


注意: 要编译具有对javax.jnlp包中类的引用的 Java 代码,请在类路径中包含<你的 JDK 路径>/jre/lib/javaws.jar。在运行时,Java 运行环境软件会自动使这些类对 RIA 可用。


下载源代码以进一步尝试文本编辑器小程序示例。

Cookie

原文:docs.oracle.com/javase/tutorial/deployment/doingMoreWithRIA/cookies.html

Web 应用程序通常是一系列的超文本传输协议(HTTP)请求和响应。由于 HTTP 是一个无状态协议,信息不会在 HTTP 请求之间自动保存。Web 应用程序使用 cookie 在客户端上存储状态信息。Cookie 可用于存储有关用户、用户的购物车等信息。

两种类型的 cookie 如下:

  • 会话 cookie – 会话 cookie 存储在内存中,只要用户在使用 Web 应用程序,就可以访问。用户退出 Web 应用程序时,会话 cookie 会丢失。这些 cookie 由会话 ID 标识,最常用于存储购物车的详细信息。

  • 永久 cookie – 永久 cookie 用于存储长期信息,如用户偏好和用户识别信息。永久 cookie 存储在持久存储中,用户退出应用程序时不会丢失。永久 cookie 在过期时会丢失。

富互联网应用程序(小程序和 Java Web Start 应用程序)支持会话和永久 cookie。底层的 cookie 存储取决于客户端的浏览器和操作系统。

要了解更多关于 cookie 的信息,请参阅以下内容:

访问 Cookies

原文:docs.oracle.com/javase/tutorial/deployment/doingMoreWithRIA/accessingCookies.html

您可以在富互联网应用程序(RIA)中设置和检索 Cookies。Cookies 可以增强您的 RIA 的功能。例如,考虑这样的情况:您在各种网页上有小程序。一个网页上的小程序不能直接访问或共享另一个网页上的小程序的信息。在这种情况下,Cookies 提供了小程序之间的重要连接,并帮助一个小程序将信息传递给另一个不同网页上的小程序。Java Web Start 应用程序也可以使用 Cookies 在客户端存储信息。

Cookie 小程序示例有一个CookieAccessor类,用于检索和设置 Cookies。

检索 Cookies

以下代码片段显示了CookieAccessor类的getCookieUsingCookieHandler方法:

public void getCookieUsingCookieHandler() { 
    try {       
        // Instantiate CookieManager;
        // make sure to set CookiePolicy
        CookieManager manager = new CookieManager();
        manager.setCookiePolicy(CookiePolicy.ACCEPT_ALL);
        CookieHandler.setDefault(manager);

        // get content from URLConnection;
        // cookies are set by web site
        URL url = new URL("http://host.example.com");
        URLConnection connection = url.openConnection();
        connection.getContent();

        // get cookies from underlying
        // CookieStore
        CookieStore cookieJar =  manager.getCookieStore();
        List <HttpCookie> cookies =
            cookieJar.getCookies();
        for (HttpCookie cookie: cookies) {
          System.out.println("CookieHandler retrieved cookie: " + cookie);
        }
    } catch(Exception e) {
        System.out.println("Unable to get cookie using CookieHandler");
        e.printStackTrace();
    }
}  

CookieManager类是管理 Cookie 的主要入口点。创建CookieManager类的实例,并设置其CookiePolicy。将此CookieManager类的实例设置为默认的CookieHandler

打开到您选择的网站的URLConnection

接下来,使用getCookies方法从底层的CookieStore中检索 Cookies。

设置 Cookies

以下代码片段显示了CookieAccessor类的setCookieUsingCookieHandler方法:

public void setCookieUsingCookieHandler() {
    try {
        // instantiate CookieManager
        CookieManager manager = new CookieManager();
        CookieHandler.setDefault(manager);
        CookieStore cookieJar =  manager.getCookieStore();

        // create cookie
        HttpCookie cookie = new HttpCookie("UserName", "John Doe");

        // add cookie to CookieStore for a
        // particular URL
        URL url = new URL("http://host.example.com");
        cookieJar.add(url.toURI(), cookie);
        System.out.println("Added cookie using cookie handler");
    } catch(Exception e) {
        System.out.println("Unable to set cookie using CookieHandler");
        e.printStackTrace();
    }
}

如检索 Cookies 所示,CookieManager类是管理 Cookie 的主要入口点。创建CookieManager类的实例,并将该实例设置为默认的CookieHandler

使用所需信息创建HttpCookie。在我们的示例中,我们创建了一个将UserName设置为John Doe的新HttpCookie

接下来,将 Cookie 添加到底层的 Cookie 存储中。

要访问 Cookies,您必须对您的 RIA JAR 文件进行签名,并请求在安全沙箱之外运行的权限。请参阅jarsigner工具的文档,了解如何对 JAR 文件进行签名。有关请求权限的信息,请参阅富互联网应用程序中的安全性。

下载源代码以进一步实验Cookie Applet示例。

丰富互联网应用程序中的安全性

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

丰富互联网应用程序(RIAs)背后的安全模型旨在保护用户免受恶意互联网应用程序的侵害。本主题讨论了适用于小程序和 Java Web Start 应用程序的安全方面。有关更多信息,请参阅以下主题:

  • 小程序的能力和限制

  • Java Web Start 和安全性

RIAs 可以限制在 Java 安全沙箱中运行,或请求权限访问安全沙箱之外的资源。第一次启动 RIA 时,用户将被提示是否允许运行。显示的对话框提供有关签名者证书的信息,并指示 RIA 是否请求在安全沙箱之外运行的权限。用户随后可以做出知情决定是否运行应用程序。

请遵循以下准则来帮助保护您的 RIAs。

  • 使用来自认可的证书颁发机构的证书对 RIA 的 JAR 文件进行签名。有关更多信息,请参阅 签署和验证 JAR 文件 主题。

  • 如果 RIA 需要访问安全沙箱之外的资源,请在 RIA 的 JNLP 文件中指定 all-permissions 元素。否则,让 RIA 默认在安全沙箱中运行。以下代码片段显示了 RIA 的 JNLP 文件中的 all-permissions 元素。

    <security>
       <all-permissions/>
    </security>
    
    

    如果使用 applet 标签,请参阅 使用 applet 标签部署 以获取有关设置权限级别的信息。

  • 一个 JNLP 文件只能包含由相同证书签名的 JAR 文件。如果您有使用不同证书签名的 JAR 文件,请在单独的 JNLP 文件中指定它们。在 RIA 的主 JNLP 文件中,使用 component-desc 元素来包含其他 JNLP 文件作为组件扩展。有关详细信息,请参阅 JNLP 文件的结构。

  • 对于 RIAs 的安全模型不允许来自网页的 JavaScript 代码调用签名 JAR 文件中的安全敏感代码,除非您明确启用此功能。在签名的 JAR 文件中,将您希望 JavaScript 代码能够调用的代码部分包装在 AccessController.doPrivileged 块中。这样,当执行 doPrivileged 代码块中的代码时,JavaScript 代码可以以提升的权限运行。

  • 尽量避免在 RIA 中混合特权和沙箱组件,因为它们可能会引发有关混合代码的安全警告。有关更多信息,请参阅 混合特权代码和沙箱代码

  • 在 JAR 文件清单中包含PermissionsCodebase属性,以确保您的 RIA 请求仅限于您指定的权限,并且该 RIA 是从正确的位置访问的。查看用于安全性的 JAR 文件清单属性获取更多信息。

  • JAR 文件清单属性使您能够限制对您的 RIA 的访问,并有助于确保您的代码不被篡改。查看使用清单属性增强安全性获取所有可用的 JAR 文件清单属性的信息。

保护富互联网应用程序的指南

docs.oracle.com/javase/tutorial/deployment/doingMoreWithRIA/devGuidelines.html

以下指南提供了您可以采取的步骤,以减少您向用户提供的富互联网应用程序(RIA)的漏洞性。

  • 遵循安全编码指南

  • 使用最新版本的 JRE 进行测试

  • 包含清单属性

  • 使用已签名的 JNLP 文件

  • 签名和时间戳 JAR 文件

  • 使用 HTTPS 协议

  • 避免本地 RIA

遵循安全编码指南

遵循Java 编程语言安全编码指南中的建议。第 4 节“可访问性和可扩展性”描述了如何限制对类和包的访问权限,从而降低代码的漏洞性。

JavaScript 代码被认为是不安全的,并且默认情况下受到安全沙箱的限制。最小化您的 RIA 与 JavaScript 代码之间的交互。谨慎使用AccessController.doPrivileged块,因为它允许从任何 HTML 页面或 JavaScript 代码访问。

使用最新版本的 JRE 进行测试

确保您的 RIA 在最新的安全版本的 JRE 上运行。Java 平台支持 RIA 指定运行 RIA 所需的 Java 版本的能力,然而,要求用户维护多个 JRE 版本,尤其是旧的、不安全的版本,对用户来说是一个安全风险。

RIA 的一个好处是更新版本的 RIA 会自动下载到用户的系统中。测试您的 RIA 与每个 JRE 更新版本,并确保其正常工作。如果需要更改,请在服务器上更新您的 RIA,以便用户可以安装最新的 JRE 并仍然运行 RIA。

包含清单属性

向 JAR 文件清单添加属性,描述 RIA 的属性。与 JNLP 文件或applet标记中的值进行比较,以验证运行正确的代码。

当您的 RIA 不需要超出安全沙箱的访问权限时,请请求沙箱权限。Java 沙箱为用户提供了额外的保护,如果用户不理解为什么需要无限制访问其系统,则可能不运行特权应用程序。

清单属性还可用于标识可以访问您的 RIA 的位置。这包括 JavaScript 代码可以调用您的 RIA 的位置,以及可以启动您的 RIA 的 JNLP 文件或 applet 标记的位置。有关可用的清单属性的信息,请参阅使用清单属性增强安全性。

使用已签名的 JNLP 文件

如果您的 RIA 需要访问非安全系统属性或 JVM 参数,请使用已签名的 JNLP。如果需要外部和内部 JNLP 文件之间的某种变化,请使用 JNLP 模板。查看 已签名的 JNLP 文件 了解信息。

要访问非安全系统属性或 JVM 参数,请按照 设置受信任参数和安全属性 中描述的在 JNLP 文件中包含属性或参数。

对 JAR 文件进行签名和时间戳

从受信任的证书颁发机构获取代码签名证书,并用它来签署您的 RIA 的 JAR 文件。仅部署使用有效证书签名的 RIA 给用户。

当您对 JAR 文件进行签名时,也要对签名进行时间戳。时间戳验证证书在签署 JAR 时是有效的,因此当证书过期时,RIA 不会自动被阻止。查看 签署 JAR 文件 了解有关签署和时间戳的信息。

自签名和未签名的 RIA 被视为不安全,并且除非设置例外站点列表或部署规则集以允许特定应用程序运行,否则不允许运行。但是,自签名对于测试目的可能是有用的。要使用您的自签名 RIA 进行测试,您可以将自签名证书导入到受信任的密钥库中。

使用 HTTPS 协议

使用 HTTPS 协议为用户获取您的 RIA 的 Web 服务器。HTTPS 协议是加密的,并由服务器验证,使任何人更难篡改您的 RIA。

避免本地的 RIA

本地的 RIA 不适用于生产环境。为确保用户运行您打算让他们运行的代码,请将您的 RIA 托管在应用程序服务器上。

为了测试,建议使用 Web 服务器。另一个选项是将您的应用程序添加到例外站点列表中,在 Java 控制面板的安全选项卡中进行管理。

问题和练习:更多关于富互联网应用程序的内容

原文:docs.oracle.com/javase/tutorial/deployment/doingMoreWithRIA/QandE/questions.html

问题

  1. 真或假:富互联网应用程序(RIAs)可以通过在属性名称前加上"jnlp."来设置安全属性。

  2. 真或假:只有签名的富互联网应用程序(RIAs)才能使用 JNLP API 访问客户端上的文件。

练习

  1. 在以下的 JNLP 文件中,添加一个名为jnlp.foo的安全属性,并将其值设置为true

    <?xml version="1.0" encoding="UTF-8"?>
    <jnlp spec="1.0+" codebase="" href="">
        <information>
            <title>Dynamic Tree Demo</title>
            <vendor>Dynamic Team</vendor>
    
        </information>
        <resources>
            <!-- Application Resources -->
            <j2se version="1.6+" href=
                "http://java.sun.com/products/autodl/j2se" />
            <jar href="DynamicTreeDemo.jar" main="true" />
        </resources>
        <applet-desc 
           name="Dynamic Tree Demo Applet"
           main-class="components.DynamicTreeApplet"
           width="300"
           height="300">
         </applet-desc>
         <update check="background"/>
    </jnlp>                           
    
    

检查你的答案。

课程:深入部署

原文:docs.oracle.com/javase/tutorial/deployment/deploymentInDepth/index.html

富互联网应用程序(RIA)部署涉及各种技术和工具,如 Java 网络启动协议(JNLP)、部署工具包、pack200、jarsigner 等。本课程探讨了这些技术和工具如何帮助开发人员部署 RIA(小程序和 Java Web 启动应用程序)。

参与 RIA 部署的主要组件如下:

  • RIA 将部署在其中的 HTML 页面

  • RIA 的 JNLP 文件

  • 包含 RIA 类文件和资源的 JAR 文件

这些组件在后续主题中会提到。

用户接受 RIA

原文:docs.oracle.com/javase/tutorial/deployment/deploymentInDepth/userAcceptance.html

为了安全起见,在首次启动 RIA 之前,用户会被提示是否允许运行 RIA,即使应用程序已签名或不需要超出安全沙箱的访问权限。提示包括以下信息,取决于正在运行的 RIA:

  • RIA 的名称,或者通知应用程序未签名。

  • 如果应用程序使用来自受信任机构颁发的证书进行签名,则会显示有关发布者的信息。如果证书已过期,则会包含警告。如果应用程序是自签名的,则发布者显示为 UNKNOWN。

  • 如果证书已过期、被吊销或无法检查吊销状态,则会收到警告。

  • 应用程序访问的位置。

  • 应用程序所需的访问级别。有限访问将应用程序限制在安全沙箱中,无限制访问将使应用程序能够访问用户系统上的资源。

  • 如果建议的属性不存在,则会警告缺少 JAR 文件清单属性。

  • 对于未签名或自签名的应用程序,用户必须选择接受应用程序的复选框。

  • 在某些情况下,有选择不再显示提示的选项。

有关提示的描述,请参阅当我看到 Java 的安全提示时应该怎么做?

如果用户运行的 JRE 版本过时,他们也会收到警告,并有机会在运行应用程序之前更新到最新版本。用户还可以选择使用系统上的 JRE 运行,或者阻止应用程序运行。

Java 控制面板中的安全级别设置确定用户是否有机会运行 RIA。默认设置为高,会提示用户是否允许运行使用有效证书签名并在主 JAR 文件的清单中包含 Permissions 属性的应用程序。如果无法检查应用程序的吊销状态,则用户还可以在用户的许可下运行应用程序。

对 RIA 进行签名为用户提供了一定程度的信任。在准备应用程序部署时,请考虑以下事项:

  • 最佳用户体验是由使用受认可证书颁发机构颁发的证书签名的应用程序提供的。

  • 除非已创建例外站点列表或部署规则集以明确允许应用程序运行,否则不允许运行自签名和未签名的应用程序。

  • 签名应用程序可以是特权应用程序或沙箱应用程序。特权应用程序可以无限制地访问用户系统上的资源。沙箱应用程序受限于 Java 安全沙箱。未签名应用程序受限于沙箱。

部署工具包

原文:docs.oracle.com/javase/tutorial/deployment/deploymentInDepth/depltoolkit_index.html

部署工具包脚本是一组 JavaScript 函数,可以帮助开发人员在各种浏览器和操作系统配置中一致地部署丰富的互联网应用程序(RIA)。部署工具包脚本评估底层浏览器和操作系统,并使用正确的 HTML 部署 RIA。此脚本还可以确保客户端计算机上存在所需版本的 Java 运行时环境(JRE)软件。部署工具包脚本是在 Java 平台标准版 6 更新 10 发布中引入的。

部署工具包脚本位置

部署工具包脚本位于以下网址:

  • **http:**//www.java.com/js/deployJava.js(见 note)。

  • **https:**//www.java.com/js/deployJava.js – 在安全页面部署您的小程序时,请使用来自此安全位置的部署工具包脚本,以避免页面加载时出现混合内容警告。


注意: **http:**//www.java.com/js/deployJava.js 网址正在逐步淘汰。请使用 **https:**//www.java.com/js/deployJava.js 网址启动所有应用程序。


此位置的 JavaScript 代码已经被最小化,以便快速加载。您可以在https://www.java.com/js/deployJava.txt查看带有相关注释块的 JavaScript 代码的可读版本。


注意: 客户端浏览器应启用 JavaScript 解释器,以便部署工具包脚本能够正确运行并部署您的 RIA。


部署小程序

原文:docs.oracle.com/javase/tutorial/deployment/deploymentInDepth/runAppletFunction.html

你可以通过使用部署工具包脚本的runApplet函数来部署小程序。runApplet函数确保客户端上存在所需的最低版本的 Java 运行环境(JRE)软件,然后运行小程序。runApplet函数生成一个带有提供信息的 HTML <applet>标签。


注意: 根据浏览器类型,当尝试查看网页源代码时,可能无法查看部署工具包脚本生成的 HTML。要查看生成的 HTML,请尝试在加载后保存 HTML 页面,或使用类似 Firebug(Mozilla Firefox 附加组件)的工具。


你可以通过指定部署选项作为<applet>标签的属性和参数来部署小程序。你也可以在 Java 网络启动协议(JNLP)文件中指定部署选项以利用高级功能。有关此协议的更多信息,请参阅 Java 网络启动协议主题。


注意:

如果客户端没有所需的 JRE 软件的最低版本,部署工具包脚本会将浏览器重定向到http://www.java.com,以允许用户下载最新的 JRE 软件。在某些平台上,用户可能在查看包含小程序的网页之前被重定向。


runApplet函数的参数取决于是否使用 JNLP。通过 JNLP 部署的小程序只能在客户端机器上存在下一代 Java 插件软件时运行(下一代 Java 插件软件是在 Java 平台标准版 6 更新 10 发布中引入的)。

下一节将展示如何在将显示小程序的 HTML 页面中使用runApplet函数。描述了以下使用场景:

  • 作为属性和参数名称值对指定部署选项

  • 使用jnlp_href参数在 JNLP 文件中指定部署选项

  • 指定属性和参数名称值对以及 JNLP 文件(使小程序能够在旧版和下一代 Java 插件软件上运行)

函数签名: runApplet: function(attributes, parameters, minimumVersion)

参数:

  • attributes – 生成的<applet>标签的属性的名称和值

  • parameters – 生成的<applet>标签中<param>标签的名称和值

  • minimumVersion – 运行此小程序所需的 JRE 软件的最低版本

用法:

  • 作为属性和参数名称值对指定部署选项

    作为属性名称值对传递的属性和参数将被写入生成的<applet>标签中的属性和嵌套的<param>标签中。以这种方式部署的小程序可以通过旧版 Java 插件软件运行。

    // launch the Java 2D applet on JRE version 1.6.0
    // or higher with one parameter (fontSize)
    <script src=
        "https://www.java.com/js/deployJava.js"></script>
    <script>
        var attributes = {code:'java2d.Java2DemoApplet.class',
            archive:'Java2Demo.jar', width:710, height:540};
        var parameters = { fontSize:16, permissions:'sandbox' };
        var version = '1.6';
        deployJava.runApplet(attributes, parameters, version);
    </script>
    
    

    在浏览器中打开DeployUsingNameValuePairs.html以查看 Java2D 小程序。


    注意: 如果你看不到小程序在运行,你需要至少安装Java SE 开发工具包(JDK)7版本。


  • 使用jnlp_href参数在 JNLP 文件中指定部署选项

    作为属性名称值对传递的属性和参数(在这种情况下是jnlp_href)将被写入生成的<applet>标签中的属性和嵌套的<param>标签中。以这种方式部署的小程序只能通过下一代 Java 插件软件运行。最好将小程序的宽度和高度指定为属性,如下所示:

    <script src="https://www.java.com/js/deployJava.js"></script>
    <script> 
        var attributes = { code:'java2d.Java2DemoApplet', width:710, height:540 }; 
        var parameters = { jnlp_href: 'java2d.jnlp' }; 
        deployJava.runApplet(attributes, parameters, '1.6'); 
    </script>
    
    

    在浏览器中打开DeployUsingJNLP.html以查看 Java2D 小程序。


    注意: 如果你看不到小程序在运行,你需要至少安装Java SE 开发工具包(JDK)6 更新 10版本。


  • 指定属性和参数名称值对以及 JNLP 文件

    通过使用 JNLP 部署的小程序只能在最终用户的浏览器上运行下一代 Java 插件软件。如果你希望你的小程序也在旧版 Java 插件软件上运行,请使用属性和参数名称值对以及 JNLP 文件指定部署选项。

    
    <script src="https://www.java.com/js/deployJava.js"></script>
    <script>  
        var attributes = {code:'java2d.Java2DemoApplet.class', 
                archive:'Java2Demo.jar', width:710, height:540}; 
        var parameters = { fontSize:16, jnlp_href:'java2d.jnlp' }; 
        var version = '1.6' ; 
        deployJava.runApplet(attributes, parameters, version);      
    </script>
    
    

如果一些部署选项在属性名称值对和 JNLP 文件中有不同的值,以下准则会很有帮助:

  • widthheight指定为属性名称值对(不在 JNLP 文件中)。

  • 将参数如imageboxbgcolor指定为参数名称值对(不在 JNLP 文件中)。这些参数在小程序启动过程中需要提前。

  • 在 JNLP 文件中,将codebase属性留空或指定绝对 URL。当codebase属性留空时,默认为包含 JNLP 文件的目录。

  • 如果小程序是使用 JNLP 文件启动的,则codecodebasearchive属性的值将从 JNLP 文件中获取。如果这些属性也分别作为属性名称值对指定,那么属性名称值对将被忽略。

在浏览器中打开DeployUsingNameValuePairsAndJNLP.html以查看 Java2D 小程序。


注意: 如果你看不到小程序在运行,你需要至少安装Java SE 开发工具包(JDK)7版本。


下载源代码以进一步进行实验。

在小程序标签中嵌入 JNLP 文件

原文:docs.oracle.com/javase/tutorial/deployment/deploymentInDepth/embeddingJNLPFileInWebPage.html

当使用 Java Network Launch Protocol (JNLP) 部署小程序时,Java 插件软件会在从网络下载 JNLP 文件后启动小程序。从 Java SE 7 版本开始,您可以通过将 JNLP 文件嵌入到网页中来减少小程序启动时间,从而避免第一次加载小程序时额外的网络请求。这将导致小程序在 Web 浏览器上快速启动。

在网页中部署小程序时,可以将 Base64 编码的 JNLP 文件嵌入到 jnlp_embedded 参数中。<jnlp> 元素的属性应满足以下限制:

  • href 属性应包含相对路径。

  • 不应指定 codebase 属性。这意味着代码库将从加载小程序的网页的 URL 派生。

以下步骤描述了如何在网页中嵌入 JNLP 文件以部署小程序。

  1. 为您的小程序创建一个JNLP文件。下面显示了一个示例文件。

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- href attribute contains relative path;
         codebase attribute not specified -->
    <jnlp href="dynamictree_applet.jnlp">
        <information>
            <title>Dynamic Tree Demo</title>
            <vendor>Dynamic Team</vendor>
        </information>
        <resources>
            <!-- Application Resources -->
            <j2se version="1.7+" />
            <jar href=
                "dist/applet_ComponentArch_DynamicTreeDemo/DynamicTreeDemo.jar" 
                 main="true" />
        </resources>
        <applet-desc 
             name="Dynamic Tree Demo Applet"
             main-class="appletComponentArch.DynamicTreeApplet"
             width="300"
             height="300">
         </applet-desc>
         <update check="background"/>
    </jnlp>
    
    
  2. 使用 Base64 方案对 JNLP 文件的内容进行编码。您可以使用任何 Base64 编码工具对 JNLP 文件进行编码。查看工具的用法以创建具有 Base64 编码的字符串。可以使用的一些工具和网站示例如下:

  3. 在网页中部署小程序时,指定 jnlp_embedded 参数,并将其值设置为 Base64 编码的 JNLP 字符串。确保只包含实际的 Base64 字节,不包含任何编码工具特定的头部或尾部。

    <script src="https://www.java.com/js/deployJava.js"></script>
    <script>
        var attributes = {} ;
        <!-- Base64 encoded string truncated below for readability -->
        var parameters = {jnlp_href: 'dynamictree_applet.jnlp',
            jnlp_embedded: 'PCEtLSANCi8qDQogKiBDb ... bmxwPg=='
        } ;
        deployJava.runApplet(attributes, parameters, '1.6');
    </script>
    
    

    一些编码工具可能会将编码后的字符串包装成几个 76 列的行。要在 JavaScript 代码中使用这种多行属性值,请将属性值指定为一组连接的字符串。如果小程序直接使用 <applet> HTML 标签部署,则可以按原样包含多行属性值。

在浏览器中打开AppletPage.html以查看通过在网页中嵌入 JNLP 文件启动的动态树演示小程序。


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



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


下载源代码以进一步进行实验的嵌入式 JNLP 示例。

posted @   绝不原创的飞龙  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
历史上的今天:
2023-04-12 NumPy 初学者指南中文第三版:11~14
2023-04-12 NumPy 初学者指南中文第三版:6~10
2023-04-12 NumPy 初学者指南中文第三版:1~5
2023-04-12 NumPy 秘籍中文第二版:11~12
2023-04-12 NumPy 秘籍中文第二版:6~10
2023-04-12 NumPy 秘籍中文第二版:1~5
2023-04-12 NumPy 秘籍中文第二版:十二、使用 NumPy 进行探索性和预测性数据分析
点击右上角即可分享
微信分享提示