利 用 Java 技 术 编 写 桌 面 软 件 基 础 在 学 习 Java 编 程 语 言 的 细 节 和 语 法 时, 我 们 会 碰 到 这 样 一 个 问 题 : 开 发 桌 面 应 用 软 件 需 要 使 用 哪 些 Java 技 术, 应 当 引 入 哪 些 package? 这 一 问 题 的 答 案 取 决 于 开 发 的 应 用 软 件 类 型 和 它 的 作 用 这 篇 文 章 面 向 初 学 Java 技 术 的 开 发 人 员, 它 描 述 了 开 发 不 同 类 型 的 桌 面 应 用 软 件 涉 及 的 技 术, 以 及 何 时 决 定 使 用 它 们 以 后 的 文 章 将 详 细 阐 述 如 何 使 用 这 些 技 术, 以 及 如 何 联 合 使 用 它 们 首 先, 我 们 将 开 始 在 这 篇 文 章 中 学 习 部 分 技 术 要 使 用 这 篇 文 章 中 的 任 何 技 术, 我 们 必 须 在 计 算 机 上 安 装 Java 平 台 桌 面 应 用 软 件 的 类 型 外 观 功 能 在 学 习 大 量 的 Java 技 术 前, 我 们 必 须 搞 清 楚 谁 会 使 用 我 们 的 应 用 软 件 他 们 如 何 使 用 它 它 在 个 人 电 脑 还 是 在 网 络 上 运 行, 以 及 应 用 软 件 采 用 什 么 样 的 外 观 或 图 形 用 户 界 面 (GUI)? 在 开 发 应 用 软 件 前, 考 虑 下 面 5 个 方 面 : 应 用 软 件 的 发 布 是 否 采 用 GUI 应 用 软 件 的 功 能
应 用 软 件 的 部 署 其 它 Java 技 术 应 用 软 件 的 发 布 首 先, 我 们 必 须 确 定 我 们 的 应 用 软 件 是 否 是 分 布 式 软 件 分 布 式 应 用 软 件 运 行 在 多 台 计 算 机 上, 并 通 过 一 个 网 络 通 讯 一 些 分 布 式 应 用 软 件 是 二 个 独 立 的 软 件 : 后 端 服 务 器 软 件 和 前 端 客 户 端 软 件 后 端 软 件 运 行 在 Solaris 或 Linux 等 共 享 系 统 上, 管 理 磁 盘 打 印 机 调 制 解 调 器 等 共 享 资 源 后 端 软 件 包 含 有 应 用 软 件 主 要 的 处 理 能 力 ; 前 端 客 户 端 软 件 运 行 在 工 作 站 或 个 人 电 脑 上, 它 是 用 户 在 使 用 应 用 软 件 时 能 够 看 到 的 部 分 前 端 客 户 端 软 件 处 理 用 户 界 面 功 能, 例 如 接 收 键 盘 的 输 入 在 显 示 屏 上 显 示 输 出 分 布 式 应 用 软 件 可 以 非 常 简 单, 只 在 一 台 客 户 端 计 算 机 和 一 台 服 务 器 上 运 行 ; 也 可 以 很 复 杂, 在 多 台 客 户 端 和 服 务 器 上 运 行 非 分 布 式 应 用 软 件 在 本 地 计 算 机 上 运 行, 无 需 访 问 网 络 例 如, 我 们 可 以 编 写 一 个 只 在 本 地 机 上 运 行 的 简 单 的 计 算 器 软 件, 我 们 也 可 以 使 这 类 软 件 成 为 分 布 式 软 件 通 常, 我 们 开 发 的 应 用 软 件 都 是 分 布 式 软 件, 在 网 络 或 互 联 网 上 运 行, 供 许 多 计 算 机 使 用 要 开 发 分 布 式 应 用 软 件, 我 们 需 要 学 习 和 使 用 Java Remote Method Invocation(Java RMI), 远 程 Java 对 象 的 方 法 可 以 被 其 它 Java 虚 拟 机 (JVM) 调 用 Java RMI 利 用 对 象 序 列 化 对 参 数 进 行 序 列 化 和 反 序 列 化, 它 不 会 截 断 类 型, 支 持 真 正 的 面 向 对 象 的 多 态 性
下 面 是 实 现 Java RMI 需 要 用 到 的 一 些 package: java.rmi java.rmi.activation java.rmi.dgc java.rmi.registry java.rmi.server 注 意, 下 面 的 package 名 字 是 以 "javax" 而 非 "java" 开 头 的 : javax.rmi javax.rmi.corba javax.rmi.ssl 是 否 采 用 GUI 应 用 软 件 通 常 包 含 有 许 多 具 有 不 同 功 能 的 微 型 软 件 一 些 微 型 软 件 有 图 形 用 户 界 面 (GUI) 可 能 只 是 一 个 简 单 的 窗 口 或 对 话 框, 许 多 微 型 软 件 没 有 GUI 但 是, 应 用 软 件 本 身 可 能 有 一 个 主 GUI 包 含 有 菜 单 按 钮 工 具 条 文 本 框 其 它 图 形 功 能 GUI 主 要 用 于 用 户 输 入 无 论 用 户 点 击 一 个 按 钮 或 输 入 信 息, GUI 也 可 以 向 用 户 提 供 更 多 的 信 息 另 外,GUI 组 件 也 可 以 向 用 户 显 示 系 统 返 回 的 信 息
要 创 建 GUI, 我 们 需 要 使 用 Java Foundation Classes/Swing(JFC/Swing) 和 Abstract window Toolkit(AWT)API 那 些 package 中 的 许 多 类 和 界 面 使 我 们 能 够 方 便 地 创 建 按 钮 check-box 对 象 文 本 框 其 它 组 件, 以 及 组 织 它 们 的 组 件 创 建 应 用 软 件 的 框 架 和 所 有 GUI 组 件 最 为 简 单 的 方 式 是 使 用 NetBeans IDE 等 集 成 开 发 环 境 (IDE) 该 IDE 使 我 们 能 够 拖 放 组 件, 由 它 为 我 们 编 写 复 杂 的 组 件 代 码 学 习 使 用 它 非 常 容 易, 能 够 为 我 们 节 约 大 量 的 时 间 但 是, 所 有 开 发 人 员 必 须 理 解 JFC/Swing 和 AWT 的 工 作 原 理, 因 此 我 们 必 须 亲 手 进 行 足 够 的 实 践, 理 解 这 些 概 念 编 写 GUI 软 件 使 用 的 主 要 Package 面 向 AWT java.applet java.awt java.awt.color java.awt.datatransfer java.awt.dnd java.awt.event java.awt.font
java.awt.geom java.awt.im java.awt.im.spi java.awt.image java.awt.image.renderable java.awt.print 面 向 JFC/Swing javax.swing javax.swing.border javax.swing.colorchooser javax.swing.event javax.swing.filechooser javax.swing.plaf javax.swing.plaf.basic javax.swing.plaf.metal javax.swing.plaf.multi javax.swing.plaf.synth javax.swing.table javax.swing.text javax.swing.text.html
javax.swing.text.html.parser javax.swing.text.rtf javax.swing.tree javax.swing.undo 当 然, 我 们 无 需 引 入 所 有 这 些 package, 只 需 引 入 我 们 使 用 的 package 即 可 如 果 我 们 使 用 NetBeans IDE, 就 会 发 现, 在 我 们 使 用 JFC/Swing 或 AWT 组 件 时, 它 就 会 在 代 码 中 创 建 引 入 语 句 仅 仅 从 它 们 的 名 字 中, 我 们 就 可 以 很 好 地 理 解 这 些 package 的 作 用 应 用 软 件 的 功 能 这 篇 文 章 不 可 能 讨 论 我 们 在 应 用 软 件 中 使 用 的 所 有 功 能, 但 一 些 功 能 对 于 许 多 或 大 多 数 应 用 软 件 而 言 是 通 用 的 要 使 GUI 中 的 按 钮 菜 单 文 本 框 完 成 一 些 功 能, 我 们 需 要 理 解 事 件 处 理 机 制 事 件 处 理 程 序 (event handler) 是 一 个 类, 包 含 有 当 用 户 点 击 一 个 按 钮 或 选 择 一 个 菜 单 时 会 执 行 的 指 令 事 件 处 理 程 序 可 以 执 行 许 多 操 作, 应 用 软 件 可 以 在 GUI 中 显 示 反 馈 信 息 在 文 件 或 数 据 库 中 写 入 数 据 进 行 数 学 运 算 显 示 结 果, 或 者 完 成 一 些 简 单 的 操 作, 例 如 打 开 一 个 对 话 框 供 用 户 输 入 更 多 的 信 息 读 写 数 据 将 用 户 输 入 的 信 息 写 入 一 个 文 件 系 统, 以 及 在 GUI 中 显 示 从 文 件 中 读 取 的 数 据, 是 应 用 软 件 中 常 见 的 操 作 例 如, 用 户 可 以 在 一 个 GUI 表 单 中 输 入 姓 名 地
址 电 话 号 码, 在 服 务 器 上 注 册 软 件 处 理 这 些 数 据 的 一 种 方 式 是 让 应 用 软 件 将 数 据 写 入 到 主 机 或 服 务 器 的 一 个 文 件 中 Java.io package 通 过 数 据 流 序 列 化 文 件 系 统 提 供 系 统 输 入 / 输 出 (I/O) 一 个 I/O 流 代 表 着 一 个 输 入 源 或 一 个 输 出 目 标 流 可 以 代 表 许 多 不 同 类 型 的 源 或 目 标, 包 括 磁 盘 文 件 设 备 其 它 软 件 内 存 数 组 流 支 持 许 多 不 同 种 类 的 数 据, 包 括 字 节 简 单 的 数 据 类 型 本 地 化 字 母 对 象 一 些 流 只 是 简 单 地 传 输 数 据, 另 外 一 些 类 则 处 理 和 转 换 数 据 无 论 内 部 工 作 原 理 如 何, 对 于 使 用 它 们 的 软 件 而 言, 所 有 的 流 都 是 相 同 的 简 单 模 式 一 个 流 就 是 一 个 数 据 序 列 在 java.io package 中 被 使 用 得 比 较 多 的 二 个 类 是 FileInputStream 和 FileOutputStream, 这 二 者 都 创 建 与 文 件 相 连 的 字 节 流 存 储 数 据 的 一 种 常 用 方 法 是 使 用 数 据 库 管 理 系 统 要 在 软 件 中 编 写 向 数 据 库 写 数 据 然 后 获 得 结 果 的 软 件 代 码, 我 们 就 需 要 学 习 使 用 JDBC API,JDBC API 提 供 Java 编 程 语 言 统 一 的 数 据 访 问 方 法, 使 我 们 能 够 访 问 几 乎 所 有 数 据 源 从 关 系 数 据 库 到 电 子 表 格, 再 到 普 通 文 件 JDBC 技 术 还 提 供 了 用 于 开 发 工 具 和 其 它 接 口 的 通 用 代 码 JDBC API 支 持 数 据 库 访 问 的 二 层 和 三 层 模 式 在 二 层 模 式 中,Java applet 或 应 用 软 件 直 接 与 数 据 源 通 讯 这 种 方 法 要 求 能 够 与 应 用 软 件 访 问 的 特 定 数 据 源 直 接 通 讯 的 JDBC 驱 动 程 序 用 户 的 命 令 被 传 输 给 数 据 库 或 其 它 数 据 源, 这 些 命 令 的 结 果 会 被 返 送 给 用 户 数 据 源 可 能 位 于 用 户 通 过 网 络 连 接 的 其 它 计 算 机 上, 这 被 称 为 是 客 户 机 - 服 务 器 配 置 : 用 户 的 计 算
机 是 客 户 机, 托 管 有 数 据 源 的 计 算 机 则 是 服 务 器 而 网 络 则 可 能 是 一 家 公 司 的 内 联 网 或 互 联 网 在 三 层 模 式 中, 应 用 软 件 将 命 令 发 送 给 中 间 层, 中 间 层 再 将 命 令 发 送 给 数 据 源 在 处 理 命 令 后, 数 据 源 将 结 果 返 回 给 中 间 层, 中 间 层 会 将 结 果 返 回 给 用 户 管 理 信 息 系 统 (MIS) 主 管 发 现 三 层 模 式 非 常 有 吸 引 力, 因 为 中 间 层 使 得 对 数 据 存 取 和 更 新 的 控 制 成 为 可 能 三 层 模 式 的 另 一 个 好 处 是 它 能 够 简 化 应 用 软 件 的 部 署 例 如, 数 据 可 以 在 数 据 库 中 被 修 改 在 不 影 响 用 户 体 验 的 情 况 下 增 添 新 组 件 最 后, 在 许 多 情 况 下, 三 层 架 构 具 有 性 能 优 势, 因 为 多 重 事 务 的 效 率 会 更 高 在 编 写 利 用 JDBC API 存 取 数 据 库 的 软 件 时, 我 们 需 要 使 用 下 面 的 组 件 : java.sql package 中 的 类 和 界 面 Java DB 数 据 库 等 数 据 库 管 理 系 统 使 用 的 数 据 库 管 理 系 统 的 驱 动 程 序 执 行 计 算 和 管 理 数 据 我 们 可 能 需 要 编 写 大 量 的 代 码, 由 于 必 须 输 入 所 有 的 Java 代 码, 我 们 应 当 熟 练 使 用 java.lang package 我 们 应 当 理 解 java.lang package 中 的 字 符 串, 字 符 串 在 Java 编 程 中 被 广 泛 使 用 与 StringBuilder 类 一 样,String 类 用 于 创 建 和 处 理 字 符 串 我 们 还 应 当 熟 练 使 用 java.lang package 中 的 Number 类 及 其 子 类, 它 使
我 们 能 够 使 用 这 些 类 的 实 例, 而 不 是 简 单 的 数 字 类 型 PrintStream 和 DecimalFormat 类 提 供 了 " 写 " 格 式 化 的 数 字 输 出 的 方 法 最 后,Math 类 提 供 的 数 学 函 数 补 充 了 Java 语 言 中 的 数 学 运 算 符, 它 提 供 了 面 向 三 角 函 数 指 数 函 数 等 函 数 的 方 法 为 了 处 理 各 种 类 型 的 数 据, 我 们 需 要 学 习 collections framework 表 示 和 处 理 collections 的 统 一 架 构 Collection 有 时 也 被 称 作 container, 是 将 多 个 元 素 组 合 进 一 个 单 元 的 对 象 Collections 被 用 来 存 储 访 问 处 理 传 输 聚 合 数 据 通 常 情 况 下,collection 表 示 组 成 一 个 合 乎 自 然 规 律 的 群 体 的 数 据 项, 例 如 一 迭 卡 片 一 个 邮 件 文 件 夹 一 个 字 母 集 电 话 号 码 簿 面 图 1 显 示 的 是 collection framework, 以 及 java.util package 中 常 用 的 界 图 1: Collection Framework 和 java.util Package 中 的 一 些 界 面 核 心 的 Collection 界 面 是 collections framework 的 基 础 Set 是 一 种 特 殊 类 型 的 Collection,SortedSet 是 一 种 特 殊 类 型 的 Set, 等 等 需 要 注 意 的 是, 一 个 层 包 含 有 二 棵 截 然 不 同 的 树 尽 管 使 用 方 式 与 collection 相 似,Map 并 非 真 正 的 Collection Map 界 面 提 供 有 3 个 collection 视 图, 使 Map 的 内 容 能 够 被 看 作 一 系 列 的 键 值 的 集 合 键 - 值 映 射 集 合
并 发 应 用 软 件 通 常 一 次 完 成 多 个 任 务 例 如, 流 式 音 频 应 用 软 件 必 须 同 时 从 网 络 上 读 取 数 字 音 频 内 容 解 密 播 放, 并 更 新 对 用 户 显 示 的 内 容 ; 无 论 排 版 或 更 新 显 示 内 容 的 任 务 多 么 繁 忙, 字 处 理 软 件 应 当 随 时 响 应 键 盘 和 鼠 标 事 件 这 种 能 够 同 时 完 成 数 种 任 务 的 软 件 就 是 并 发 软 件 Java.util.concurrent package 提 供 基 本 的 并 发 支 持 错 误 处 理 Java 语 言 使 用 异 常 处 理 错 误 和 其 它 意 外 事 件 异 常 是 指 在 软 件 运 行 期 间 破 坏 了 软 件 指 令 正 常 流 程 的 事 件 当 一 个 方 法 中 出 现 错 误 时, 方 法 会 创 建 一 个 对 象, 将 它 提 交 给 运 行 时 间 库 系 统 该 对 象 被 称 作 异 常 对 象, 包 含 有 相 关 错 误 的 信 息, 其 中 包 括 类 型 错 误 发 生 时 软 件 的 状 态 创 建 一 个 异 常 对 象, 并 将 它 提 交 给 运 行 时 间 库 系 统 就 被 称 作 是 " 抛 出 异 常 " 要 在 应 用 软 件 中 处 理 异 常, 我 们 需 要 理 解 如 何 编 写 代 码, 使 应 用 软 件 能 够 抛 出 或 捕 捉 一 个 异 常 应 用 软 件 的 部 署 当 希 望 应 用 软 件 在 浏 览 器 中 运 行, 或 应 用 软 件 与 web 网 页 内 容 紧 密 集 成 时, 使 用 Java 插 件 技 术 部 署 applet 如 果 希 望 应 用 软 件 在 桌 面 上 运 行, 就 使 用 Java Web Start 技 术 Java Web Start 技 术 要 求 应 用 软 件 被 封 装 为 Java Archive(JAR) 文 件 JAR 文 件 格 式 使 我 们 能 够 将 多 个 文 件 整 合 到 一 个 存 档 文 件 中 通 常, 一 个 JAR 文 件 包
含 类 文 件 与 applet 和 应 用 软 件 相 关 的 辅 助 性 资 源 文 件 JAR 文 件 采 用 了 ZIP 文 件 格 式, 因 此 我 们 能 够 用 它 完 成 无 损 数 据 压 缩 存 档 解 压 缩 文 档 解 包 等 任 务 这 些 都 是 JAR 文 件 最 常 见 的 用 途, 通 过 只 使 用 这 些 最 基 本 的 功 能, 我 们 就 能 够 发 现 JAR 文 件 的 许 多 优 点 如 果 想 利 用 JAR 文 件 格 式 提 供 的 电 子 签 名 等 先 进 功 能, 我 们 需 要 首 先 熟 悉 基 本 操 作 要 利 用 JAR 文 件 完 成 基 本 任 务, 我 们 需 要 使 用 Java Development Kit (JDK) 提 供 的 JAR 工 具 一 旦 应 用 软 件 被 封 装 为 JAR 文 件, 我 们 就 可 以 使 用 Java Web Start 技 术 部 署 应 用 软 件 了 Java Web Start 提 供 了 点 击 一 下 鼠 标 启 动 全 功 能 应 用 软 件 的 能 力 用 户 可 以 下 载 和 启 动 应 用 软 件 例 如 一 个 完 整 的 电 子 表 格 软 件 或 互 联 网 聊 天 客 户 端, 而 无 需 经 过 复 杂 的 安 装 过 程 使 用 Java Web Start 软 件, 通 过 点 击 web 网 页 中 的 一 个 链 接, 用 户 就 能 够 启 动 基 于 Java 技 术 的 应 用 软 件 该 链 接 指 向 一 个 Java Network Launching Protocol(JNLP) 文 件, 它 指 示 Java Web Start 软 件 下 载 缓 冲 运 行 应 用 软 件 其 它 Java 技 术 这 一 部 分 将 讨 论 我 们 应 当 考 虑 的 其 它 Java 技 术
应 用 软 件 安 全 大 多 数 开 发 人 员 非 常 担 心 应 用 软 件 的 安 全 性,Java 技 术 有 助 于 从 多 个 方 面 解 决 这 种 担 心 Java 技 术 包 含 有 大 量 的 API 工 具, 以 及 常 用 安 全 算 法 机 制 协 议 的 实 现 Java 平 台 安 全 性 涉 及 许 多 领 域, 其 中 包 括 密 码 公 钥 架 构 安 全 通 讯 认 证 访 问 控 制 Java 安 全 技 术 为 我 们 提 供 了 完 整 的 应 用 软 件 安 全 框 架, 也 为 用 户 或 系 统 管 理 员 提 供 了 一 系 列 安 全 地 管 理 应 用 软 件 所 需 要 的 工 具 安 全 Package 和 类 过 多, 我 们 在 这 里 无 法 一 一 列 出, 但 一 些 优 秀 的 资 源 使 我 们 能 够 开 始 学 习 与 Java 应 用 软 件 的 安 全 有 关 的 知 识 全 屏 独 占 模 式 API 如 果 在 应 用 软 件 中 需 要 高 性 能 图 形 例 如 游 戏 幻 灯 演 示 等 软 件, 我 们 就 需 要 掌 握 全 屏 独 占 模 式 API 全 屏 独 占 模 式 是 一 个 功 能 强 大 的 新 功 能, 它 它 我 们 能 够 " 暂 停 " 窗 口 系 统, 使 应 用 软 件 能 够 直 接 向 显 示 屏 上 写 内 容 国 际 化 国 际 化 指 的 是 一 个 设 计 应 用 软 件 的 过 程, 在 无 需 修 改 设 计 的 情 况 下 就 能 够 使 应 用 软 件 适 用 于 多 种 语 言 和 地 区 "internationalization" 这 个 词 有 时 也 被 缩 写 成 "i18n", 因 为 这 个 单 词 的 第 一 和 最 后 一 个 字 母 之 间 有 16 个 字 母 为 实 现 国 际 化, 我 们 使 用 得 最 多 的 package 是 java.util
总 结 数 量 众 多 的 Java 技 术 会 使 我 们 感 到 困 惑, 但 这 篇 文 章 使 我 们 能 够 了 解 开 发 桌 面 应 用 软 件 所 需 要 的 技 术 如 果 想 让 我 们 的 应 用 软 件 具 有 一 定 的 功 能, 我 们 就 会 找 到 很 好 的 Java 技 术 帮 助 实 现 我 们 需 要 的 功 能