JavaBeans 和 ActiveX 鹿 死 谁 手

请 你 仔 细 考 虑 以 下 对 开 发 人 员 重 要 的 五 部 分 后 再 作 选 择

摘 要

如 果 你 已 经 有 几 个 月 没 有 联 机 的 话, 你 可 能 没 有 察 觉 激 烈 的 组 件 规 范 之 争。 这 种 经 常 发 生 的 竞 争 情 况 往 往 一 样, 对 手 们 处 境 都 是 得 失 攸 关。

ActiveX 和Java Beans ( 分 别 来 自 Microsoft 和 Javasoft) 都 可 以 用 于Internet/Intranet 的 开 发, 但 这 两 种 组 件 结 构 的 范 围 有 很 大 不 同, 怎 样 才 知 道 哪 个 更 适 合 你 呢 ? 在 这 篇 文 章 里, 我 回 答 了 一 些 对 开 发 者 来 说 很 重 要 的 基 本 技 术 问 题。 如 它 们 是 如 何 工 作 ? 它 们 可 以 做 什 么 ? 你 怎 么 知 道 哪 一 个 适 合 你 ? 通 过 这 些 回 答, 你 就 可 以 决 定 哪 个 组 件 对 象 模 型 最 适 合 你 使 用。 为 了 达 到 这 一 目 的, 我 在 实 践 部 分 分 别 对JavaBeans 和ActiveX 在 五 个 重 要 方 面 做 了 详 尽 介 绍, 他 们 是: 有 效 性(availability), 性 能(capability), 安 全 性(security), 可 用 性(interoperability), 跨 平 台 性 (cross-platformability)。

你 准 备 好 了 吗 ? 我 们 现 在 开 始。

 

速 应 用 程 序 开 发 包RAD(rapid-application-development packages) 是 一 个 具 有 激 烈 竞 争 的 软 件 投 资 领 域。 一 个RAD 包 括 编 程 语 言, 一 个 用 于 连 接 交 互 作 用 元 素 的 组 件 模 型( 叫 做“ 控 件”) 和 一 个 用 户 化 的 环 境( 资 源 编 辑 器)。 在PC 机 上 最 成 功 的 一 个RAD 曾 是Borland 公 司 的 Delphi; 但 是, 首 先 得 以 广 泛 应 用 是Microsoft 的Visual Basic。Borland 公 司 的 产 品 使 用 了 Pascal 语 言 的 专 用 版 本(Object Pascal), 而Microsoft 的 产 品 使 用 的 是Basic 语 言 的 专 用 版 本。 由 于Java 是 一 种 健 壮 而 安 全 的 编 程 语 言, 所 以 它 的 强 大 性 使 得 它 看 来 非 常 适 应 作 为 一 种 最 好RAD 环 境 的 基 本 语 言, 但 讫 今 为 止,Java 还 缺 少 组 件(components) 这 项 基 本 技 术。

软 件 中 的 组 件 仅 仅 是 书 写 用 户 界 面 控 件 的 一 种 协 议。 所 以 应 用 程 序 开 发 工 具 和 运 行 环 境 可 以 控 制 它 们。Visual Basic 的 组 件 模 型VBX(Visual Basic eXtensions) 是 一 个 Microsoft 的 动 态 链 接 库(DLL) 结 构 的 变 种。Delphi 定 义 了 一 个 围 绕Borland 的OWL 类 库(Object Window Library) 的 组 件 结 构。

Javasoft 也 不 甘 示 弱, 它 推 出 了 一 个 叫 做JavaBeans 的 组 件 结 构。

你 可 能 会 认 为 这 仅 是 三 个 不 同 的RAD 环 境 之 间 的 事, 它 们 各 自 使 用 自 己 的 语 言。 在 某 些 方 面 你 是 对 的。 但 你 将 知 道 事 情 不 会 那 么 简 单。Java 语 言 已 经 对 程 序 员 的 思 维 方 式 产 生 了 很 大 的 影 响。 这 种 想 法 在Microsoft 公 司 的 产 品 尤 其 强 烈, 他 们 看 到 了 地 平 线 上 另 外 一 个 Visual Basic 的 竞 争 者。 Microsoft 创 建 了ActiveX ─ ─ 一 种 组 件 结 构 适 合 于 所 有 语 言。 为 了 加 强 这 种 观 点,Microsoft 在 其 最 新 的 开 发 工 具 中 提 供 支 持, 以 便 从Java 中 使 用 ActiveX 控 制 和 从ActiveX 控 制 中 调 用 Java 控 制。

