动态网站设计十八般武艺——ASP篇(十四)

 

    当 你 用 ASP 编 写 服 务 器 端 应 用 程 序 时, 必 须 依 靠 ActiveX 组 件 来 强 大 Web 应 用 程 序 的 功 能, 譬 如: 你 需 要 连 接 数 据 库, 对 数 据 库 进 行 在 线 操 作 等 等,继 上 篇 介绍 了 AD Rotator 组 件 后,本 篇 将 接 着 给 大 家 介 绍 其 它 一 些 常 用 的 ASP ActiveX 组 件 的 使 用 方 法。

     最 近 仍 有 不 少 朋 友 来 信 问 我, ASP 是 否 只 能 在 Microsoft IIS 上 运 行, 是 否 可 以 在 非 NT 平 台 上 运 作? 本 来 这 个 问 题 我 已 经 回 答 过 很 多 遍 了 : 我 只 是 听 说 过 有 某 种 可 以 支 持 的 软 件, 却 从 没 见 过。 但 一 些 热 情 的 朋 友 仍 然 孜 孜 不 倦 地 来 信 询 问, 于 是 在 朋 友 们 的 盛 情 之 下, 我 访 遍 了 ASP 相 关 站 点, 竟 惊 奇 的 发 现, 原 来 ASP 的 确 是 可 以 运 行 在 其 它 非 NT 平 台 上 的, 因 此 在 本 篇 的 开 头, 我 就 给 来 信 的 朋 友 们 简 要 介 绍 一 下 如 何 在 非 NT 平 台 上 使 用 ASP。

   要 在 非 NT 平 台 上 开 发 并 运 行 ASP 应 用 程 序 我 们 可 以 依 赖 于 一 套 名 为 Instant ASP 的 第 三 方 软 件, 它 的 广 告 标 语 非 常 吸 引 人“ASP Anytime, Anywhere”, 我 想 所 有 ASP 的 开 发 者 们 看 到 如 此 的 标 语 必 然 兴 奋 不 已。 这 套 由 Halcyon 软 件 公 司 开 发 的 软 件 使 得 你 无 需 重 复 开 发 原 有 ASP 应 用 程 序 即 可 以 将 它 运 行 在 任 何 操 作 平 台 上 ! 这 样 非 但 节 省 了 大 量 的 开 发 时 间, 而 且 使 得 ASP 真 正 成 为 了 一 种 跨 平 台 的 Internet、 Intranet 或 Extranet 应 用 程 序。 Instant ASP 本 身 其 实 是 一 套 基 于 Java 的 应 用 程 序, 因 此 通 过 它 你 可 以 将 基 于 WEB 的 ASP 应 用 程 序 运 行 在 任 何 平 台 上, 下 表 列 出 了 Instant ASP 目 前 版 本 所 支 持 的 操 作 平 台。

   更 令 人 吃 惊 的 是 Instant ASP 不 仅 提 供 了 ASP 的 运 作 环 境, 而 且 它 较 目 前 市 场 上 的 ASP 应 用 还 提 供 了 更 为 强 大 和 实 用 的 功 能, 它 将 ActiveX 组 件 和 Enterprise Java Beans 或 者 CORBA-compliant objects 组 合 起 来, 从 而 使 ASP 有 了 更 为 广 泛 的 应 用。 它 同 样 提 供 了 通 过 ADO 接 口 访 问 连 接 各 种 数 据 库, 并 生 成 动 态 页 面 的 强 大 功 能。 对 于 开 发 者 而 言 可 以 使 用 自 己 擅 长 的 编 程 语 言 或 工 具 如 :Visual Basic, JScript, VBScript, C++, Java, HTML, Delphi , MS Visual InterDev 等 等 来 进 行 开 发。 关 于 Instant ASP 具 体 安 装 和 操 作 我 就 不 在 这 里 展 开 了, 有 兴 趣 的 朋 友 可 以 到 它 的 站 点 上 去 看 看 halcyonsoft.com, 你 还 可 以 免 费 下 载 一 个 试 用 版 试 试。

   继 上 一 篇 中 作 者 给 大 家 介 绍 了 AD Rotator 组 件 的 使 用 方 法 后, 今 天 我 们 接 着 来 看 看 其 它 的 一 些 ASP 常 用 组 件。

   一、 Database Access 组 件

   我 们 在 WEB 服 务 器 上 运 用 WEB 应 用 程 序 进 行 的 最 常 见 和 最 实 用 的 任 务 就 是 访 问 服 务 器 端 的 数 据 库。 而 ASP 内 建 的 Database Access 组 件 使 得 我 们 能 够 轻 而 易 举 地 通 过 ActiveX Data Objects (ADO) 访 问 存 储 在 服 务 器 端 的 数 据 库 或 其 他 表 格 化 数 据 结 构 中 的 信 息。 ADO 是 对 当 前 微 软 所 支 持 的 数 据 库 进 行 操 作 的 最 有 效 和 最 简 单 直 接 的 方 法, 它 是 一 种 功 能 强 大 的 数 据 访 问 编 程 模 式, 从 而 使 得 大 部 分 数 据 源 可 编 程 的 属 性 得 以 直 接 扩 展 到 你 的 Active Server 页 面 上。 可 以 使 用 ADO 去 编 写 紧 凑 简 明 的 脚 本 以 便 连 接 到 Open Database Connectivity (ODBC) 兼 容 的 数 据 库 和 OLE DB 兼 容 的 数 据 源, 这 样 ASP 程 序 员 就 可 以 访 问 任 何 与 ODBC 兼 容 的 数 据 库, 包 括 MS SQL SERVER、 Access、 Oracle 等 等。 如 果 您 是 一 个 对 数 据 库 连 接 有 一 定 了 解 的 脚 本 编 写 人 员, 那 么 您 将 发 现 ADO 命 令 语 句 并 不 复 杂 而 且 容 易 掌 握。 同 样 地, 如 果 您 是 一 个 经 验 丰 富 的 数 据 库 编 程 人 员, 您 将 会 正 确 认 识 ADO 的 先 进 的 与 语 言 无 关 性 和 查 询 处 理 功 能。 熟 悉 VB 数 据 库 编 程 的 朋 友 会 发 现 ADO 与 RDO (Remote Data Objects) 有 某 种 类 似 的 地 方。 但 据 说 ADO 的 访 问 的 速 度 更 快, 内 存 需 要 更 小。

   下 面 给 大 家 简 要 介 绍 一 下 利 用 ASP 的 Database Access 组 件 通 过 ADO 连 接 并 操 作 WEB 数 据 库 的 步 骤

   第 一 步 : 指 定 想 要 连 接 的 数 据 库, 有 DSN 和 DSN-less 两 种 方 法。

   DSN(Data Source Name 数 据 源 名 称 ): 建 立 一 个 系 统 数 据 源 名 称, 方 法 如 下 :

   1、 单 击“开 始”, 选 设 置 控 制 面 板。

   2、 双 击 图 标“32 位 ODBC” , 将 弹 出 一 个 对 话 框, 选 标 签“System DSN”

   3、 单 击“Add” 添 加 一 个 DSN 入 口 , 选 择 如“Microsoft Access Drive” 并 确 认。

   4、 在“Data Source Name” 栏 里 输 入 你 希 望 指 定 的 DSN, 然 后 单 击“Select” 选 择 数 据 库 存 放 位 置, 你 可 以 按“Browse” 来 选 取。

   5、 以 上 步 骤 完 成 后 在 ASP 程 序 中 指 定 DSN, 如 下 :

   < %connstr = "DSN"%>

   DSN-less: 是 另 一 种 通 过 在 ASP 文 件 里 直 接 指 定 数 据 库 文 件 所 在 位 置, 而 无 需 建 立 DSN 的 方 法。 由 于 许 多 公 司 没 有 自 己 的 WEB 服 务 器, 他 们 的 网 站 往 往 是 存 放 在 远 端 的 虚 拟 服 务 器 上, 因 此 要 建 立 和 修 改 DSN 的 设 置 比 较 麻 烦。 而 使 用 DSN-less 方 法 直 接 指 定 远 端 数 据 库 所 在 位 置 恰 恰 解 决 了 这 一 问 题, 方 法 如 下 :

