Java 中文官方教程 2022 版(十一)(2)https://developer.aliyun.com/article/1486354
将核心功能与最终部署机制分离的好处
另一种创建 applet 的方法是只需移除抽象层(单独的顶部JPanel
)并在 applet 的init
方法中布置所有控件。直接在 applet 中创建 GUI 的缺点是,如果以后选择将功能部署为 Java Web Start 应用程序,则现在将更难部署您的功能。
在动态树演示示例中,核心功能位于DynamicTreePanel
类中。现在,将DynamicTreePanel
类放入JFrame
并部署为 Java Web Start 应用程序变得轻而易举。
因此,为了保持可移植性并保持部署选项开放,请按照本页描述的基于组件的设计。
下载源代码以进一步实验动态树演示程序示例。
部署一个 Applet
译文:
docs.oracle.com/javase/tutorial/deployment/applet/deployingApplet.html
要部署您的 Java applet,首先编译源代码,将其打包为 JAR 文件,并对 JAR 文件进行签名。
Java applet 可以以两种方式启动。
- 您可以使用 Java 网络启动协议(JNLP)启动您的 applet。使用 JNLP 启动的 applet 可以访问强大的 JNLP API 和扩展。
- 或者,您可以通过直接在 applet 标记中指定 applet 的启动属性来启动 applet。然而,这种部署 applet 的旧方法对 applet 施加了严格的安全限制。
部署工具包脚本包含可用于在网页中部署 applet 的有用 JavaScript 函数。
如果您对这些部署技术不熟悉,请在继续之前查看 深入部署 课程。
以下是一些逐步说明,用于打包和部署您的 applet。Dynamic Tree Demo applet 用于说明 applet 的部署。您可能希望设置构建脚本来执行以下一些步骤。
//
注意: 如果您看不到示例运行,请确保在浏览器中启用 JavaScript 解释器,以便部署工具包脚本能够正常运行。
- 编译您的 applet 的 Java 代码,并确保所有类文件和资源(如图像)位于单独的目录中。
在 DynamicTree Demo applet 的情况下,编译后的类文件将放置在build/classes/appletComponentArch
目录中。 - 创建一个包含您的 applet 需要的任何 JAR 文件清单属性的文本文件。
对于 DynamicTree Demo applet,创建一个名为mymanifest.txt
的文件在build/classes
目录中,并添加Permissions
、Codebase
和Application-Name
属性。该 applet 不需要访问用户系统资源,因此对于权限使用sandbox
。对于代码库,使用您将加载示例的域,例如myserver.com
。将以下属性添加到mymanifest.txt
文件中。
Permissions: sandbox Codebase: myserver.com Application-Name: Dynamic Tree Demo
- 其他清单属性可用于限制 applet 仅使用受信任的代码,并为需要在特权 Java 代码和沙箱 Java 代码之间进行调用,或者具有调用 applet 的 JavaScript 代码的 applet 提供安全性。请参阅 使用清单属性增强安全性 课程以了解更多可用的清单属性。
- 创建一个包含您 applet 的类文件和资源的 JAR 文件。在您之前创建的
mymanifest.txt
文件中包含清单属性。
例如,以下命令将创建一个 JAR 文件,其中包含build/classes/appletComponentArch
目录中的类文件和build/classes
目录中的清单文件。
% cd build/classes % jar cvfm DynamicTreeDemo.jar mymanifest.txt appletComponentArch
- 参阅 在 JAR 文件中打包程序 课程,了解有关创建和使用 JAR 文件的更多信息。
- 为您的 applet 签署 JAR 文件并为签名加上时间戳。使用由受信任的证书颁发机构颁发的有效的当前代码签名证书,向用户提供确保可以安全运行 applet 的保证。
请参阅 签署 JAR 文件 课程以获取更多信息。
如果您想要使用签名的 JNLP 文件以确保安全性,请按照下一步中描述的方式创建 JNLP 文件,并在签名 JAR 文件之前将其包含在 JAR 文件中。有关详细信息,请参阅 Java 平台标准版部署指南中的 签名的 JNLP 文件。 - 创建描述您的 applet 应如何启动的 JNLP 文件。
这是用于启动动态树演示 applet 的 JNLP 文件。dynamictree_applet.jnlp
的源代码如下:
<?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.7+" 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>
- 请注意,JNLP 文件中不存在请求额外权限的安全元素,因此 applet 仅在安全沙箱中运行。
主题,JNLP 文件的结构,描述了 JNLP 文件的语法和选项。 - 创建将显示 applet 的 HTML 页面。调用部署工具包函数以部署 applet。
在我们的示例中,动态树演示 applet 部署在AppletPage.html
中。
<body> <!-- ... --> <script src="https://www.java.com/js/deployJava.js"></script> <script> var attributes = { code:'components.DynamicTreeApplet', width:300, height:300} ; var parameters = {jnlp_href: 'dynamictree_applet.jnlp'} ; deployJava.runApplet(attributes, parameters, '1.7'); </script> <!-- ... --> </body>
- 将 applet 的 JAR 文件、JNLP 文件和 HTML 页面放置在适当的文件夹中。
对于此示例,请将DynamicTreeDemo.jar
、dynamictree_applet.jnlp
和AppletPage.html
放置在本地计算机或 Web 服务器上的同一目录中。建议使用 Web 服务器。要从本地计算机运行,必须将应用程序添加到例外站点列表中,该列表可从 Java 控制面板的安全选项卡中管理。 - 在浏览器中打开 applet 的 HTML 页面以查看 applet。在提示时同意运行 applet。检查 Java 控制台日志以查看错误和调试消息。
下载源代码 以进一步尝试 动态树演示 applet 示例。
使用 Applet 标签部署
原文:
docs.oracle.com/javase/tutorial/deployment/applet/html.html
如果您不确定最终用户的浏览器是否启用了 JavaScript 解释器,您可以通过手动编码 HTML 标签来部署您的 Java applet,而不是使用 Deployment Toolkit 函数。根据您需要支持的浏览器,您可能需要使用
或
HTML 标签来部署您的 Java applet。查看W3C HTML 规范以获取有关这些标签的使用详情。
您可以使用 Java 网络启动协议(JNLP)启动您的 applet,或者直接在
标签中指定启动属性。
部署准备
部署准备
按照部署 applet 主题中描述的步骤编译您的源代码,创建并签名 JAR 文件,如有必要创建 JNLP 文件。部署的整体步骤仍然相关。只有包含 applet 的 HTML 页面的内容会发生变化。
手动编码 Applet 标签,使用 JNLP 启动
手动编码 Applet 标签,使用 JNLP 启动
AppletPage_WithAppletTag.html
页面使用手动编码的 标签部署了 Dynamic Tree Demo applet(意味着该 applet 不是使用自动生成所需 HTML 的 Deployment Toolkit 部署的)。该 applet 仍然使用 JNLP 启动。JNLP 文件在
jnlp_href
属性中指定。
<applet code = 'appletComponentArch.DynamicTreeApplet' jnlp_href = 'dynamictree_applet.jnlp' width = 300 height = 300 />
手动编码 Applet 标签,无需使用 JNLP 启动
手动编码 Applet 标签,无需使用 JNLP 启动
使用 JNLP 是部署 applet 的首选方式,但您也可以在没有 JNLP 文件的情况下部署您的 applet。
AppletPage_WithAppletTagNoJNLP.html
部署了 Dynamic Tree Demo applet,如下面的代码片段所示。
<applet code = 'appletComponentArch.DynamicTreeApplet' archive = 'DynamicTreeDemo.jar' width = 300 height = 300> <param name="permissions" value="sandbox" /> </applet>
其中
code
是 applet 类的名称。archive
是包含 applet 及其资源的 jar 文件的名称。width
是 applet 的宽度。height
是 applet 的高度。permissions
表示 applet 是否在安全沙箱中运行。将值指定为"sandbox"以在沙箱中运行。将值指定为"all-permissions"以在沙箱外运行。如果未提供permissions
参数,则签名的 applet 默认为"all-permissions",未签名的 applet 默认为"sandbox"。
进一步使用小程序
进一步使用小程序
原文:
docs.oracle.com/javase/tutorial/deployment/applet/doingMoreWithApplets.html
Java 小程序 API 使您能够充分利用小程序与浏览器之间的密切关系。该 API 由
javax.swing.JApplet
类和java.applet.AppletContext
接口提供。小程序执行架构使小程序能够与其环境交互,从而产生丰富的用户体验。小程序可以操纵其父网页,与网页中的 JavaScript 代码交互,查找在同一网页中运行的其他小程序等等。
探索 Java 小程序的高级功能在后续主题中。
有关常见小程序和 Java Web 启动应用程序的高级主题的进一步信息,请参阅使用 Java 丰富互联网应用程序做更多事情(例如设置参数和属性,使用 Java 网络启动协议 API)。
查找和加载数据文件
查找和加载数据文件
原文:
docs.oracle.com/javase/tutorial/deployment/applet/data.html
每当 Java applet 需要从指定了相对 URL 的文件加载数据(指定了文件位置但不完全指定的 URL),applet 通常使用代码库或文档库来形成完整的 URL。
由
JApplet
的 getCodeBase
方法返回的代码库是一个 URL,指定了 applet 的类加载的目录。对于本地部署的 applet,getCodeBase
方法返回 null。
由
JApplet
的 getDocumentBase
方法返回的文档库指定包含 applet 的 HTML 页面的目录。对于本地部署的 applet,getDocumentBase
方法返回 null。
除非
标签指定了代码库,否则代码库和文档库都指向同一服务器上的同一目录。
applet 可能需要的数据,或者需要依赖的备份数据,通常相对于代码库指定。通常由 applet 开发人员指定的数据,通常通过使用参数指定,通常相对于文档库指定。
**注意:**出于安全原因,浏览器限制了不受信任的 applet 可以读取的 URL。例如,大多数浏览器不允许不受信任的 applet 使用 “…” 访问代码库或文档库上面的目录。此外,由于不受信任的 applet 不能读取除了位于 applet 源主机上的文件之外的文件,因此如果文档和不受信任的 applet 位于不同的服务器上,则文档库通常是无用的。
JApplet
类定义了方便的图像加载和声音加载方法,使您能够相对于基本 URL 指定图像和声音。例如,假设 applet 设置为以下图中显示的其中一个目录结构。
要创建一个使用
imgDir
下的 a.gif
图像文件的 Image
对象,applet 可以使用以下代码:
Image image = getImage(getCodeBase(), "imgDir/a.gif");
定义和使用 Applet 参数
定义和使用 Applet 参数
原文:
docs.oracle.com/javase/tutorial/deployment/applet/param.html
参数对于 Java applet 就像命令行参数对于应用程序一样重要。它们使用户能够自定义 applet 的操作。通过定义参数,你可以增加 applet 的灵活性,使其在多种情况下工作而无需重新编码和重新编译。
指定 Applet 的输入参数
指定 Applet 的输入参数
你可以在 applet 的 Java 网络启动协议(JNLP)文件或
标签的
元素中指定 applet 的输入参数。通常最好在 applet 的 JNLP 文件中指定参数,这样即使 applet 部署在多个网页上,参数也可以一致提供。如果 applet 的参数会因网页而异,则应在
标签的
元素中指定参数。
如果你对 JNLP 不熟悉,请查看 Java 网络启动协议 主题获取更多信息。
考虑一个需要三个参数的 applet。
paramStr
和 paramInt
参数在 applet 的 JNLP 文件中指定,applettakesparams.jnlp
。
<?xml version="1.0" encoding="UTF-8"?> <jnlp spec="1.0+" codebase="" href=""> <!-- ... --> <applet-desc name="Applet Takes Params" main-class="AppletTakesParams" width="800" height="50"> <param name="paramStr" value="someString"/> <param name="paramInt" value="22"/> </applet-desc> <!-- ... --> </jnlp>
paramOutsideJNLPFile
参数在传递给部署工具包脚本的 runApplet
函数的 parameters
变量中指定在 AppletPage.html
。
<html> <head> <title>Applet Takes Params</title> <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> </head> <body> <h1>Applet Takes Params</h1> <script src="https://www.java.com/js/deployJava.js"></script> <script> var attributes = { code:'AppletTakesParams.class', archive:'applet_AppletWithParameters.jar', width:800, height:50 }; var parameters = {jnlp_href: 'applettakesparams.jnlp', paramOutsideJNLPFile: 'fooOutsideJNLP' }; deployJava.runApplet(attributes, parameters, '1.7'); </script> </body> </html>
查看 部署 Applet 获取有关
runApplet
函数的更多信息。
检索 Applet 的输入参数
检索 Applet 的输入参数
你可以使用
Applet
类的 getParameter
方法来检索 applet 的输入参数。AppletTakesParams.java
applet 检索并显示其所有输入参数(paramStr
,paramInt
和 paramOutsideJNLPFile
)。
import javax.swing.JApplet; import javax.swing.SwingUtilities; import javax.swing.JLabel; public class AppletTakesParams extends JApplet { public void init() { final String inputStr = getParameter("paramStr"); final int inputInt = Integer.parseInt(getParameter("paramInt")); final String inputOutsideJNLPFile = getParameter("paramOutsideJNLPFile"); try { SwingUtilities.invokeAndWait(new Runnable() { public void run() { createGUI(inputStr, inputInt, inputOutsideJNLPFile); } }); } catch (Exception e) { System.err.println("createGUI didn't successfully complete"); } } private void createGUI(String inputStr, int inputInt, String inputOutsideJNLPFile) { String text = "Applet's parameters are -- inputStr: " + inputStr + ", inputInt: " + inputInt + ", paramOutsideJNLPFile: " + inputOutsideJNLPFile; JLabel lbl = new JLabel(text); add(lbl); } }
下面显示了
AppletTakesParams
applet。
//
注意: 如果你看不到 applet 运行,你需要安装至少 Java SE Development Kit (JDK) 6 update 10 版本。
注意: 如果你看不到示例运行,可能需要在浏览器中启用 JavaScript 解释器,以便部署工具包脚本能够正常运行。
下载源代码 以进一步进行实验。
显示短状态字符串
显示短状态字符串
原文:
docs.oracle.com/javase/tutorial/deployment/applet/showStatus.html
所有浏览器都允许 Java applets 显示一个简短的状态字符串。页面上的所有 Java applets 以及浏览器本身共享同一状态行。
永远不要将关键信息放在状态行中。如果许多用户可能需要该信息,请在 applet 区域内显示该信息。如果只有少数精通的用户可能需要该信息,请考虑将信息发送到标准输出(参见将诊断信息写入标准输出和错误流)。
状态行通常不太显眼,并且可能被其他 applets 或浏览器覆盖。因此,最好将其用于偶发的、短暂的信息。例如,一个加载多个图像文件的 applet 可能会显示当前正在加载的图像文件的名称。
Applets 使用
showStatus
方法显示状态行,该方法从Applet
类继承到JApplet
类。
这里是其使用示例:
showStatus("MyApplet: Loading image file " + file);
注意: 不要在状态行中放置滚动文本。浏览器用户会觉得这种行为非常恼人。
在浏览器中显示文档
在浏览器中显示文档
原文:
docs.oracle.com/javase/tutorial/deployment/applet/browser.html
一个 Java 小程序可以使用
java.applet.AppletContext
类中的 showDocument
方法在浏览器窗口中加载网页。
以下是
showDocument
的两种形式:
public void showDocument(java.net.URL *url*) public void showDocument(java.net.URL *url*, String *targetWindow*)
showDocument
的单参数形式简单地指示浏览器显示指定 URL 的文档,而不指定显示文档的窗口。
showDocument
的双参数形式允许您指定显示文档的窗口或 HTML 框架。第二个参数可以有以下值之一:
"_blank"
– 在一个新的、无名称的窗口中显示文档。"*windowName*"
– 在名为 windowName 的窗口中显示文档。如有必要,将创建此窗口。"_self"
– 在包含小程序的窗口和框架中显示文档。"_parent"
– 在小程序框架的父框架中显示文档。如果小程序框架没有父框架,则与"_self"
相同。"_top"
– 在顶层框架中显示文档。如果小程序框架是顶层框架,则与"_self"
相同。
注意: 在这个讨论中,frame 指的不是一个 Swing
JFrame
,而是浏览器窗口内的 HTML 框架。
以下小程序使您可以尝试
showDocument
两种形式的每个参数。该小程序打开一个窗口,让您输入 URL 并选择 targetWindow
参数的选项。当您按下 Return 键或点击显示文档按钮时,小程序调用 showDocument
。
//
注意: 如果您看不到示例运行,可能需要在浏览器中启用 JavaScript 解释器,以便部署工具包脚本能够正常运行。
以下是调用
showDocument
的小程序代码。这是整个程序,ShowDocument
。
*...//In an Applet subclass:* urlWindow = new URLWindow(getAppletContext()); . . . class URLWindow extends Frame { ... public URLWindow(AppletContext appletContext) { ... this.appletContext = appletContext; ... } ... public boolean action(Event event, Object o) { ... String urlString = */* user-entered string */*; URL url = null; try { url = new URL(urlString); } catch (MalformedURLException e) { *...//Inform the user and return...* } if (url != null) { if (*/* user doesn't want to specify the window */*) { appletContext.showDocument(url); } else { appletContext.showDocument(url, */* user-specified window */*); } } ...
下载源代码 以进一步尝试 Show Document 示例。
从小程序调用 JavaScript 代码
从小程序调用 JavaScript 代码
原文:
docs.oracle.com/javase/tutorial/deployment/applet/invokingJavaScriptFromApplet.html
Java 小程序可以调用与小程序在同一网页中的 JavaScript 函数。LiveConnect 规范描述了 JavaScript 代码如何与 Java 代码通信的详细信息。
netscape.javascript.JSObject
类使 Java 小程序能够检索对 JavaScript 对象的引用并与网页交互。接下来描述的数据摘要小程序调用 JavaScript 代码从网页中检索信息,并将数据摘要写回网页。
假设您有一个带有几个 JavaScript 函数的网页。示例
AppletPage.html
具有用于检索年龄、地址和电话号码的 JavaScript 函数。还有一个名为userName
的变量,一开始没有值。
<head> <title>Data Summary Applet Page - Java to JavaScript LiveConnect</title> <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"/> <script language="javascript"> var userName = ""; // returns number function getAge() { return 25; } // returns an object function address() { this.street = "1 Example Lane"; this.city = "Santa Clara"; this.state = "CA"; } // returns an array function getPhoneNums() { return ["408-555-0100", "408-555-0102"]; } function writeSummary(summary) { summaryElem = document.getElementById("summary"); summaryElem.innerHTML = summary; } </script> <!-- ... --> </head> <body> <script src = "https://www.java.com/js/deployJava.js"></script> <script> <!-- ... --> deployJava.runApplet(attributes, parameters, '1.6'); </script> <!-- ... --> <p id="summary"/> // this HTML element contains // the summary <!-- ... --> </body>
Java 中文官方教程 2022 版(十一)(4)https://developer.aliyun.com/article/1486356