Software component models
让 我 们 从 一 个 简 单 的 定 义 开 始: 一 个 软 件 组 件 模 型(software component model) 就 是 一 个 对 于 如 何 开 发 可 重 用 的 软 件 组 件 和 这 些 组 件 之 间 如 何 相 互 通 信 的 详 细 描 述。

用 这 种 说 法, 我 们 就 可 以 来 考 虑 在 通 常 状 况 下, 组 件 模 型 是 如 何 工 作 的。

软 件 组 件 的 开 发 者 必 须 处 理 那 些 实 现 一 个 组 件 和 其 相 关 类 的 底 层 细 节。 软 件 组 件 的 用 户 ( 有 它 们 自 己 权 限 的 开 发 者) 就 可 以 仅 在 可 视 开 发 环 境 下 将 现 存 的 组 件 组 织 起 来。 这 就 是 我 们 通 常 所 说 的 快 速 应 用 开 发 — 使 现 有 的 代 码 库 可 以 很 容 易 重 用( 或 很 容 易 的 从 独 立 销 售 商 获 得) 并 集 成 到 第 三 方 的 开 发 环 境 中。 组 件 开 发 者 还 从 这 种 环 境 中 受 益: 他 们 可 以 重 用 现 有 组 件, 在 开 发 自 己 的 组 件 时 获 得 一 个 与 许 多 标 准 系 统 一 致 的 对 象 界 面。

使 用 组 件 对 象 模 型 的 软 件 开 发 就 象 是 用Legos 建 筑 模 块 建 造 一 座 建 筑 物。 整 个 应 用 程 序 并 不 是 从 草 稿 中 做 起, 而 是 将 你 现 有 的 建 造 模 块 组 合 起 来。 这 种 方 法 不 仅 节 省 时 间, 金 钱, 还 可 提 高 工 作 效 率, 而 且 它 产 生 更 加 统 一、 可 信 的 应 用 程 序。

在GUI 组 件 的 上 下 文 中, 使 用 组 件 对 象 模 型 开 发 软 件 允 许 你 购 买 或 者 开 发 软 件 组 件, 比 如 说 字 体 选 择 器, 数 据 库 查 看 器, 然 后, 可 以 把 它 们 结 合 到 你 的 图 形 开 发 环 境 中, 非 常 容 易, 就 象 在 你 选 择 的 环 境 中 使 用 原 先 所 带 的GUI 组 件 一 样 使 用。 可 以 通 过 图 形 控 制 面 板 配 置 这 些 组 件, 图 形 控 制 板 面 列 有 组 件 特 性( 颜 色, 字 形 等) 并 允 许 容 易 的 修 改。 然 而, 我 必 须 强 调 组 件 不 一 定 在 只 表 现 为 图 形 应 用, 定 时 器 组 件(alarm) 就 是 一 个 典 型 的 非 图 形 组 件: 当 你 把 它 加 入 到 应 用 程 序 中 时, 你 可 以 以 图 形 方 式 选 择 定 时 的 间 隔, 还 可 以 很 容 易 的 编 写 与 定 时 器 事 件 相 关 的 代 码, 但 是 当 应 用 程 序 运 行 时, 定 时 器 组 件 将 在 一 个 不 可 见 的 线 程 中 运 行。


让 我 们 来 理 解 软 件 组 件 本 身

为 了 让 一 个 软 件 组 件 模 型 正 常 工 作, 每 个 软 件 组 件 必 须 提 供 几 个 特 征:

  • 组 件 必 须 能 够 进 行 自 身 的 描 述。 这 就 是 说 一 个 组 件 必 须 能 够 识 别 在 它 构 造 过 程 中 可 更 改 的 属 性 和 它 生 成 的 事 件(events)。 这 些 信 息 被 开 发 环 境 用 来 将 第 三 方 软 件 组 件 无 缝 的 结 合 起 来。
  • 组 件 必 须 允 许 以 图 形 方 式 编 辑。 一 个RAD 环 境 是 一 个 典 型 的 图 形 方 式, 软 件 组 件 的 属 性 几 乎 只 能 通 过 控 制 面 板 来 设 置。
  • 组 件 必 须 可 以 被 编 程 语 言 直 接 控 制。 因 为 组 件 也 可 以 和 脚 本 语 言 连 接 或 者 与 从 代 码 级 访 问 组 件 的 环 境 连 接, 这 个 特 性 使 得 软 件 组 件 可 以 在 非 可 视 开 发 项 目 中 操 作。
  • 组 件 必 须 能 产 生 一 个 事 件 或 者 其 它 让 程 序 员 从 语 义 上 连 接 的 机 制。 这 意 味 着 程 序 员 可 以 很 容 易 的 向 按 钮 添 加 代 码, 这 样 点 中 按 钮 就 可 以 影 响 其 它 组 件 的 动 作。

