Java 中文官方教程 2022 版(十一)(1)https://developer.aliyun.com/article/1486353
要运行此测试,请将?i)foo
输入为正则表达式。这个错误是程序员在嵌入式标志表达式(?i)
中忘记开括号的常见情况。这样做将产生以下结果:
Enter your regex: ?i) There is a problem with the regular expression! The pattern in question is: ?i) The description is: Dangling meta character '?' The message is: Dangling meta character '?' near index 0 ?i) ^ The index is: 0
从这个输出中,我们可以看到语法错误是在索引 0 处的悬空元字符(问号)。缺少的开括号是罪魁祸首。
Unicode 支持
原文:
docs.oracle.com/javase/tutorial/essential/regex/unicode.html
从 JDK 7 版本开始,正则表达式模式匹配已扩展功能以支持 Unicode 6.0。
- 匹配特定代码点
- Unicode 字符属性
匹配特定代码点
您可以使用形式为\uFFFF
的转义序列匹配特定的 Unicode 代码点,其中FFFF
是您想匹配的代码点的十六进制值。例如,\u6771
匹配东方的汉字。
或者,您可以使用 Perl 风格的十六进制表示法指定一个代码点,\x{...}
。例如:
String hexPattern = "\x{" + Integer.toHexString(codePoint) + "}";
Unicode 字符属性
每个 Unicode 字符除了其值之外,还具有某些属性或特性。您可以使用表达式\p{*prop*}
匹配属于特定类别的单个字符。您可以使用表达式\P{*prop*}
匹配不属于特定类别的单个字符。
支持的属性类型有脚本、区块和“通用”类别。
脚本
要确定代码点是否属于特定脚本,您可以使用script
关键字或sc
的简写形式,例如,\p{script=Hiragana}
。或者,您可以在脚本名称前加上字符串Is
,例如\p{IsHiragana}
。
Pattern
支持的有效脚本名称是UnicodeScript.forName
接受的那些。
区块
可以使用block
关键字或blk
的简写形式指定一个区块,例如,\p{block=Mongolian}
。或者,您可以在区块名称前加上字符串In
,例如\p{InMongolian}
。
Pattern
支持的有效区块名称是UnicodeBlock.forName
接受的那些。
通用类别
类别可以用可选前缀Is
指定。例如,IsL
匹配 Unicode 字母的类别。类别也可以通过使用general_category
关键字或简写形式gc
来指定。例如,大写字母可以使用general_category=Lu
或gc=Lu
来匹配。
支持的类别是由Character
类指定的Unicode 标准版本中的类别。
其他资源
原文:
docs.oracle.com/javase/tutorial/essential/regex/resources.html
现在您已经完成了关于正则表达式的这节课,您可能会发现您的主要参考资料将是以下类的 API 文档:Pattern
、Matcher
和PatternSyntaxException
。
对于正则表达式构造的行为更精确的描述,我们建议阅读 Jeffrey E. F. Friedl 的书籍精通正则表达式。
问题和练习:正则表达式
原文:
docs.oracle.com/javase/tutorial/essential/regex/QandE/questions.html
问题
java.util.regex
包中有哪三个公共类?描述每个类的目的。- 考虑字符串字面值
"foo"
。起始索引是多少?结束索引是多少?解释这些数字的含义。 - 普通字符和元字符之间有什么区别?举例说明。
- 如何让一个元字符表现得像一个普通字符?
- 一组字符被方括号括起来叫什么?它的作用是什么?
- 这里有三个预定义的字符类:
\d
、\s
和\w
。描述每一个,并使用方括号重写它们。 - 对于每个
\d
、\s
和\w
,写出两个简单的表达式,匹配相反的字符集。 - 考虑正则表达式
(dog){3}
。识别两个子表达式。这个表达式匹配什么字符串?
练习
- 使用反向引用编写一个表达式,只有当一个人的名字和姓氏相同时才匹配该人的名字。
检查你的答案。
路径:部署
Java 富互联网应用程序(RIA)是具有类似桌面应用程序特征的应用程序,但是通过互联网部署。Java RIA 可以作为 Java 小程序或 Java Web Start 应用程序开发和部署。
- 小程序 - Java 小程序在浏览器环境中运行。Java 插件软件控制 Java 小程序的执行和生命周期。
- Java Web Start 应用程序 - Java Web Start 应用程序首次通过浏览器启动。随后可以通过桌面快捷方式启动。一旦下载了 Java Web Start 应用程序并且用户接受了其安全证书,它的行为几乎像一个独立的应用程序。
基于组件的架构用于富互联网应用程序
在过去,决定将 Java 富互联网应用程序作为小程序在浏览器内部部署,还是作为 Java Web Start 应用程序在浏览器外部部署,可能会显著影响应用程序的设计。有了最新的 Java 插件,这个决定变得简单多了。
传统上,应用程序在 main
方法中构建其用户界面,包括顶级 Frame
。这种编程风格阻碍了应用程序在浏览器中的重新部署,因为它假定应用程序创建自己的 Frame
。在浏览器中作为小程序运行时,小程序是应该容纳应用程序用户界面的顶级容器。不需要顶级 Frame
。
在设计 Java 富互联网应用程序时,请使用基于组件的架构。尝试将其功能组织成一个或多个可以组合在一起的组件。在这种情况下,“组件”一词指的是 AWT Component
类的子类、Swing JComponent
类或另一个子类的 GUI 元素。例如,您可以有一个顶级 JPanel
,其中包含其他 UI 组件(如更多嵌套的 JPanels 和文本字段、组合框等)。通过这种设计,将核心功能部署为小程序或 Java Web Start 应用程序变得相对容易。
要部署为 Java 小程序,只需将核心功能封装在 Applet
或 JApplet
中,并添加必要的浏览器特定功能。要部署为 Java Web Start 应用程序,请将功能封装在 JFrame
中。
选择 Java 小程序和 Java Web Start 应用程序之间
富互联网应用程序决策指南包含详细信息,帮助您决定将代码部署为 Java 小程序还是 Java Web Start 应用程序。
自包含应用程序替代方案
自包含应用程序提供了一种部署选项,不需要浏览器。用户在本地安装您的应用程序,并类似于本机应用程序运行它。自包含应用程序包括运行应用程序所需的 JRE,因此用户始终拥有正确的 JRE。
本教程讨论了 RIA 和自包含应用程序的开发和部署。请查看新功能,了解客户端 Java 运行时环境(JRE)软件各个版本引入的功能。
支持工具
课程:Java 小程序
原文:
docs.oracle.com/javase/tutorial/deployment/applet/index.html
本课程讨论了 Java 小程序的基础知识,如何开发与环境交互丰富的小程序,以及如何部署小程序。
Java 小程序是一种特殊类型的 Java 程序,可以由启用了 Java 技术的浏览器从互联网上下载并运行。小程序通常嵌入在网页中,并在浏览器的上下文中运行。小程序必须是 java.applet.Applet
类的子类。Applet
类提供了小程序与浏览器环境之间的标准接口。
Swing 提供了 Applet
类的一个特殊子类,名为 javax.swing.JApplet
。应该使用 JApplet
类来构建使用 Swing 组件构建其图形用户界面(GUI)的所有小程序。
浏览器的 Java 插件软件管理小程序的生命周期。
使用 Web 服务器来测试本课程中的示例。不建议使用本地小程序,当 Java 控制面板中的安全级别设置为高或非常高时,本地小程序将被阻止。
注意: 要运行小程序,请在 Microsoft Edge 上使用 IE 模式。请参阅Microsoft Edge + Internet Explorer mode: Getting Started guide。
注意: 请确保您的客户端机器上至少安装了Java SE Development Kit (JDK) 6 update 10版本,然后再继续。您将需要此版本才能查看示例丰富的互联网应用程序并在不中断的情况下阅读后续章节。
开始使用小程序
原文:
docs.oracle.com/javase/tutorial/deployment/applet/getStarted.html
接下来展示的 HelloWorld 小程序是一个显示字符串"Hello World"的 Java 类。
//
注意: 如果你看不到示例运行,可能需要在浏览器中启用 JavaScript 解释器,以便部署工具包脚本能够正常运行。
以下是 HelloWorld 小程序的源代码:
import javax.swing.JApplet; import javax.swing.SwingUtilities; import javax.swing.JLabel; public class HelloWorld extends JApplet { //Called when this applet is loaded into the browser. public void init() { //Execute a job on the event-dispatching thread; creating this applet's GUI. try { SwingUtilities.invokeAndWait(new Runnable() { public void run() { JLabel lbl = new JLabel("Hello World"); add(lbl); } }); } catch (Exception e) { System.err.println("createGUI didn't complete successfully"); } } }
这样的小程序通常由浏览器中的Java 插件软件管理和运行。
下载源代码以进一步进行实验。
定义一个小程序子类
原文:
docs.oracle.com/javase/tutorial/deployment/applet/subclass.html
每个 Java 小程序都必须定义Applet
或JApplet
类的子类。在 Hello World 小程序中,这个子类被称为HelloWorld
。以下是HelloWorld
类的源代码。
import javax.swing.JApplet; import javax.swing.SwingUtilities; import javax.swing.JLabel; public class HelloWorld extends JApplet { //Called when this applet is loaded into the browser. public void init() { //Execute a job on the event-dispatching thread; creating this applet's GUI. try { SwingUtilities.invokeAndWait(new Runnable() { public void run() { JLabel lbl = new JLabel("Hello World"); add(lbl); } }); } catch (Exception e) { System.err.println("createGUI didn't complete successfully"); } } }
Java applets inherit significant functionality from the Applet
or JApplet
class, including the capabilities to communicate with the browser and present a graphical user interface (GUI) to the user.
一个将使用来自 Swing(Java 的 GUI 工具包)的 GUI 组件的小程序应该扩展javax.swing.JApplet
基类,它提供了与 Swing 的 GUI 设施最佳集成。
JApplet
提供了一个根窗格,它与 Swing 的JFrame
和JDialog
组件具有相同的顶层组件结构,而Applet
只提供了一个基本面板。有关如何使用此功能的更多详细信息,请参见如何使用根窗格。
一个小程序可以扩展java.applet.Applet
类,当它不使用 Swing 的 GUI 组件时。
里程碑方法
原文:
docs.oracle.com/javase/tutorial/deployment/applet/appletMethods.html
Applet
类为小程序执行提供了一个框架,定义了系统在里程碑发生时调用的方法。里程碑是小程序生命周期中的重要事件。大多数小程序会覆盖其中一些或全部方法以适当地响应里程碑。
init
方法
init
方法适用于不需要太长时间的一次性初始化。init
方法通常包含通常放在构造函数中的代码。小程序通常没有构造函数的原因是在调用其init
方法之前不能保证其具有完整的环境。保持init
方法简短,以便您的小程序可以快速加载。
start
方法
每个在初始化后执行任务(除了直接响应用户操作)的小程序必须覆盖start
方法。start
方法启动小程序的执行。从start
方法快速返回是一个良好的实践。如果需要执行计算密集型操作,最好为此目的启动一个新线程。
stop
方法
大多数覆盖start
方法的小程序也应该覆盖stop
方法。stop
方法应该暂停小程序的执行,这样当用户不查看小程序页面时,它就不会占用系统资源。例如,显示动画的小程序在用户不查看时应该停止尝试绘制动画。
destroy
方法
许多小程序不需要覆盖destroy
方法,因为它们的stop
方法(在destroy
之前调用)将执行关闭小程序执行所需的所有任务。但是,destroy
方法适用于需要释放额外资源的小程序。
注意: 尽量保持destroy
方法的实现尽可能简短,因为不能保证该方法会完全执行。在长destroy
方法完成之前,Java 虚拟机可能会退出。
小程序的生命周期
原文:
docs.oracle.com/javase/tutorial/deployment/applet/lifeCycle.html
小程序可以对以下重大事件做出反应:
- 它可以初始化自身。
- 它可以开始运行。
- 它可以停止运行。
- 它可以执行最终清理,为即将卸载做准备。
本节介绍了一个新的小程序Simple
,它使用了所有这些方法。与 Java 应用程序不同,小程序不需要实现main
方法。
这是Simple
小程序。
//
注意: 如果您看不到示例运行,请确保在浏览器中启用 JavaScript 解释器,以便部署工具包脚本能够正常运行。
以下是Simple
小程序的源代码。该小程序在其生命周期中遇到重要里程碑时会显示描述性字符串,例如当用户首次访问包含小程序的页面时。
import java.applet.Applet; import java.awt.Graphics; //No need to extend JApplet, since we don't add any components; //we just paint. public class Simple extends Applet { StringBuffer buffer; public void init() { buffer = new StringBuffer(); addItem("initializing... "); } public void start() { addItem("starting... "); } public void stop() { addItem("stopping... "); } public void destroy() { addItem("preparing for unloading..."); } private void addItem(String newWord) { System.out.println(newWord); buffer.append(newWord); repaint(); } public void paint(Graphics g) { //Draw a Rectangle around the applet's display area. g.drawRect(0, 0, getWidth() - 1, getHeight() - 1); //Draw the current string inside the rectangle. g.drawString(buffer.toString(), 5, 15); } }
注意: 在此示例中,Applet
类被扩展,而不是 Swing JApplet
类,因为 Swing 组件不需要添加到此小程序中。
加载小程序
由于小程序被加载,您应该看到文本“初始化…启动…”。小程序加载时,会发生以下情况:
- 创建小程序控制类的一个实例(
Applet
子类)。 - 小程序初始化自身。
- 小程序开始运行。
离开并返回到小程序的页面
当用户离开页面,例如前往另一页时,浏览器会停止并销毁小程序。小程序的状态不会被保留。当用户返回页面时,浏览器会初始化并启动小程序的新实例。
重新加载小程序
当您刷新或重新加载浏览器页面时,当前小程序实例会被停止和销毁,并创建一个新实例。
退出浏览器
当用户退出浏览器时,小程序有机会在浏览器退出之前停止自身并执行最终清理。
下载源代码以进一步实验Simple 小程序示例。
Applet 的执行环境
原文:
docs.oracle.com/javase/tutorial/deployment/applet/appletExecutionEnv.html
Java applet 在浏览器的上下文中运行。浏览器中的 Java 插件软件控制 Java applet 的启动和执行。浏览器还有一个 JavaScript 解释器,用于运行网页上的 JavaScript 代码。本主题描述了 Java 平台标准版 6 更新 10 中发布的 Java 插件软件的行为。
Java 插件
Java 插件软件为每个 Java applet 创建一个工作线程。它在 Java Runtime Environment (JRE)软件的一个实例中启动 applet。通常,所有 applet 在同一个 JRE 实例中运行。Java 插件软件在以下情况下启动新的 JRE 实例:
- 当 applet 请求在特定版本的 JRE 中执行时。
- 当 applet 指定自己的 JRE 启动参数时,例如堆大小。如果新 applet 的要求是现有 JRE 的子集,则新 applet 使用现有 JRE,否则启动新的 JRE 实例。
如果满足以下条件,applet 将在现有 JRE 中运行:
- applet 所需的 JRE 版本与现有的 JRE 匹配。
- JRE 的启动参数满足 applet 的要求。
以下图表显示了 applet 在 JRE 中的执行方式。
Java 插件和 JavaScript 解释器的交互
Java applet 可以调用网页中存在的 JavaScript 函数。JavaScript 函数也允许调用同一网页上嵌入的 applet 的方法。Java 插件软件和 JavaScript 解释器协调 Java 代码到 JavaScript 代码的调用以及 JavaScript 代码到 Java 代码的调用。
Java 插件软件是多线程的,而 JavaScript 解释器在单个线程上运行。因此,为了避免线程相关问题,特别是当多个 applet 同时运行时,请保持 Java 代码和 JavaScript 代码之间的调用简短,并尽量避免往返。查看以下主题以了解 Java 代码和 JavaScript 代码之间的交互更多信息:
- 从 Applet 调用 JavaScript 代码
- 从 JavaScript 代码调用 Applet 方法
开发 Applet
原文:
docs.oracle.com/javase/tutorial/deployment/applet/developingApplet.html
使用基于组件的架构设计的应用程序可以开发为 Java applet。考虑具有基于 Swing 的图形用户界面(GUI)的 Java applet 的示例。通过组件化设计,GUI 可以使用更小的构建块或组件构建。以下是用于创建 applet GUI 的一般步骤:
- 创建一个名为
MyTopJPanel
的类,它是javax.swing.JPanel
的子类。在MyTopJPanel
类的构造函数中布置您的 applet 的 GUI 组件。 - 创建一个名为
MyApplet
的类,它是javax.swing.JApplet
的子类。 - 在
MyApplet
的init
方法中,实例化MyTopJPanel
并将其设置为 applet 的内容窗格。
以下部分通过使用动态树演示 applet 更详细地探讨这些步骤。如果您对 Swing 不熟悉,请参阅使用 Swing 创建 GUI 以了解更多关于使用 Swing GUI 组件的信息。
//
注意: 如果您看不到示例运行,请确保在浏览器中启用 JavaScript 解释器,以便部署工具包脚本能够正常运行。
创建顶部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); } // ... }
创建 Applet
对于具有基于 Swing 的 GUI 的 Java applet,请创建一个类,它是javax.swing.JApplet
的子类。不包含基于 Swing 的 GUI 的 applet 可以扩展java.applet.Applet
类。
覆盖 applet 的init
方法以实例化您的顶部JPanel
类并创建 applet 的 GUI。DynamicTreeApplet
类的init
方法在 AWT 事件分发线程中调用createGUI
方法。
package appletComponentArch; import javax.swing.JApplet; import javax.swing.SwingUtilities; public class DynamicTreeApplet extends JApplet { //Called when this applet is loaded into the browser. public void init() { //Execute a job on the event-dispatching thread; creating this applet's GUI. try { SwingUtilities.invokeAndWait(new Runnable() { public void run() { createGUI(); } }); } catch (Exception e) { System.err.println("createGUI didn't complete successfully"); } } private void createGUI() { //Create and set up the content pane. DynamicTreePanel newContentPane = new DynamicTreePanel(); newContentPane.setOpaque(true); setContentPane(newContentPane); } }
Java 中文官方教程 2022 版(十一)(3)https://developer.aliyun.com/article/1486355