< %
connstr = "DBQ="+server.mappath("database/source.mdb")+";DefaultDir=;DRIVER={Microsoft Access Driver (*.mdb)};DriverId=25;FIL=MS Access;ImplicitCommitSync=Yes;MaxBufferSize=512;MaxScanRows=8;PageTimeout=5;SafeTransactions=0;Threads=3;UserCommitSync=Yes;"
%>

   在 指 定 了 想 要 连 接 的 数 据 库 后, 就 可 以 通 过 以 下 方 法 连 接 并 打 开 数 据 库 :

< %
Set Conn = Server.CreateObject("ADODB.Connection")Conn.Open constr
%>

   第 二 步 : 指 定 想 要 执 行 的 SQL 指 令, 可 以 使 用 RecordSet。

   当 连 接 了 数 据 库 后 就 可 以 对 数 据 库 进 行 操 作, 比 如 查 询、 删 除、 更 新 等 等, 这 些 操 作 都 是 通 过 SQL 指 令 来 完 成 的, 如 下 例 在 数 据 库 表 datebase 中 查 询 所 有 姓 名 中 有“A” 的 记 录 :

< %
sql="select * from datebase where name like 'A%%'"
Set rs = Conn.Execute(sql)
%>

   尽 管 Connection 对 象 简 化 了 连 接 数 据 库 和 查 询 任 务, 但 Connection 对 象 仍 有 许 多 不 足。 确 切 地 说, 检 索 和 显 示 数 据 库 信 息 的 Connection 对 象 不 能 用 于 创 建 脚 本, 您 必 须 确 切 知 道 要 对 数 据 库 作 出 的 更 改, 然 后 才 能 使 用 查 询 实 现 更 改。 对 于 检 索 数 据、 检 查 结 果、 更 改 数 据 库, ADO 提 供 了 Recordset 对 象。 正 如 它 的 名 称 所 暗 示 的 那 样, Recordset 对 象 有 许 多 您 可 以 使 用 的 特 性, 根 据 您 的 查 询 限 制, 检 索 并 且 显 示 一 组 数 据 库 行, 即 记 录。 Recordset 对 象 保 持 查 询 返 回 的 记 录 的 位 置, 允 许 您 一 次 一 项 逐 步 扫 描 结 果。 根 据 Recordset 对 象 的 指 针 类 型 属 性 设 置, 您 可 以 滚 动 和 更 新 记 录。 数 据 库 指 针 可 以 让 您 在 一 组 记 录 中 定 位 到 特 定 的 项。 指 针 还 用 于 检 索 和 检 查 记 录, 然 后 在 这 些 记 录 的 基 础 上 执 行 操 作。 Recordset 对 象 有 一 些 属 性, 可 用 于 精 确 地 控 制 指 针 的 行 为, 提 高 您 检 查 和 更 新 结 果 的 能 力。

   Recordset 的 使 用 方 法 如 下 :

   Set rs = Server.CreateObject("ADODB.Recordset")

   rs.Open SQL 指 令 , Conn, 1, 1 ' 读 取

   或

   rs.Open SQL 指 令 , Conn, 1, 3 ' 新 增、 修 改、 或 删 除

   第 三 步 : 使 用 RecordSet 属 性 和 方 法, 并 显 示 执 行 的 结 果。

   通 过 以 上 指 令, 我 们 创 建 了 一 个 包 含 数 据 的 游 标 (RecordSet)“rs”, 事 实 上 游 标 是 存 储 在 活 动 内 存 中 的 类 似 记 录 和 字 段 的 数 组 的 东 西, 当 通 过 RecordSet 组 件 创 建 一 个 游 标 时, 它 从 数 据 提 供 者 的 得 到 一 个 数 据 集, 并 用 它 来 充 实 游 标, 我 们 可 以 想 象 ADO 产 生 的 RecordSet 是 一 个 象 电 子 表 格 的 记 录, 它 有 一 行 行 的 记 录, 在 任 何 时 候 都 有 一 行 是 它 的 当 前 行, 而 RecordSet 的 字 段 是 用 RecordSet 的 Field 集 合 表 示 的。 下 面 列 出 了 所 创 建 的 RecordSet 对 象 ( 游 标 ) 的 一 些 属 性 和 方 法 :

   rs.Fields.Count: RecordSet 对 象 的 字 段 总 数。

   rs(i).Name: 第 i 个 字 段 的 名 称, i 由 0 算 起 到 rs.Fields.Count-1。

   rs(i): 读 取 第 i 个 字 段 的 数 据, i 由 0 算 起 到 rs.Fields.Count-1。

   rs(" 字 段 名 称 "): 读 取 指 定 字 段 的 数 据。

   rs.RecordCount: 游 标 中 的 数 据 记 录 总 数。

   rs.EOF: 是 否 已 指 到 最 后 一 条 记 录。

   rs.MoveNext: 将 指 标 移 到 下 一 笔 记 录。

   rs.MovePrev: 将 指 标 移 到 上 一 笔 记 录。

   rs.MoveFirst: 将 指 标 移 到 第 一 笔 记 录。

   rs.MoveLast: 将 指 标 移 到 最 后 一 笔 记 录。

   rs.Close: 关 闭 RecordSet 对 象

   有 关 ADO 的 其 他 介 绍, 作 者 将 在 今 后 给 大 家 详 细 讲 解。

   二、 Content Linking 组 件

   如 果 你 的 网 站 有 一 系 列 相 互 关 联 的 页 面 的 话, Content Linking 组 件 将 非 常 适 合 你 的 需 求, 它 非 但 可 以 使 你 在 这 些 页 面 中 建 立 一 个 目 录 表, 而 且 还 可 以 在 它 们 中 间 建 立 动 态 连 接, 并 自 动 生 成 和 更 新 目 录 表 及 先 前 和 后 续 的 Web 页 的 导 航 链 接。 这 对 于 列 出 联 机 报 刊、 电 子 读 物 网 站 以 及 论 坛 邮 件 是 十 分 理 想 的 选 择。

   Content Linking 组 件 创 建 管 理 URL 列 表 的 Nextlink 对 象, 要 使 用 Content Linking 组 件, 必 须 需 要 先 创 建 Content Linking List 文 件。 Content Linking 组 件 正 是 通 过 读 取 这 个 文 件 来 获 得 处 理 我 们 希 望 链 接 的 所 有 页 面 的 信 息。 事 实 上 该 文 件 是 一 个 纯 文 本 文 件, 其 内 容 如 下 :