在 理 论 上: 详 读 框 架 结 构
现 在, 我 们 已 经 明 白 一 个 好 的 软 件 组 件 应 该 支 持 的 特 性。 可 以 明 确 地 来 学 习JavaBeans 和 ActiveX 的 框 架 结 构 了。 让 我 们 从JavaBeans 开 始。

JavaBeans 方 式
JavaBeans 通 过 内 建(introspection) 机 制 支 持 自 动 描 述, 图 形 组 件 通 过 customization 机 制 编 辑, 并 且 通 过 一 个 事 件 模 型 的 链 接。 现 在 让 我 们 来 看 这 些 特 性 是 如 何 起 作 用 的。

JavaBeans 通 过 支 持Introspector 类 来 自 动 实 现 组 件( 在 这 种 情 况 下, 就 是 一 个 Bean) 的 内 建。 一 个Java Bean 可 以 通 过 下 列 两 种 方 法 中 的 任 何 一 种 来 确 定 它 的 属 性 和 事 件: 通 过Reflection API 或 通 过BeanInfo 类。 如 果 支 持BeanInfo 类, 那 么 Introspector 类 就 使 用 它, 否 则 就 使 用Reflection API。

通 过 使 用Reflection API, 类 可 以 检 查 由 其 它 类 提 供 的 方 法。 如 果Bean 的 设 计 者 遵 循Java Beans 的 设 计 规 则(design patterns) 的 详 细 说 明, 那 么Bean 的 动 作 由 它 的 方 法 名 自 动 决 定。 或 者,Bean 的 设 计 者 可 以 提 供 一 个 描 述 这 个Bean 的BeanInfo 类, 这 个 类 必 须 实 现BeanInfo(Interface) 界 面, 它 的 名 字 必 须 由 向Bean 类 名 的 后 尾 添 加“BeanInfo” 而 形 成。 这 个 界 面 返 回 可 变 的 描 述 类 用 来 决 定Bean 的 特 性。

当 一 个 应 用 程 序 加 入Bean 后, 开 发 环 境 将 允 许 用 户 通 过 属 性 表 来 配 置 一 个Bean。Bean 属 性 是 通 过 内 省 机 制 决 定 的, 然 后 以 一 个 图 形 方 式 的 属 性 表 方 式 出 现。 用 户 对Bean 属 性 的 改 变 将 由 适 当 的Bean 方 法 实 现。

另 外,Bean 的 设 计 者 也 可 以 包 含 自 己 定 制 的 类, 通 过 提 供 一 个 构 造 向 导(Wizard) 来 引 导 用 户 初 始 化Bean。 构 造 用 户 类 库 是 由 实 现 一 个Customizer 类 创 建 的, 并 且 从Bean 的 BeanInfo 类 中 返 回 适 当 的 信 息。 这 种 作 法 允 许Bean 的 定 制 更 复 杂, 这 对 象 数 据 库 权 限 控 制 器 这 类 复 杂 的Bean 非 常 重 要。

事 件
不 同 的Bean 通 过 事 件 被 联 系 在 一 起。 每 一 个Bean 都 声 明 它 可 以 触 发 的 事 件。 对 于 一 个 含Bean 的 应 用 程 序, 程 序 员 为 这 些 事 件 注 册 接 收 器(listeners)。 而 事 件 发 生 时, 所 有 注 册 的 接 收 器 都 会 被 通 知。

举 例 来 说, 一 个Bean 按 钮 可 以 产 生 一 个Action 事 件。 与 此 事 件 相 关 的 类 就 必 须 实 现ActionListener 接 口, 并 以 接 钮Bean 注 册。 事 件 发 生 时, 按 钮 就 会 通 过ActionListener 接 口 通 知 它 所 有 的 接 收 器, 允 许 适 当 的 动 作 发 生。

ActiveX 方 式
ActiveX 是Microsoft 公 司 为 适 应Web 环 境 对 现 存 组 件 对 象 模 型 的 重 新 开 发。 本 质 上,ActiveX 在 不 考 虑 实 现 语 言 和 平 台 的 情 况 下 提 供 了 组 件 之 间 相 互 通 信 的 线 索。 但 这 并 不 是 说 给 出 的 二 进 制ActiveX 控 制 就 是 可 移 植 的, 而 是 说 这 种 规 范 允 许 在 不 同 支 持ActiveX 的 平 台 上 通 信。ActiveX 是 源 自Microsoft 的 几 个 核 心 技 术。

