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

本文涉及的产品
函数计算FC,每月免费额度15元,12个月
简介: Java 中文官方教程 2022 版(十二)

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 也可以在用户许可的情况下执行以下操作:

查看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 解释器,以便部署工具包脚本能够正常运行。


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

Java 中文官方教程 2022 版(十二)(4)https://developer.aliyun.com/article/1486360

相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
相关文章
|
4天前
|
前端开发 Java Maven
【前端学java】全网最详细的maven安装与IDEA集成教程!
【8月更文挑战第12天】全网最详细的maven安装与IDEA集成教程!
20 2
【前端学java】全网最详细的maven安装与IDEA集成教程!
|
9天前
|
存储 网络协议 Oracle
java教程
java教程【8月更文挑战第11天】
14 5
|
1月前
|
SQL 安全 Java
「滚雪球学Java」教程导航帖(更新2024.07.16)
《滚雪球学Spring Boot》是一个面向初学者的Spring Boot教程,旨在帮助读者快速入门Spring Boot开发。本专通过深入浅出的方式,将Spring Boot开发中的核心概念、基础知识、实战技巧等内容系统地讲解,同时还提供了大量实际的案例,让读者能够快速掌握实用的Spring Boot开发技能。本书的特点在于注重实践,通过实例学习的方式激发读者的学习兴趣和动力,并引导读者逐步掌握Spring Boot开发的实际应用。
42 1
「滚雪球学Java」教程导航帖(更新2024.07.16)
WXM
|
25天前
|
Oracle Java 关系型数据库
Java JDK下载安装及环境配置超详细图文教程
Java JDK下载安装及环境配置超详细图文教程
WXM
129 3
|
1月前
|
测试技术 API Android开发
《手把手教你》系列基础篇(九十七)-java+ selenium自动化测试-框架设计篇-Selenium方法的二次封装和页面基类(详解教程)
【7月更文挑战第15天】这是关于自动化测试框架中Selenium API二次封装的教程总结。教程中介绍了如何设计一个支持不同浏览器测试的页面基类(BasePage),该基类包含了对Selenium方法的二次封装,如元素的输入、点击、清除等常用操作,以减少重复代码。此外,页面基类还提供了获取页面标题和URL的方法。
44 2
|
1月前
|
Web App开发 XML Java
《手把手教你》系列基础篇(九十六)-java+ selenium自动化测试-框架之设计篇-跨浏览器(详解教程)
【7月更文挑战第14天】这篇教程介绍了如何使用Java和Selenium构建一个支持跨浏览器测试的自动化测试框架。设计的核心是通过读取配置文件来切换不同浏览器执行测试用例。配置文件中定义了浏览器类型(如Firefox、Chrome)和测试服务器的URL。代码包括一个`BrowserEngine`类,它初始化配置数据,根据配置启动指定的浏览器,并提供关闭浏览器的方法。测试脚本`TestLaunchBrowser`使用`BrowserEngine`来启动浏览器并执行测试。整个框架允许在不同浏览器上运行相同的测试,以确保兼容性和一致性。
47 3
|
1月前
|
存储 Web App开发 Java
《手把手教你》系列基础篇(九十五)-java+ selenium自动化测试-框架之设计篇-java实现自定义日志输出(详解教程)
【7月更文挑战第13天】这篇文章介绍了如何在Java中创建一个简单的自定义日志系统,以替代Log4j或logback。
135 5
|
1月前
|
Java 数据安全/隐私保护
Java无模版导出Excel 0基础教程
经常写数据导出到EXCEL,没有模板的情况下使用POI技术。以此作为记录,以后方便使用。 2 工具类 样式工具: 处理工具Java接口 水印工具 导出Excel工具类 3 测试代码 与实际复杂业务不同 在此我们只做模拟 Controller Service 4 导出测试 使用Postman进行接口测试,没接触过Postman的小伙伴可以看我这篇博客Postman导出excel文件保存为文件可以看到导出很成功,包括水印 sheet页名称自适应宽度。还有一些高亮……等功能可以直接搜索使用
Java无模版导出Excel 0基础教程
|
1月前
|
设计模式 测试技术 Python
《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
【7月更文挑战第10天】Page Object Model (POM)是Selenium自动化测试中的设计模式,用于提高代码的可读性和维护性。POM将每个页面表示为一个类,封装元素定位和交互操作,使得测试脚本与页面元素分离。当页面元素改变时,只需更新对应页面类,减少了脚本的重复工作和维护复杂度,有利于团队协作。POM通过创建页面对象,管理页面元素集合,将业务逻辑与元素定位解耦合,增强了代码的复用性。示例展示了不使用POM时,脚本直接混杂了元素定位和业务逻辑,而POM则能解决这一问题。
43 6
|
1月前
|
设计模式 Java 测试技术
《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
【7月更文挑战第12天】在本文中,作者宏哥介绍了如何在不使用PageFactory的情况下,用Java和Selenium实现Page Object Model (POM)。文章通过一个百度首页登录的实战例子来说明。首先,创建了一个名为`BaiduHomePage1`的页面对象类,其中包含了页面元素的定位和相关操作方法。接着,创建了测试类`TestWithPOM1`,在测试类中初始化WebDriver,设置驱动路径,最大化窗口,并调用页面对象类的方法进行登录操作。这样,测试脚本保持简洁,遵循了POM模式的高可读性和可维护性原则。
27 2