Java 中文官方教程 2022 版(十二)(1)https://developer.aliyun.com/article/1486357
解决常见小程序问题
原文:
docs.oracle.com/javase/tutorial/deployment/applet/problemsindex.html
本节涵盖了在编写 Java 小程序时可能遇到的一些常见问题。每个问题后面都列出了可能的原因和解决方案。
问题: 我的小程序没有显示。
- 检查 Java 控制台日志以查看错误。
- 检查小程序的 Java 网络启动协议(JNLP)文件的语法。不正确的 JNLP 文件是失败的最常见原因,而没有明显的错误。
- 如果使用部署工具包的
runApplet
函数部署,请检查 JavaScript 语法。有关详细信息,请参阅部署小程序。
问题: Java 控制台日志显示 java.lang.ClassNotFoundException。
- 确保你的 Java 源文件编译正确。
- 如果使用
标签部署,请检查
archive
属性中小程序 JAR 文件的路径是否准确。 如果使用 JNLP 文件启动,请检查 JNLP 文件中
jar
标签中的路径。确保小程序的 JAR 文件、JNLP 文件和网页位于正确的目录中,并准确引用彼此。
关闭浏览器并重新运行构建。浏览器很可能锁定了 JAR 文件,导致构建过程无法重新生成 JAR 文件。
网页上的小程序很可能是使用部署工具包脚本部署的。小程序可能需要比客户端当前存在的 Java 运行时环境软件版本更高的版本。检查小程序网页中
runApplet
函数的minimumVersion
参数。有关详细信息,请参阅部署小程序。你可能正在查看之前缓存的小程序版本。关闭浏览器。打开 Java 控制面板并删除临时互联网文件。这将从缓存中删除你的小程序。尝试重新查看你的小程序。
一个 applet 可以继承哪些类?
你如何使用
start()
方法?真或假:一个 applet 可以与互联网上的任何主机建立网络连接。
如何从 applet 的代码中获取在 JNLP 文件中指定的参数的值?
哪个类使 applets 能够与 applet 网页中的 JavaScript 代码交互?
真或假:Applets 可以修改父网页的内容。
Exercise
applet 的父网页有一个名为memberId
的 JavaScript 变量。写出在 applet 的start
方法中将memberId
的值设置为"123489"的代码。使用 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 应用程序的更新会在用户从桌面独立运行应用程序时自动下载。
创建一个
MyTopJPanel
类,它是JPanel
的子类。在MyTopJPanel
类的构造函数中布局应用程序的 GUI 组件。创建一个名为
MyApplication
的类,它是JFrame
类的子类。在
MyApplication
类的main
方法中,实例化MyTopJPanel
类,并将其设置为JFrame
的内容窗格。images/save.gif
images/cut.gif
编译您的应用程序的 Java 代码,并确保所有类文件和资源(如图像)位于单独的目录中。
在动态树演示应用程序中,编译后的类文件放置在build/classes/webstartComponentArch
目录中。创建一个包含您的小程序所需的任何 JAR 文件清单属性的文本文件。
对于 DynamicTree 演示小程序,创建一个名为mymanifest.txt
的文件,放在build/classes
目录中,并添加Permissions
,Codebase
和Application-Name
属性。该小程序不需要访问用户系统资源,因此对于权限使用sandbox
。对于代码库,请使用将加载示例的域,例如myserver.com
。将以下属性添加到mymanifest.txt
文件中。其他清单属性可用于限制小程序仅使用受信任的代码,并为需要在特权 Java 代码和沙箱 Java 代码之间进行调用,或具有调用小程序的 JavaScript 代码的小程序提供安全性。请参阅使用清单属性增强安全性课程,了解更多可用的清单属性。
创建一个包含应用程序类文件和资源的 JAR 文件。在上一步中创建的
mymanifest.txt
文件中包含清单属性。
例如,以下命令将在build/classes/webstartComponentArch
目录中的类文件和build/classes
目录中的清单文件创建一个 JAR 文件。参见在 JAR 文件中打包程序课程,了解有关创建和使用 JAR 文件的更多信息。
为您的小程序签署 JAR 文件并为签名加上时间戳。使用由受信任的证书颁发机构颁发的有效、当前的代码签名证书,向您的用户提供确保可以安全运行小程序的保证。
有关更多信息,请参见签署 JAR 文件课程。
如果您想要为安全性使用已签名的 JNLP 文件,请按照下一步中的说明创建 JNLP 文件,并在签名 JAR 文件之前将其包含在 JAR 文件中。有关详细信息,请参阅已签名的 JNLP 文件中的 Java 平台标准版部署指南。创建一个描述应用程序如何启动的 JNLP 文件。
以下是用于启动动态树演示应用程序的 JNLP 文件。对于此应用程序,不会请求权限,因此它在安全沙箱中运行。dynamictree_webstart.jnlp
的源代码如下:JNLP 文件的结构描述了 JNLP 文件的语法和选项。
注意: 在部署将在至少 Java SE 6 更新 18 版本或更高版本上运行的 Java Web Start 应用程序时,
codebase
和href
属性是可选的。在部署将在早期版本的 Java Runtime Environment 软件上运行的 Java Web Start 应用程序时,必须指定codebase
和href
属性。创建 HTML 页面,从中启动您的应用程序。调用部署工具包函数来部署 Java Web Start 应用程序。
在示例中,动态树演示应用程序部署在JavaWebStartAppPage.html
中。如果您不确定最终用户的浏览器中是否启用了 JavaScript 解释器,您可以通过直接创建指向 JNLP 文件的链接来部署 Java Web Start 应用程序,如下所示:
如果您通过直接链接部署 Java Web Start 应用程序,则无法利用部署工具包函数提供的额外检查。有关详细信息,请参阅部署 Java Web Start 应用程序中的深入部署课程。
将应用程序的 JAR 文件、JNLP 文件和 HTML 页面放在适当的文件夹中。
对于这个示例,将DynamicTreeDemo.jar
、dynamictree_webstart.jnlp
和JavaWebStartAppPage.html
放在本地计算机或 Web 服务器上的同一目录中。最好使用 Web 服务器。要从本地计算机运行,必须将应用程序添加到例外站点列表中,该列表可从 Java 控制面板的安全选项卡中管理。在浏览器中打开应用程序的 HTML 页面以查看应用程序。在提示时同意运行应用程序。检查 Java 控制台日志以查看错误和调试消息。
从浏览器中运行 Java Web Start 应用程序
从 Java 缓存查看器中运行 Java Web Start 应用程序
从桌面中运行 Java Web Start 应用程序
打开控制面板。
双击 Java 图标。Java 控制面板将打开。
选择“常规”选项卡。
点击“查看”。Java 缓存查看器将打开。
保护用户免受可能影响本地文件的恶意代码
保护企业免受可能试图访问或破坏网络数据的代码
安装您自己的
https
处理程序,以替换 Java Web Start 的https
处理程序。在您的应用程序中,只有在创建第一个
https URL
对象之后才调用HttpsURLConnection.setDefaultSSLSocketFactory
或HttpsURLConnection.setDefaultHostnameVerifier
,这会首先执行 Java Web Start 的https
处理程序初始化代码。在要运行 Java Web Start 应用程序的链接中,指定了哪个文件作为
a
标签的href
属性?Web 服务器必须识别哪种 MIME 类型才能托管 Java Web Start 应用程序?
在应用程序的
JNLP
文件中,resources
元素内必须指定哪两个元素?哪个接口提供了控制 Java Web Start 应用程序资源如何被缓存的能力?
BasicService
DownloadService
PersistenceService
ExtendedService
真或假:Java Web Start 应用程序默认在安全沙箱中运行。
真或假:如果 Java Web Start 应用程序在安全沙箱中运行,则应用程序的 JAR 文件可以位于不同的服务器上。
要使 Java Web Start 应用程序支持安全沙箱之外的操作,您必须做什么?
编写您将添加到
JNLP
文件中的 XML 代码,以请求应用程序完全访问客户端系统。对于一个 Java Web Start 应用程序,在 JAR 文件的
images
目录中有两个图标,one.gif
和two.gif
。编写您将用于访问这些图像的应用程序代码。
问题: 我曾经能够构建代码,但现在即使没有编译错误,构建也失败了。
问题: 当我尝试加载一个包含小程序的网页时,我的浏览器会在没有任何警告的情况下将我重定向到
www.java.com
。
问题: 我修复了一些错误并重新构建了我的小程序源代码。当我重新加载小程序的网页时,我的修复并没有显示出来。
问题和练习:Applets
原文:
docs.oracle.com/javase/tutorial/deployment/applet/QandE/questions.html
问题
练习
检查你的答案。
教程: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 软件作为 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 的一般步骤:
以下各节通过使用 Dynamic Tree Demo 应用程序更详细地探讨了这些步骤。如果您对 Swing 不熟悉,请参阅使用 Swing 创建 GUI 以了解更多关于使用 Swing GUI 组件的信息。
单击以下启动按钮以启动 Dynamic Tree Demo 应用程序。
//https://docs.oracle.com/javase/tutorialJWS/samples/deployment/dynamictree_webstartJWSProject/dynamictree_webstart.jnlp”; deployJava.createWebStartLaunchButton(url, ‘1.7.0’); //]]>
注意: 如果您看不到示例运行,请确保在浏览器中启用 JavaScript 解释器,以便部署工具包脚本能够正常运行。
创建顶级JPanel
类
JPanel
类创建一个
JPanel
的子类。这个顶级JPanel
充当所有其他 UI 组件的容器。在下面的示例中,DynamicTreePanel
类是最顶层的JPanel
。DynamicTreePanel
类的构造函数调用其他方法来正确创建和布局 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 文件中存在以下条目:
部署 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 应用程序的部署。您可能希望设置构建脚本来执行以下一些步骤。
单击以下启动按钮以启动动态树演示应用程序。
//https://docs.oracle.com/javase/tutorialJWS/samples/deployment/dynamictree_webstartJWSProject/dynamictree_webstart.jnlp” deployJava.createWebStartLaunchButton(url, ‘1.7.0’); //]]>
注意: 如果您看不到示例运行,请确保在浏览器中启用 JavaScript 解释器,以便部署工具包脚本能够正常运行。
Permissions: sandbox Codebase: myserver.com Application-Name: Dynamic Tree Demo
% cd build/classes % jar cvfm DynamicTreeDemo.jar mymanifest.txt webstartComponentArch
<?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>
<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>
<a href="/*absolute path to JNLP file*/dynamictree_webstart.jnlp">Launch Notepad Application</a>
下载源代码以进一步尝试动态树演示示例。
设置 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 运行时环境(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 缓存查看器:
应用程序将列在 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
系统属性来初始化SSLSocketFactory
和HostnameVerifier
的默认值。它使用方法HttpsURLConnection.setDefaultSSLSocketFactory
和HttpsURLConnection.setDefaultHostnameVerifier
设置默认值。
如果您的应用程序使用这两种方法,请确保它们在 Java Web Start 初始化
https
处理程序之后被调用,否则您的自定义处理程序将被 Java Web Start 默认处理程序替换。
您可以确保使用自定义的
SSLSocketFactory
和HostnameVerifier
之一:
常见的 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
问题
练习
检查您的答案。
Java 中文官方教程 2022 版(十二)(3)https://developer.aliyun.com/article/1486359