DCOM, 是Microsoft 的 分 布 式 组 件 对 象 模 型, 它 提 供 了 能 够 使 对 象 之 间 和 与 远 程 对 象 之 间 通 信 的 低 级 对 象 通 信 的 机 制。 扩 展 的DCOM 描 述 了ActiveX 的 核 心 技 术。 和Java 的 远 程 方 法 调 用RMI(remote method invocation) 一 样,DCOM 提 供 了 在 不 同 机 器 和 不 同 操 作 系 统 中 对 象 之 间 的 透 明 消 息 传 递。

OLE( 对 象 链 接 和 嵌 入 的 缩 写) 使 用DCOM 来 提 供 高 级 应 用 服 务, 例 如 嵌 入 和 链 接, 用 户 产 生 复 合 文 档 等。OLE 建 立 在Microsoft 的 组 件 对 象 模 型COM 的 基 础 上(COM 是DCOM 的 前 身),OLE 对 于 最 终 用 户 的 可 用 性 和 桌 面 应 用 程 序 的 集 成 十 分 有 效。

ActiveX, 作 为OLE 上 的 改 进, 提 供 了 一 个 精 简 的 版 本。ActiveX 能 够 使 控 件 可 以 嵌 入Web 站 点 并 可 以 对 事 件 产 生 交 互 响 应。

ActiveX 通 过 一 个 二 进 制 描 述 文 件 以 列 出 其 属 性, 方 法 和 暴 露 的 事 件 描 述。 用Visual Basic 和Visual C++ 创 建 一 个 这 样 的 界 面, 是 通 过 一 个ActiveX Wizard 的 向 导 在 全 过 程 可 视 地 引 导 用 户 操 作。 目 前 如 果 用Java 开 发 的ActiveX 控 件,Java 类 的 所 有 的 公 有 方 法 由COM 暴 露。 Visual J++ 1.1 引 入 了 一 个Wizard 来 精 简 这 一 过 程。

同 样,ActiveX 的 属 性 页 是 通 过 属 性 页Wizard 创 建, 其 创 建 是 通 过 一 个 图 形 属 性 编 辑 器 实 现 的。 目 前,Java 控 件 不 支 持 属 性 页,但Visual J++1.1 将 会 弥 补 这 种 缺 陷。

如 前 所 述,ActiveX 控 件 通 过 允 许 控 件 互 相 取 得 开 放 的 方 法 的 这 种 机 制 来 通 信, 而 不 必 考 虑 控 制 是 否 装 在 同 样 的 容 器 中, 相 同 或 不 同 的 机 器 中。DCOM 使 开 发 者 可 以 开 发 运 行 异 构 网 络 的 应 用 程 序, 不 同 的 平 台 都 已 具 有 这 种 功 能。Microsoft 已 经 向 Open Group 公 布 了DCOM 技 术,Open Group 在1996 年 由 两 个 开 放 系 统 厂 商 配 合 组 成:X/Open Company Ltd.(X/Open) 和Open Software Foundation(osf)。 The Open Group(TOG) 将 监 督DCOM 的 标 准 化 过 程。

ActiveX 控 件 是 通 过 事 件 链 接 的; 开 发 环 境 允 许 开 发 人 员 创 建 被 调 用 的 方 法, 当 事 件 由 任 何 正 在 使 用 的 组 件 初 始 时。 如 果 一 个 事 件 中 包 含 参 数( 如X、Y 坐 标), 那 么 它 们 将 被 包 含 在 被 调 用 方 法 的 签 名 中。

Microsoft 的 自 动 方 式。
在ActiveX 的 开 发 中,Microsoft 的 开 发 工 具 的 成 熟 切 实 地 表 现 出 来。 在Wizard 毫 不 费 力 的 引 导 你 进 行ActiveX 控 件 的 开 发 和 操 作 的 背 后, 需 要 的 是 大 量 的 后 台 工 作; 例 如: 控 件 必 须 被 赋 予 一 个唯 一 标 识 符, 并 插 入 到 组 件 登 记 中 等 等。

因 为 这 些 细 节 是 隐 藏 的, 所 以 在 表 面 看 不 到。Microsoft 开 发 工 具 的 可 视 性 和 自 动 性 都 很 高。 不 用 了 解ActiveX 内 部 细 节 时, 所 以 许 多 工 作 很 容 易 的 自 动 完 成 了, 但 揭 开 真 正 的 细 节 是 一 个 非 常 辛 苦 的 过 程, 甚 至Microsoft 的 文 档 也 承 认 这 个 用 题。 可 以 说, 没 有 先 进 Windows IDE, 新 用 户 就 不 可 能 从 头 构 造ActiveX 控 制, 而 有 了IDE, 烦 恼 尽 去, 显 示 了 其 强 大 的 能 力。

