Skip to content

Java Applet 基础

重要提示:Java Applet 是已被严重弃用的技术。现代 Web 浏览器由于存在显著的安全漏洞以及更优越的 Web 技术的兴起,已经移除了 Applet 所需的 NPAPI 插件支持。**您不应使用 Applet 进行新的开发,并应尽可能避免使用它们。**本节内容仅为提供历史背景信息。

从历史上看,Applet 是一种小型 Java 程序,旨在嵌入到 HTML 网页中并在 Web 浏览器内部运行。在现代 JavaScript 框架普及之前,Applet 允许为网页添加交互式功能和复杂的计算。

  • 扩展 java.applet.Applet 类(或者后来,用于 Swing 组件的 javax.swing.JApplet)。
  • 没有 main() 方法;执行由浏览器/插件管理。
  • 使用 <applet> 标签(后来是 <object> 或 <embed>)嵌入到 HTML 中。
  • 在安全沙箱内运行,限制对本地系统资源(文件系统、网络连接等)的访问,除非明确授予权限(这很复杂且通常不安全)。
  • 需要在浏览器中安装并启用 Java 虚拟机(JVM)插件。
  • 安全风险:浏览器插件模式是安全漏洞的主要来源。
  • 糟糕的用户体验:需要安装插件,加载时间慢,在不同浏览器/平台上的行为不一致。
  • 缺乏浏览器支持:所有主流浏览器(Chrome、Firefox、Edge、Safari)都已移除 NPAPI 插件支持。
  • 更好的替代方案:现代 Web 开发依赖于 HTML5、CSS3、JavaScript(以及像 React、Angular、Vue 这样强大的框架)和 WebAssembly 来实现丰富的客户端功能。

浏览器环境通过继承自 Applet 类(开发者可以覆盖这些方法)的特定方法来管理 Applet 的生命周期:

  • init():Applet 首次加载时调用一次。用于初始化任务(设置资源、解析参数)。
  • start():在 init() 之后以及用户导航回 Applet 页面时调用。用于启动动画、线程或其他活动进程。
  • stop():当用户离开页面时调用。用于暂停动画、停止线程并释放临时资源。
  • destroy():当 Applet 被永久卸载时(例如,浏览器关闭)调用一次。用于资源的最终清理。
  • paint(Graphics g):(继承自 AWT Component)每当 Applet 的显示区域需要重绘时调用。开发者在此处使用 Graphics 对象放置绘图代码。

历史上的“Hello, World” Applet 示例

Section titled “历史上的“Hello, World” Applet 示例”

警告:以下代码仅用于历史说明,在不使用过时软件进行大量工作的情况下,无法在现代浏览器中运行。

// HelloWorldApplet.java (历史示例 - 请勿使用)
import java.applet.Applet;
import java.awt.Graphics;
/**
* @deprecated Applets are deprecated technology.
*/
@Deprecated
public class HelloWorldApplet extends Applet {
// 浏览器调用此方法绘制 Applet 内容
@Override
public void paint(Graphics g) {
// 在位置 (25, 50) 绘制字符串 "Hello World"
g.drawString("Hello World (Applet - Deprecated)", 25, 50);
}
}

Applet 使用 <applet> 等标签嵌入:

<!-- 历史 HTML 示例 - 请勿使用 -->
<html>
<head>
<title>Deprecated Applet Example</title>
</head>
<body>
<hr>
<p>尝试加载已弃用的 Applet:</p>
<applet code="HelloWorldApplet.class" width="320" height="120">
<!-- 如果浏览器不支持 Applet(或已禁用),则显示此文本 -->
Your browser does not support Java Applets (or they are disabled).
</applet>
<hr>
</body>
</html>

历史功能(参数、图像、音频)

Section titled “历史功能(参数、图像、音频)”

Applet 具有以下机制:

  • 参数:通过 <applet> 标签内的 <param> 标签接收输入,使用 getParameter(String name) 方法获取。
  • 图像:使用 getImage() 和 drawImage() 加载和显示图像(GIF、JPEG)。如果从不同来源加载,需要适当的权限。
  • 音频:使用 getAudioClip() 和 AudioClip 接口(play()、loop()、stop())播放音频片段(.au, .wav)。

这些功能在 Applet 的上下文中也已过时。

如果您需要在 Web 浏览器中实现丰富的客户端功能:

  • JavaScript 框架/库:使用现代 JavaScript (ES6+) 以及像 React、Angular、Vue.js 或 Svelte 这样的框架来构建动态用户界面。
  • WebAssembly (Wasm):将用 C++、C#、Rust(以及可能其他语言)编写的代码编译后在浏览器中以接近原生的速度运行,适用于性能密集型任务。
  • 服务器端渲染 (SSR) / 框架:使用服务器端技术(例如带有 Spring Boot/Jakarta EE 的 Java、Node.js、Python/Django、Ruby/Rails)在服务器上生成 HTML,通常与 JavaScript 结合用于客户端增强。

如果您需要使用 Java 开发桌面应用程序:

  • JavaFX:使用 Java 构建具有丰富用户界面的跨平台桌面应用程序的现代框架。
  • Swing:用于 Java 桌面应用程序的较旧但仍广泛使用的框架。
  • (Java Web Start - 也已弃用):曾是一种通过 Web 部署桌面应用程序的技术,但现在也已弃用并从现代 Java 版本中移除。

总之,虽然 Applet 在历史上具有重要意义,但现在已经过时且不安全。对于新的开发,请专注于现代 Web 技术或像 JavaFX 这样的 Java 桌面框架。