快 速 应 用
程 序 开 发 包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 快
速 开 发 的 风 格 转 变。 有 一 件 事
可 以 肯 定: 竞 争 仍 将 激 烈 地 进
行 下 去。
|