实 际 应 用(In practice):ActiveX 和 JavaBeans 的 对 抗
JavaBeans 和ActiveX 都 是 新 技 术, 瞄 准 了 基 于Web 的 应 用 程 序。 基 于Web 的 应 用 程 序 在 考 虑 到 安 全 性 问 题 时, 遇 到 了 很 多 如 病 毒 或Worm 之 类 的 麻 烦, 开 发 者 必 须 考 虑 任 意 Web 站 点 的 潜 在 危 险 和 对代 码 执 行 的 处 理。 下 面 这 段 就 是 关 于 两 种 技 术 在 这 个 问 题 和 其 它 一 些 实 际 问 题 的 讨 论。

可 用 性(Availability)
在 任 何 时 候,JavaBeans 需 要JDK1.1 才 能 完 全 运 行,JDK 已 经 可 以 得 到。 而 BDK(JavaSoft Bean Development Kit) 可 以 和JDK beta 1.1 同 期 得 到, Symantac 的VisualCafe 提 供 了 支 持JDK 1.0.2 以 下 的Beans。 这 些 环 境 装 载 了 名 义 上 的Bean 集, 允 许 用 户 开 始 产 生JavaBeans 的 应 用 程 序。 IBM 的Applet Author 现 在 也 可 用 于JavaBeans 的 开 发。

在 可 用 性 这 一 点,ActiveX 已 起 在 竞 争 中 领 先 了。ActiveX 目 前 可 用Microsoft 的 Visual Basic 5.0 (CCE), Visual C++ 4.2 ( 企 业 版), 和 Visual J++ 1.1 ( 目 前 在 测 试) 开 发。 为 了 进 行 这 种 开 发,Macintosh SDK 支 持 也 可 以 使 用 了(beta 版), 许 许 多 多 的 控 件 - - 包 括RealAudio 放 映 器, 电 影 放 映 器 和 图 形 化 网 络 交 谈 系 统 现 在 都 可 以 购 得。 主 要 的Java 工 具 开 发 商, 包 括Borland 和Metrowerks, 都 宣 布 在Java 中 支 持 ActiveX。

一 个 应 用 程 序 在 片 刻 之 间 便 可 用 不 同 语 言 编 写 的 组 件 结 合 而 成, 当 应 用 程 序 执 行 时, Microsoft Developer Studio 会 自 动 的 在 组 件 语 言 之 间 切 换 调 试 模 式。

有 效 性 级 别(Grades for Availability):

  • JavaBeans: B (beta 版)
  • ActiveX: A- (( 完 整 的Java 支 持 为beta 版))

性 能(Capability)
如 果 你 运 行 一 个 独 立 的JavaBeans 应 用 程 序 或 可 信 赖 的 小 应 用 程 序, 那 你 将 拥 有 所 有 的Java 应 用 程 序 的 权 力。 如 果 你 运 行 的 是 不 可 信JavaBeans 小 应 用 程 序, 那 么 你 的 小 应 用 程 序 的 效 用 被 限 制 和 任 何 标 准 小 应 用 程 序 一 样( 关 于 可 信 赖 和 不 可 信 赖 的applets 的 细 节, 请 参 考 下 面 的 安 全 性(Security) 部 分)。 目 前 为 止Java 尚 缺 少 多 媒 体 能 力 且 功 能 不 太 完 善。 未 来 的Java 环 境 将 为 下 载 代 码 提 供 一 个 层 次 范 围 的 安 全 选 择。 这 将 扩 展 小 应 用 程 序 对 本 地 应 用 程 序 的 作 用。 但 是Java 的 受 限API 将 仍 是 一 个 问 题。

相 比 之 下, 一 个ActiveX 控 制, 拥 有 本 机 应 用 程 序 的 所 用 能 力。 这 使 它 能 够 利 用 强 大 的 本 地APIs。 譬 如DirectX, OpenGL, 和QuickDraw3D。Java 并 不 立 即 提 供 这 些 能 力。 未 来 的API 将 改 善 这 种 状 况, 如 果 你 想 访 问 或 调 用 底 层 系 统 资 源。 那 么 只 有ActiveX 提 供 这 种 机 会。 - - - 当 然 这 将 以 你 的 应 用 程 序 锁 在 一 个 单 一 平 台 为 代 价。

性 能 级 别(Grades for Capability):

  • JavaBeans: B ( 受 限 的API)
  • ActiveX: A- (Windows 平 台 专 有)