page1.htm one
page2.htm two
page3.htm three
page4.htm four
page5.htm five
page6.htm six

   这 个 文 本 文 件 的 每 行 有 如 下 形 式 :

   url description comment

   其 中, URL 是 与 页 面 相 关 的 超 链 地 址, description 提 供 了 能 被 超 链 使 用 的 文 本 信 息, comment 则 包 含 了 不 被 Content Linking 组 件 解 释 的 注 释 信 息, 它 的 作 用 如 同 程 序 中 的 注 释。 description 和 comment 参 数 是 可 选 的。

   下 面 我 们 来 看 看 如 何 具 体 使 用 Content Linking 组 件 :

< html>
< head>
< meta http-equiv="Content-Type" content="text/html; charset=gb2312">
< title> 网 络 电 子 读 物 宝 藏 < /title>
< /head>
< body>
< p> 网 络 电 子 读 物 导 航
< %
Set Link = Server.CreateObject("MSWC.NextLink")
count = Link.GetListCount("nextlink.txt")
Dim I
For I=1 to count
%>
< ul>< li>< a href="< %= Link.GetNthURL("nextlink.txt", I) %>">< %= Link.GetNthDescription("nextlink.txt", I) %>< /a>
< % Next %>
< /body>
< /html>

   在 以 上 代 码 中, 我 们 先 用 GetListCount 方 法 确 定 在 文 件 nextlink.txt 中 有 多 少 条 项 目, 然 后 利 用 循 环 语 句, 并 使 用 GetNthURL、 GetNthDescription 方 法 逐 一 将 存 储 在 nextlink.txt 文 件 中 的 内 容 读 出 并 显 示 给 客 户 端 浏 览 器。

   下 面 列 出 了 Content Linking 组 件 所 有 可 使 用 的 方 法 GetListCount(file) 统 计 内 容 链 接 列 表 文 件 中 链 接 的 项 目 数。

   GetNextURL(file) 获 取 内 容 链 接 列 表 文 件 中 所 列 的 下 一 页 的 URL。

   GetPreviousDescription(file) 获 取 内 容 链 接 列 表 文 件 中 所 列 的 上 一 页 的 说 明 行。

   GetListIndex(file) 获 取 内 容 链 接 列 表 文 件 中 当 前 页 的 索 引。

   GetNthDescription(file,index) 获 取 内 容 链 接 列 表 文 件 中 所 列 的 第 N 页 的 说 明。

   GetPreviousUR(file) 获 取 内 容 链 接 列 表 文 件 中 所 列 的 上 一 页 的 URL。

   GetNextDescription(file) 获 取 内 容 链 接 列 表 文 件 中 所 列 的 下 一 页 的 说 明。

   GetNthURL(file,index) 获 取 内 容 链 接 列 表 文 件 中 所 列 的 第 N 页 的 说 明。

   在 我 们 创 建 了 网 站 的 总 导 航 页 面 后, 我 们 当 然 还 希 望 在 每 一 页 中 添 加 一 个“上 一 页”、“下 一 页” 的 导 航 超 链, 下 面 我 们 就 来 看 看 如 何 实 现 导 航 超 链。

   由 于 考 虑 到 你 的 网 站 可 能 包 含 了 上 千 或 更 多 的 页 面, 所 以 我 们 不 可 能 在 每 一 个 页 面 中 都 编 写 实 现 导 航 超 链 的 ASP 代 码。 因 此, 我 们 必 须 利 用 前 几 篇 中 所 学 到 的 服 务 器 端 包 容 SSI, 这 样 就 避 免 了 大 量 的 重 复 作 业, 请 看 下 例 :

   < !--#include file="nextprev.inc"-->

   只 要 将 这 端 代 码 放 在 每 个 页 面 中 即 可。 nextprev.inc 文 件 的 内 容 如 下 :

< %
Set Link = Server.CreateObject("MSWC.NextLink")
count = Link.GetListCount("nextlink.txt")
current = link.GetListIndex("nextlink.txt")
If current > 1 Then
%>
< a href="< %= Link.GetPreviousURL("nextlink.txt") %>"> 上 一 页 < /a>
< %
End If
If current < count Then
%>
< a href="< %= Link.GetNextURL("nextlink.txt") %>"> 下 一 页 < /a>
< % End If %>