用Delphi编写CGI程序(六)
用Delphi编写CGI程序(六) |
在 前 面 的 几 个 章 节 里 , 我 们 完 成 了 CGI 程 序 的 一 般 论 述 。 在 此 , 我 给 出 一 个 简 单 的 示 范 程 序 作 为 对 以 前 的 内 容 的 总 结 。 要 使 用 这 个 程 序 , 您 需 要 OmniHTTPD 的 最 新 测 试 版 : OmniHTTPD 2.0b1 (beta 1) for Windows 95/NT 。 如 果 您 没 有 , 可 以 在 这 里 下 载 ( oh20b1.zip) 。 安 装 OmniHTTPD 同 第 一 讲 中 的 方 法 一 样 , 这 里 就 不 再 讲 了 。 我 在 这 里 只 讲 一 讲 这 一 版 本 中 的 一 些 设 置 问 题 : 打 开 OmniHTTPD 的 属 性 设 置 对 话 框 , 使 用 Web Server Global Setting 按 钮 , 转 到 External 页 , 将 .cgi 的 设 置 删 除 。 在 未 删 除 时 , 用 cgi 作 扩 展 名 的 CGI 程 序 是 作 为 Perl 程 序 处 理 的 ; 在 我 们 的 课 程 中 , Perl 语 言 的 CGI 程 序 的 扩 展 名 是 .pl , 而 编 译 后 的 CGI 程 序 扩 展 名 是 .cgi , 所 以 , 要 将 设 置 作 这 样 的 修 改 。 在 这 个 版 本 的 OmniHTTPD 中 , 对 SSI(Server Side Include) 命 令 的 支 持 比 以 前 的 版 本 大 大 加 强 了 , 支 持 include 、 exec 等 命 令 。 在 示 范 程 序 中 , 我 用 到 了 这 些 命 令 。 您 将 (ex8.zip) 下 载 后 , 里 面 包 含 三 个 文 件 : index.shtml 、 makelog.cpp 和 makelog.exe 。 index.shtml 是 一 个 包 含 SSI 命 令 的 脚 本 , 请 拷 贝 到 c:httpdhtdocs 目 录 下 ; makelog.exe 是 CGI 程 序 , 请 拷 贝 到 c:httpdcgi-bin 目 录 下 ; makelog.cpp 是 makelog.exe 的 源 文 件 , 如 果 您 要 修 改 编 译 的 话 , 必 须 用 32 位 的 编 译 器 , 如 VC 等 , 否 则 无 法 使 用 。 除 此 之 外 , 您 需 要 将 OmniHTTPD 中 的 设 置 作 一 个 修 改 : 选 择 Default Virtual Setting , 在 Server 页 上 将 Default Index 改 为 index.shtml 。 这 样 , 当 您 在 浏 览 器 中 敲 入 http://localhost 时 , OmniHTTPD 自 动 调 入 index.shtml 。 再 做 一 个 WEB 文 档 , 以 index.html 为 文 件 名 存 在 c:httpdhtdocs 目 录 下 。 您 用 浏 览 器 访 问 localhost 时 , index.shtml 先 调 用 makelog.exe , 存 储 用 户 的 访 问 信 息 , 再 调 用 index.html , 将 其 显 示 在 浏 览 器 中 。 用 户 的 访 问 信 息 存 储 在 c:httpdcgi-bin 目 录 下 的 userlog 文 件 中 。 这 个 实 例 用 到 了 CGI 规 范 中 基 本 的 环 境 变 量 和 SSI 技 术 , 请 您 好 好 研 究 一 下 。 4 、 数 据 库 在 CGI 的 应 用 中 , 数 据 库 方 面 的 应 用 是 最 体 现 CGI 程 序 强 大 功 能 的 。 在 互 联 网 上 , 数 据 库 是 非 常 多 的 , 而 这 些 数 据 库 的 WEB 应 用 的 需 求 也 是 越 来 越 多 ( 无 论 是 来 自 公 司 的 还 是 来 自 用 户 的 需 求 ) 。 可 以 说 , WEB 本 身 就 是 一 个 巨 大 的 数 据 库 , 如 何 将 这 些 庞 大 的 数 据 集 合 有 效 的 组 织 起 来 , 在 WEB 上 进 行 发 布 , 是 CGI 和 数 据 库 系 统 共 同 解 决 的 课 题 。 如 果 要 对 CGI 和 数 据 库 的 应 用 进 行 分 类 的 话 , 从 不 同 角 度 有 不 同 的 分 类 方 法 。 例 如 , 按 数 据 库 的 规 模 可 以 分 成 文 本 数 据 库 、 本 地 数 据 库 (Microsoft Access 等 ) 和 数 据 库 服 务 器 (MS SQL Server 、 Informix 等 ) ; 按 CGI 的 处 理 内 容 可 以 分 为 前 端 数 据 库 CGI 程 序 ( 同 使 用 WEB 浏 览 器 的 用 户 交 互 的 CGI 程 序 ) 和 后 端 数 据 库 CGI 程 序 ( 同 数 据 库 交 互 的 CGI 程 序 ) 等 。 选 择 数 据 库 的 规 模 通 常 取 决 于 您 要 完 成 的 任 务 的 数 据 量 、 成 本 等 ; 在 编 制 CGI 程 序 时 采 用 前 端 和 后 端 分 开 还 是 结 合 通 常 取 决 于 您 的 数 据 处 理 的 复 杂 程 度 等 。 通 常 , 如 果 您 的 数 据 集 合 在 几 兆 字 节 之 内 , 而 且 您 的 数 据 记 录 之 间 没 有 复 杂 的 关 系 , 您 可 以 选 择 用 文 本 文 件 建 立 数 据 库 , 这 样 可 以 使 成 本 限 制 在 最 小 , 而 且 文 本 文 件 有 一 个 数 据 库 管 理 系 统 (DBMS , 即 DataBase Management System) 所 没 有 的 优 势 : 如 果 您 的 数 据 发 生 了 错 误 , 您 可 以 将 您 的 文 本 文 件 调 入 任 何 一 个 文 本 编 辑 器 进 行 恢 复 , 而 若 是 您 的 数 据 库 系 统 发 生 了 错 误 , 除 非 您 是 一 个 数 据 库 专 家 , 否 则 很 难 修 复 。 如 果 您 的 数 据 集 合 非 常 大 , 或 者 您 的 数 据 记 录 之 间 存 在 着 复 杂 的 关 系 , 则 最 好 选 用 数 据 库 系 统 。 用 文 本 文 件 实 现 一 个 几 十 兆 的 数 据 库 会 使 任 何 一 台 高 级 的 RISC 服 务 器 不 堪 重 负 。 如 果 您 用 CGI 程 序 处 理 数 据 间 复 杂 的 关 系 , 必 然 会 使 CGI 程 序 的 复 杂 性 加 大 , 占 用 过 多 的 服 务 器 资 源 ; 另 一 方 面 , 利 用 数 据 库 系 统 的 功 能 可 以 简 化 CGI 程 序 设 计 的 难 度 , 提 高 开 发 效 率 。 在 选 择 数 据 库 系 统 时 , 您 需 要 从 以 下 几 个 方 面 进 行 选 择 : 一 、 操 作 系 统 平 台 : 您 应 该 选 择 您 最 熟 悉 的 数 据 库 系 统 , 也 要 选 择 您 最 熟 悉 的 操 作 系 统 平 台 , 只 有 这 样 , 才 可 以 少 出 错 误 。 二 、 价 格 : 您 应 在 各 种 能 完 成 您 的 工 作 的 数 据 库 系 统 中 选 择 最 便 宜 的 , 在 这 里 , 我 可 以 告 诉 大 家 一 个 免 费 的 数 据 库 系 统 , 叫 MiniSQL , 它 必 须 在 UNIX 或 Linux 平 台 上 运 行 , 我 还 不 知 道 哪 里 有 Windows 平 台 的 免 费 数 据 库 系 统 , 如 果 谁 知 道 , 请 告 诉 我 , 我 会 在 今 后 的 课 程 中 告 诉 大 家 的 。 我 们 的 课 程 是 讲 述 用 Delphi 开 发 CGI 程 序 的 , 而 Delphi 中 提 供 了 Interbase Server 数 据 库 系 统 , 因 此 , 我 在 这 里 将 主 要 讲 述 采 用 数 据 库 系 统 的 CGI 程 序 开 发 。 同 时 , 由 于 数 据 库 系 统 减 轻 了 大 量 的 编 码 工 作 , 我 采 用 前 端 CGI 和 后 端 CGI 合 二 为 一 的 方 式 , 在 一 个 CGI 程 序 中 就 完 成 用 户 输 入 处 理 和 数 据 库 操 作 。 但 在 其 他 的 系 统 平 台 上 , 也 许 这 种 方 式 会 不 使 用 , 请 各 位 读 者 按 前 面 的 讨 论 自 己 斟 酌 。 在 这 里 , 我 要 附 带 说 明 一 下 几 种 不 同 的 CGI 及 其 在 我 们 的 OmniHTTPD 中 的 使 用 差 别 : Standard CGI : 标 准 CGI , 必 须 放 置 在 /cgi-bin/ 设 置 的 目 录 下 , 可 以 在 OmniHTTPD 运 行 时 随 时 修 改 。 Win CGI : 应 用 在 Windows 系 统 中 的 CGI , 必 须 放 置 在 /cgi-win/ 设 置 的 目 录 下 。 此 CGI 应 用 INI 文 件 获 取 用 户 端 浏 览 器 的 请 求 , 而 不 是 使 用 环 境 变 量 或 标 准 输 入 。 我 们 一 般 不 使 用 这 种 CGI 。 ISAPI : Microsoft 公 司 提 出 的 一 种 应 用 动 态 链 接 库 的 CGI 规 范 。 NSAPI : Netscape 公 司 提 出 的 一 种 应 用 动 态 链 接 库 的 CGI 规 范 。 这 几 种 CGI 规 范 各 有 特 点 : 其 中 Standard CGI 可 以 使 用 可 执 行 程 序 或 Perl 等 脚 本 语 言 编 写 , 但 效 率 低 , 占 用 资 源 多 , 每 一 个 CGI 请 求 就 会 有 一 个 CGI 程 序 的 实 例 在 服 务 器 中 运 行 。 Win CGI 的 特 点 同 Stardand CGI 相 同 。 ISAPI 和 NSAPI 效 率 高 , 常 驻 内 存 , 而 且 无 论 有 多 少 个 CGI 请 求 , 在 服 务 器 中 只 有 一 个 实 例 在 运 行 , 仅 仅 是 这 个 实 例 对 应 的 数 据 集 合 不 同 ; 但 这 种 CGI 不 易 调 试 , 因 为 它 必 须 在 WEB 服 务 器 软 件 关 闭 时 才 可 以 进 行 更 新 。 在 下 一 讲 中 , 我 将 给 出 一 个 White Page 的 示 范 程 序 。 White Page 是 一 个 电 子 邮 件 地 址 的 清 单 , 您 可 以 让 用 户 通 过 WEB 浏 览 器 对 这 个 清 单 进 行 查 询 、 编 辑 、 新 增 和 删 除 等 操 作 。 在 这 一 讲 中 , 我 给 出 的 示 范 程 序 仅 仅 是 查 询 操 作 , 其 他 的 操 作 将 在 以 后 的 课 程 中 讲 述 。 这 个 示 范 程 序 建 立 在 Borland Interbase Server 数 据 库 上 , 用 Delphi 开 发 。 在 开 发 中 , 我 选 择 的 是 Standard CGI , 因 为 这 样 容 易 调 试 。 我 们 的 程 序 使 用 Stardand CGI 进 行 编 写 , 可 以 方 便 的 调 试 。 等 调 试 成 功 后 , 在 Delphi 中 可 以 很 方 便 的 改 成 ISAPI/NSAPI , 仅 仅 是 一 个 语 句 ( 怎 么 样 , Delphi 很 不 错 吧 ! ) 。 |
补充:软件开发 , Delphi ,