安 全 性
JavaBeans 和ActiveX 是 完 全 不 同 的 安 全 模 式。 从 安 全 性 出 发, 我 们 必 须 考 虑 两 方 面: Web 的 配 置, 安 全 性 必 须 保 证 用 户 不 受 肆 意 的 破 坏 代 码 的 侵 害。 虽 然 这 种 代 码 比 较 少 见, 但 有 一 些 重 要 的 示 例 其 中 包 括Activex Exploder 和Germang'sChaos Computer Chub( 可 参 见 资 源 部 分(Resources))。 开 发 一 个 组 件 模 型 必 须 提 供 安 全 保 护 以 使 用 户 不 受 程 序 员 意 外 错 误 引 起 的 危 害, 这 一 点 更 为 重 要。

JavaBeans 的 安 全 性 依 赖 于Java。Java 的 安 全 性 模 型 包 括 严 格 的 安 全 性, 保 护 用 户 不 受 那 些 由 于 不 正 确 类 型 的 映 射 和 不 合 法 内 存 存 取 引 起 的 错 误。 这 提 供 了 安 全 和 保 证。 另 外 一 个 是Security Manager 资 源 级 安 全 性, 限 制Java 程 序 磁 盘 访 问 权 限, 网 络 访 问 权 限 等。 这 一 点 很 重 要, 因 为 它 保 护 用 户 不 受 敌 意 和 错 误 代 码 危 害。Java 运 行 环 境 设 定 了 一 个 对Java 程 序 的 资 源 获 取 级 别 的 权 限。 一 般 说 来,Java 应 用 程 序 不 限 制 资 源 权 限, 而Java 小 应 用 程 序 有 非 常 严 格 的 资 源 权 限 控 制。JDK1.1 引 入 数 字 标 识 的 小 应 用 程 序 它 允 许 用 户 可 以 扩 展 从 可 信 赖 资 源 来 的 小 应 用 程 序 资 源 权 限。 所 以 如 果 你 信 任Javasoft 和Javasoft 标 识 的applet, 你 就 可 以 赋 予applet 扩 展 的 资 源 权 限, 因 为 没 有 人 任 意 窜 改 这 些 代 码。 记 住Java 的 严 格 安 全 性 仍 旧 存 在, 它 提 供 保 护 以 抵 制 许 多 可 以 潜 在 导 致applet 错 误 的 程 序 员 错 误。 未 来 的 浏 览 器 可 允 许 对 不 信 赖 的applet 的 一 定 资 源 扩 展 权 限( 例 如 对 某 一 目 录 写 的 权 限)。 这 种 安 全 性 模 式 意 味 着,Java 程 序 可 安 全 运 行 和 访 问 资 源, 依 赖 你 最 初 的 安 全 授 予 权 限。

ActiveX 控 制 不 含 有 任 何 类 似 的 严 格 安 全 性 检 查 或 资 源 权 限 检 查。 相 反, 控 件 具 有 你 的 机 器 和 它 的 资 源 的 所 有 权 限。 数 字 签 名 只 提 供 一 种 安 全 机 制: 它 允 许 你 验 证 一 个 控 件 是 从 Source 中 未 更 改 的。 为 了 标 注 一 个 控 件, 你 可 以 把 控 件, 它 的 描 述 和 你 的 名 字 呈 送 到 一 个 众 所 周 知 的 权 威 认 证CA(certification authority ), 例 如 象 是Verisign。CA 使 用 加 密 技 术, 来 产 生 一 个 不 可 预 料 的 签 名 用 来 查 证 这 个 控 件, 你 的 姓 名 和 它 的 描 述。 当 一 个 浏 览 器 遇 到 一 个 标 记 的 控 件, 它 就 用 它 的CA 公 共 密 钥 拷 贝 来 验 证 控 件 签 名 是 否 符 合。 如 果 相 符, 你 就 可 以 确 定 它 未 变 这 是 因 为 它 曾 提 交CA。 查 看 你 浏 览 器 的 安 全 选 项, 找 出 你 有 存 取 权 限 的 公 共 密 钥。

由 于 没 有 资 源 控 制,ActiveX 成 为 了 一 种 极 为 强 大 的 技 术。 目 击 你 机 器 的 性 能 下 降, 自 动 地 将 你 所 有 的Word 文 档 上 载 并 将 它 们 用HTML 公 布, 甚 至 不 经 你 允 许, 就 指 示Quicken 从 一 个 银 行 向 另 一 个 银 行 基 金 转 移。 这 看 起 来 象 是“ 龙 葵(nightmerish)” 式 的 应 用 程 序, 但 它 还 证 明 了ActiveX 对 重 大 的 基 于Windows (Windows-based) 的Intranet 应 用 程 序 有 很 大 的 潜 力。

