Java 中文官方教程 2022 版(十二)(2)https://developer.aliyun.com/article/1486358
课程:使用 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 虚拟机参数和安全属性。对于小程序,你还可以在标签的
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
中看到小程序运行。
//
注意: 如果你看不到小程序运行,你需要安装至少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 也可以在用户许可的情况下执行以下操作:
他们可以使用
FileOpenService
和FileSaveService
API 访问用户的文件系统。他们可以使用
ClipboardService
API 访问共享的系统剪贴板。他们可以使用
PrintService
API 访问打印功能。他们可以使用
PersistenceService
API 访问持久性存储。他们可以使用
DownloadService
API 控制 RIA 的下载和缓存方式。他们可以使用
DownloadServiceListener
API 确定 RIA 下载的进度。他们可以使用
SingleInstanceService
API 决定在启动多个 RIA 实例时如何处理参数。他们可以使用
ExtendedService
API 请求权限打开以前未打开过的某些文件。
查看JNLP API 文档以查看通过 JNLP 启动的 RIA 可用功能的完整列表。
使用 JNLP API 访问客户端
原文:
docs.oracle.com/javase/tutorial/deployment/doingMoreWithRIA/usingJNLPAPI.html
当使用 Java 网络启动协议(JNLP)启动时,富互联网应用程序(RIA)可以在用户许可的情况下访问客户端。考虑文本编辑器小程序示例,以了解如何使用基于 JNLP API 的服务。文本编辑器具有文本区域和标有打开、保存和另存为的按钮。文本编辑器可用于打开现有文本文件,编辑它,并将其保存回磁盘。
接下来显示文本编辑器小程序。
//
注意: 如果您看不到小程序运行,请至少安装Java SE 开发工具包(JDK)6 更新 10版本。
注意: 如果您看不到示例运行,可能需要在浏览器中启用 JavaScript 解释器,以便部署工具包脚本能够正常运行。
TextEditor
和TextEditorApplet
类布局用户界面并将其显示为小程序。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
类的save
和saveAs
方法调用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 – 会话 cookie 存储在内存中,只要用户在使用 Web 应用程序,就可以访问。用户退出 Web 应用程序时,会话 cookie 会丢失。这些 cookie 由会话 ID 标识,最常用于存储购物车的详细信息。
永久 cookie – 永久 cookie 用于存储长期信息,如用户偏好和用户识别信息。永久 cookie 存储在持久存储中,用户退出应用程序时不会丢失。永久 cookie 在过期时会丢失。
富互联网应用程序中的 Cookie 支持
富互联网应用程序(小程序和 Java Web Start 应用程序)支持会话和永久 cookie。底层的 cookie 存储取决于客户端的浏览器和操作系统。
要了解更多关于 cookie 的信息,请参阅以下内容:
在 Java 教程中的处理 Cookie 课程
CookieManager 的 API 文档和相关类
访问 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。
Java 中文官方教程 2022 版(十二)(4)https://developer.aliyun.com/article/1486360