从 另 一 方 面 来 讲, 缺 少 固 有 安 全 性 是ActiveX 安 全 模 式 的 一 个 巨 大 漏 洞, 至 少 是 对 于 在 Intenret 上 使 用 非Java ActiveX 的 控 件。 如 此。 如 果 一 个 控 件 不 执 行 完 全 的 参 数 检 查, 那 么 数 字 标 志 控 件 可 以 强 行 进 入 用 户 机 器 中 任 意 执 行 操 作。 典 型 的 事 例 是 参 数 溢 出 缓 冲 区; 在 栈 改 写 返 回 地 址, 和 引 起 跳 向 任 意 位 置 的 执 行。 这 种 程 序 错 误 应 该 在ActiveX 中 能 够 被 发 现, 一 个 不 道 德 的 开 发 者 可 以 伪 装 成 作 者 改 变 控 制 的 行 为 动 作。 假 如 想 用 一 个 标 记 的Java applet 作 同 样 的 事, 你 肯 定 会 在Java 虚 拟 机(JVM) 发 现 一 个 错 误(bug), 因 为Java 固 有 的 安 全 性 可 以 防 止 这 种 情 况。

如 果 数 字 签 名 被 用 来 支 持 象Java 这 样 的 安 全 环 境, 它 将 是 一 项 非 常 有 价 值 的 技 术, 因 为 它 们 允 许 重 大 的 应 用 程 序 安 全 地 配 置 在Internet 上, 具 有 适 当 的 客 户 机 器 资 源 访 问 权 限。 如 果 你 同 意 执 行 一 个 由Germany' Chaos Club 标 志 的 控 件, 你 可 能 会 引 起 麻 烦。 可 怕 的 是 一 个 合 法 的 由 类 似Microsoft 公 司 标 志 的 控 件, 被 强 制 加 入 破 坏 性 的 可 能 性。 这 种 问 题 还 没 有 发 生, 但 随 着 在JVM 发 现 的 错 误 的 数 量, 它 并 不 是 一 个 遥 不 可 及 的 想 法。

安 全 性 级 别(Grades for Security):

  • JavaBeans: A ( 广 泛 的 安 全 性 选 项)
  • ActiveX: D ( 不 提 供 保 证 和Internet 安 全)

结 合 性(Interoperability)
JavaBeans 规 范 的 最 高 设 计 目 标 是 与 其 它 组 件 环 境 的 结 合 能 力。 正 在 设 计, 链 接 如COM,OpenDoc 和Netseape ONE 这 些 环 境 的 网 桥。 通 过 这 些 网 桥, 不 同 模 型 中 的 对 象 可 以 通 过JavaBeans 界 面 访 问。 不 幸 的 是, 目 前 细 节 仍 不 完 善。

ActiveX 可 以 被 至 少 三 种 完 全 语 言 支 持, 还 可 以 支 持 几 种 脚 本 语 言, 包 括VBScript 和JScript。 因 为ActiveX 拥 有 全 部 的 系 统 权 限。 所 以 在 目 标 平 台 上 实 现 与 任 何 系 统 的 结 合 是 可 能 的。 例 如, 你 可 以 用Visual Basic 开 发 一 个ActiveX 控 件, 它 打 开 一 个 窗 口, 添 加 一 个C++ 编 写 的AVI 播 放 器, 然 后 从Java 小 应 用 程 序 中 操 作 这 个 播 放 器。 目 前, 对 于Java 容 器 带 有 非Java 组 件 或 非Java 容 器 带 有 一 个Java 组 件 还 存 在 一 些 限 制。 但Microsoft 将 来 可 能 会 修 正 这 些 限 制。

结 合 性 级 别(Grades for Interoperability):

  • JavaBeans: B- (ActiveX 网 桥 已 经 生 成, 但 并 不 是 都 有 用)
  • ActiveX: B+ ( 仍 不 完 善)

跨 平 台 能 力(Cross-Platform)
JavaBeans 在 跨 平 台Cross-Platform 的 竞 争 中 显 然 获 胜 了。Java 虚 拟 机VM 已 经 实 现 大 多 数 的 流 行 的 操 作 系 统 的 版 本; 甚 至 在 许 多 不 常 用 的 的 操 作 系 统 上 也 有 了 相 应 版 本; 早 些 时 候 关 于Cross-platform GUIs 的 关 键 问 题 终 于 解 决 了。

虽 然 一 些 市 场 的 宣 传( 向The Open Group 发 布 了DCOM ), 但 实 际 上,ActiveX 不 是 Cross-platform 的 解 决 方 案。 如 果 你 编 写 一 个 基 于ActiveX 的 应 用 程 序, 它 只 能 在 它 的 目 标 机 器 和 操 作 系 统 上 运 行。 它 可 以 提 供 多 种 版 本 的 控 件, 以 适 应 多 种 不 同 平 台, 以 使 相 应 的 版 本 可 以 正 确 执 行, 但 如 果 你 利 用 任 何Windows API, 那 么 你 的 应 用 程 序 就 需 要 重 大 变 化 才 能 在 其 它 平 台 执 行。

跨 平 台 能 力 级 别

  • JavaBeans: A- (Java 的 交 叉 平 台 能 力 没 有 平 台 相 关 特 性)
  • ActiveX: D+ ( 理 论 上 讲 你 可 以 在 多 平 台 上 编 写ActiveX, 但 任 何 给 定 控 件 不 可 移 植)

以 上 所 述 说 明 了 什 么?
在 这 篇 文 章 里, 我 尽 量 提 供 你 需 要 的 信 息, 使 你 有 效 地 决 定 采 纳 哪 种 组 件 模 型。 但 如 果 在 读 此 文 章 后, 注 意 到 上 述 实 践 片 段 包 含 的 对JavaBeans 和ActiveX 在 五 个 重 要 领 域 作 出 评 价, 你 仍 需 要 指 导, 继 续 向 下 读:

如 果 你 的 应 用 程 序 是 在 纯Java 世 界(100% Java world) 中 使 用 的, 那 么 使 用Java, 使 用 JavaBeans。 如 果 你 的 应 用 程 序 是Window world, 那 么 使 用ActiveX。 使 用Java, C++,Visual Basic 或 适 当 的 组 合。 显 然,ActiveX 提 供 了 向Intranet 快 速 引 入 现 有 代 码 好 的 解 决 方 案。

如 果 你 的 应 用 程 序 必 须 在Internet 上 配 置, 那 么 出 于 安 全 性 考 虑,Java/JavaBeans 是 唯 一 的 选 择。 我 们 公 司 的ActiveX 安 全 性 策 略 如 下: 如 果 你 编 写 它 和 它 来 自 防 火 墙 内, 那 么 可 以, 否 则, 在 我 们 的 机 器 上 它 不 能 执 行。 普 遍 来 讲。 大 量 的 用 户 教 育 是 必 要 的, 哪 里 和 在 什 么 时 候 不 要 执 行 不 信 赖 的 代 码 ? 我 的 观 点 是: 一 个 用 户 在 没 有 被 事 先 警 告 将 遇 到 的 危 险 的 情 况 下, 不 能 自 动 执 行 一 个 控 件。

从 另 一 个 方 面 来 说, 如 果 你 正 在 查 看Intranet 的 配 置, 你 必 须 对Windows 的 集 成(ActiveX) 和 跨 平 台(JavaBeans) 进 行 正 反 分 析。ActiveX 的 安 全 性 考 虑 是 无 意 义 的。 对 很 多 应 程 序 来 说, ActiveX 能 够 取 得 优 势, 仅 是 因 为 它 已 经 完 成, 它 可 以 工 作, 如 果 你 希 望 利 用 现 存 的 Windows 代 码 来 开 发Java ActiveX 应 用 程 序, 你 也 能 够 做 到。 在 另 一 方 面, 排 除 市 场 因 素, 如 果 你 透 过 表 面 深 入 研 究, 你 会 发 现ActiveX 非 常 复 杂, 完 全 缺 乏 跨 平 台 能 力。 如 果 你 愿 意 支 持100% 纯Java 和 不 成 熟 的IDEs,JavaBean 为 长 期 项 目 开 发 提 供 一 个 非 常 吸 引 人 的 跨 平 台 机 会。

放 眼 未 来
由 于 技 术 不 停 变 化, 未 来 很 难 预 测, 但 如 下 评 价 是 显 而 易 见 的:Microsoft 将 采 纳JavaBeans 通 过 把 所 有 的JavaBeans 作 为ActiveX 控 件。 但 是 否 将JavaBeans 做 为 框 架 结 构 来 开 发 完 全 成 熟 的JavaActivex 控 制 还 不 清 楚,JavaSoft 和 第 三 方 厂 商 将 发 布 完 全 成 熟 的 支 持JavaBeans 的 开 发 环 境, 这 将 第 一 次 使Java 向VB-style 快 速 开 发 的 风 格 转 变。 有 一 件 事 可 以 肯 定: 竞 争 仍 将 激 烈 地 进 行 下 去。