Web Application 開 發 利 器 - WebSnap!
第 二 章 、 第 一 個 WebSnap 程 式
2-1 、 起 步 走
前 面 談 了 許 多 理 論 , 這 一 章 我 們 就 開 始 來 撰 寫 我 們 的 第 一 個 WebSnap Application , 首 先 讓 我 們 開 啟 New Items Dialog , 接 著 切 換 到 WebSnap 頁 後 , 你 會 看 到 以 下 的 畫 面 :
DELPHI 6 提 供 了 三 個 WebSnap Wizard 來 加 快 我 們 開 發 程 式 的 速 度 , 這 裡 請 你 選 擇 WebSnap Application 來 建 立 一 個 新 的 WebSnap Application Project 。
從 左 邊 的 畫 面 上 我 們 可 以 看 到 Server Type 這 個 選 項 , 為 了 方 便 以 後 除 錯 , 請 你 選 擇 WebAppDebuger 並 輸 入 一 個 CoClassName 。 接 著 讓 我 們 看 看 第 二 區 段 的 選 項 , 在 這 裡 我 們 可 以 看 到 有 Page Module 及 Data Module 兩 種 Module 可 以 選 擇 , 這 些 就 是 我 們 在 上 一 節 中 所 討 論 過 的 Application Module 。 這 個 範 例 中 我 們 的 Application Module 必 須 要 能 輸 出 一 個 網 頁 , 因 此 請 你 選 擇 Page Module , 這 會 使 DELPHI 產 生 出 一 個 Application Page Module , 這 就 是 我 們 的 首 頁 。 同 時 在 右 下 角 處 你 也 可 以 看 到 一 個 Components 按 紐 , 執 行 她 後 就 會 開 出 右 邊 的 視 窗 , 在 這 個 視 窗 中 可 以 讓 我 們 選 擇 將 放 在 Module 中 的 元 件 。 這 裡 讓 我 簡 單 的 解 釋 一 下 這 些 元 件 所 代 表 的 意 義 :
Application Adapter
這 個 元 件 中 封 裝 了 Application 資 訊 , 例 如 Title 資 訊 等 。 由 於 Application Module 會 在 每 一 次 的 Client Request 到 達 後 被 活 化 , 所 以 我 們 也 可 以 利 用 TApplicationAdapter 的 Data 、 Actions 特 性 值 來 存 放 一 些 全 域 型 的 資 料 或 是 Action 操 作 。
End User Adapter
這 個 元 件 是 封 裝 了 使 用 者 管 理 及 權 限 控 制 的 Adapter , 負 責 使 用 者 的 Login/Logout 及 權 限 控 制 。 當 Dispatcher 在 將 Client Request 交 給 任 何 一 個 Module 之 前 , 必 須 利 用 她 來 確 認 該 使 用 者 是 否 有 權 利 進 入 這 個 Module 。 WebSnap 中 提 供 了 兩 個 這 類 型 的 Adapter , 一 個 是 TEndUserAdapter 另 一 個 則 是 會 將 使 用 者 資 料 存 放 在 Session 中 的 TEndUserSessionAdapter 。
Page Dispatcher
這 個 元 件 負 責 解 析 Client Request 中 的 Page Request 資 訊 , 接 著 找 到 正 確 的 Page Module 後 將 要 求 導 向 至 正 確 的 Page Module 中 。
Adapter Dispatcher
Adapter Dispatcher 負 責 解 析 Client Request 中 的 Action 資 訊 , 並 找 到 Action 所 在 的 Module 及 Action 元 件 後 執 行 該 Action 。 例 如 使 用 者 按 下 了 某 一 個 Button , 而 該 Button 連 結 到 某 一 個 Action , 那 這 個 要 求 就 會 被 送 往 Adapter Dispatcher 。
Dispatch Actions
這 個 元 件 屬 於 WebBroker 時 代 就 有 的 元 件 , 本 文 中 我 們 不 會 討 論 這 個 元 件 , 你 可 以 在 李 老 師 的 書 中 找 到 使 用 的 方 法 。
Locate File Service
這 個 元 件 提 供 了 檔 案 管 理 功 能 , 如 Script 中 的 Include File 命 令 , 或 是 取 得 HTML Template File 動 作 , 都 會 經 由 這 個 元 件 來 運 作 。
Sessions Service
主 要 是 提 供 Session 的 支 援 , 當 你 的 Application Module 含 有 此 元 件 時 , 就 代 表 你 的 Application Module 擁 有 處 理 Session 的 能 力 。
User List Service
這 個 元 件 中 儲 存 了 使 用 者 資 料 並 提 供 確 認 使 用 者 資 料 的 功 能 函 式 , TLoginAdapterForm 元 件 會 先 利 用 這 個 元 件 來 確 認 使 用 者 資 料 , 之 後 再 使 用 TEndUserAdapter 元 件 來 完 成 整 個 Login 的 動 作 。
這 個 範 例 中 我 們 只 需 要 勾 選 三 個 元 件 :ApplicationAdapter 、 Page Dispatcher 以 及 Adapter Dispatcher 。 選 定 後 按 下 OK 按 紐 後 就 會 回 到 左 邊 的 視 窗 中 , 接 著 請 你 點 選 Page Options 按 紐 , 開 出 下 面 這 個 視 窗 :
這 個 視 窗 中 的 選 項 可 以 讓 我 們 設 定 Page Module 的 資 訊 以 及 輸 出 網 頁 用 的 PageProducer 元 件 , 在 這 個 範 例 中 我 選 擇 了 TPageProducer 以 及 使 用 JScript 語 言 。 接 下 來 的 HTML 區 段 可 以 讓 我 們 設 定 是 否 要 產 生 一 個 新 的 HTML File 及 HTML Template 的 樣 式 , 請 你 在 Template 部 份 選 擇 Standard Template , 這 可 以 令 DELPHI 產 生 出 標 準 的 HTML Template File 。 另 外 在 Page 區 段 中 我 們 還 可 以 設 定 Page 的 Name 及 Title 這 兩 個 特 性 值 , Name 是 Module 的 名 稱 , Title 則 是 顯 示 於 網 頁 上 的 標 題 字 串 。 這 個 區 段 的 下 方 還 有 Published 及 Login Required 兩 個 選 項 , Published 是 用 來 控 制 這 個 Page 是 否 是 公 開 的 , 當 Published 被 Disable 時 , 這 個 Page 就 會 被 隱 藏 起 來 , 使 用 者 也 就 不 能 以 URL 來 訪 問 這 個 Page 了 。 在 某 些 情 況 下 我 們 可 以 利 用 一 些 技 巧 將 這 個 Page 輸 出 至 使 用 者 的 瀏 覽 器 , 這 通 常 使 用 於 動 態 產 生 的 網 頁 或 是 保 密 型 的 網 頁 中 。 Login Required 則 是 代 表 進 入 這 個 Page 之 前 , 使 用 者 是 否 需 要 先 經 過 Login 的 動 作 , 如 果 你 將 Application Module 標 示 為 需 要 先 Login 後 才 能 進 入 的 Page Module 時 , 使 用 者 一 定 要 先 Login 後 才 能 進 入 你 的 網 站 , 這 個 範 例 中 我 們 使 用 預 設 值 就 可 以 了 (Login Required = False) 。 按 下 OK 後 就 會 回 到 最 初 的 視 窗 中 , 我 們 再 看 到 Caching 這 個 選 項 部 份 , 這 個 選 項 控 制 Module 執 行 完 畢 後 是 要 存 留 在 記 憶 體 中 或 是 立 刻 釋 放 。 如 果 你 使 用 的 Server Type 是 CGI 的 話 , 因 為 CGI 程 式 的 特 性 是 在 執 行 後 立 刻 釋 放 記 憶 體 , 所 以 這 個 選 項 對 你 就 沒 有 意 義 了 。 但 如 果 你 使 用 的 是 ISAPI 亦 或 是 Apache Share Module 時 , 你 就 得 小 心 調 整 這 個 選 項 , 選 擇 Cache Instance 雖 然 可 以 加 快 下 次 載 入 此 Module 的 速 度 , 但 是 會 耗 費 一 些 記 憶 體 , 因 此 請 小 心 的 調 整 這 個 選 項 。 我 們 通 常 都 會 將 Application Module 存 放 於 Cache 中 , 因 為 她 是 最 常 用 的 Module , 這 也 是 預 設 的 選 項 。 最 後 按 下 OK 按 紐 後 , 我 們 就 完 成 這 個 WebSanp Application 的 第 一 步 建 立 工 作 了 :
DELPHI 6 的 IDE 環 境 中 提 供 了 編 輯 以 及 預 覽 HTML 的 能 力 , 當 你 切 換 到 Home Unit 時 , 你 應 該 可 以 在 Code Editor 下 方 看 到 5 個 Tab Page , 請 你 切 換 到 .html 頁 , 你 會 看 到 以 下 的 畫 面 :
除 了 可 以 在 IDE 中 顯 示 及 編 輯 HTML 外 , 我 們 還 可 以 看 到 HTML 檔 案 中 有 類 似 ASP 的 Script 程 式 , 這 就 是 WebSnap 的 主 要 功 能 之 一 , 她 允 許 我 們 使 用 JScript 或 是 VBScript 來 撰 寫 網 頁 程 式 , 而 且 可 以 在 裡 面 使 用 WebSnap 所 提 供 的 元 件 。 例 如 Page 與 Application 這 兩 個 元 件 就 是 對 應 到 TWebPageInfo 及 TApplicationAdapter , 這 代 表 著 你 對 Page 及 Application 這 兩 個 Script Object 的 操 作 都 會 被 導 向 程 式 中 的 TWebPageInfo 及 TApplicationAdapter 之 中 , 下 面 的 圖 是 WebSnap 產 生 HTML 文 件 的 流 程 :
( 圖 :4)
圖 4 中 我 們 可 以 看 到 PageProducer 在 取 得 Script Document 後 就 會 由 Scriptable-Object 產 生 出 Wrapper Object 後 , 接 著 將 整 個 Script Document 交 由 Active Script Engine 解 譯 。 但 是 重 點 是 那 些 元 件 是 Scriptable-Object , 那 些 又 不 是 呢 ? 就 技 術 上 來 說 , 只 要 該 元 件 實 作 了 IGetScriptObject 這 個 介 面 並 輸 出 一 個 正 確 的 Wrapper 物 件 , 那 這 個 元 件 就 算 是 Scriptable-Object 了 。 我 們 在 第 一 章 中 所 提 到 的 八 大 類 型 元 件 中 , 除 了 Adapter 類 中 的 Adapter Control 不 是 之 外 , 其 它 都 算 是 Scriptable Object 。 其 實 在 Script 中 我 們 操 作 的 真 正 對 象 是 由 Scriptable-Object 所 產 生 出 來 的 Wrapper 物 件 , 她 會 將 Script 程 式 對 她 的 操 作 轉 交 給 真 正 的 物 件 :
( 圖 :5)
圖 5 中 你 可 以 發 現 到 , TAdapterWrapper( 實 際 上 是 TWebApplicationWrapper , 她 繼 承 至 TAdapterWrapper) 包 裝 了 TApplicationAdapter 元 件 , 而 TAdapterFieldWrapper 則 包 裝 了 TAdapterField 元 件 。 以 Application.Today.Value 這 段 Script 程 式 來 解 釋 的 話 : Application 是 TApplicationAdapter 的 Wrapper 物 件 , 而 TApplicationAdapter 擁 有 Today 這 個 TAdapterField 。 所 以 當 我 們 下 達 Application.Today 這 個 命 令 時 , Application 這 個 Wrapper 物 件 呼 叫 了 TApplicationAdapter 來 取 得 Today 這 個 TAdapterField 並 且 建 立 一 個 TAdapterFieldWrapper 後 , 傳 入 這 個 TAdapterField 物 件 , 接 著 返 回 Script Engine 。 那 麼 Script Engine 就 可 以 經 由 TAdapterFieldWrapper.Value 取 得 TAdapterField.Value 值 了 , 這 就 是 Scriptable-Object 的 運 作 方 式 。 讓 我 們 回 到 範 例 中 , 到 這 裡 為 止 , 我 們 已 經 完 成 了 一 個 簡 單 的 網 頁 , 你 可 以 先 執 行 程 式 後 再 啟 動 WebAppDebuger , 接 著 開 啟 IE/Netscape 來 瀏 覽 我 們 的 網 頁 。 啟 動 WebAppDebuger 的 詳 細 步 驟 可 以 在 我 的 前 幾 篇 文 章 中 找 到 說 明 , 成 功 的 話 你 會 在 IE/Netscape 中 看 到 以 下 的 畫 面 :
在 DELPHI 的 IDE 中 我 們 也 可 以 設 定 編 輯 網 頁 的 外 部 程 式 , 例 如 FrontPage 或 是 Dreamwaver 等 專 業 的 網 頁 編 輯 程 式 , 這 很 方 便 。 要 擁 有 這 個 功 能 , 我 們 必 須 調 整 開 發 環 境 的 一 些 設 定 , 請 你 開 啟 Tools-Enviroment Options 並 選 擇 Internet 頁 , 你 可 以 看 到 裡 面 有 兩 種 檔 案 格 式 :
HTML 與 XML , 請 選 擇 HTML 後 按 下 Edit 按 紐 :
如 果 你 的 電 腦 上 有 安 裝 FrontPage 或 是 Dreamwaver 的 話 , 你 應 該 可 以 在 Edit Action 列 表 中 看 到 她 們 。 請 選 擇 一 個 網 頁 編 輯 程 式 後 按 下 OK 後 回 到 IDE 中 , 如 果 你 之 前 有 將 Internet Toolbar 顯 示 於 IDE 上 的 話 , 你 就 可 以 馬 上 切 到 .html 頁 , 點 選 External Edit 來 啟 動 網 頁 編 輯 程 式 。 如 果 沒 有 的 話 , 請 你 在 Toolbar 上 按 右 鍵 選 擇 Internet 來 顯 示 Internet Toolbar:
Internet Toolbar
在 我 的 電 腦 上 安 裝 的 網 頁 編 輯 程 式 是 UltraDev , 因 此 我 按 下 External Edit 按 紐 後 的 畫 面 如 下 :
接 下 來 就 是 網 頁 編 輯 的 工 作 啦 , DELPHI 6 的 IDE 真 的 很 方 便 不 是 嗎 ? 如 果 網 頁 編 輯 的 人 不 是 你 自 己 的 話 , 你 可 以 將 uHome.html 複 製 給 她 , 設 計 完 成 後 再 放 回 你 的 專 案 目 錄 中 就 可 以 了 。
2-1 、 牛 刀 小 試 , 簡 單 的 AdpterField 運 用
現 在 讓 我 們 回 到 DELPHI IDE 中 , 現 在 我 們 有 個 問 題 , 如 果 我 們 想 在 網 頁 中 顯 示 今 天 日 期 的 話 該 怎 麼 做 呢 ? 很 簡 單 ! 我 們 可 以 利 用 TAdapterField 與 JScript 來 完 成 這 個 工 作 。 請 切 換 到 Home Module 上 , 在 TApplicationAdapter 元 件 中 你 可 以 發 現 到 Data 這 個 特 性 值 , 雙 按 她 後 會 開 出 以 下 的 畫 面 :
我 們 可 以 在 這 個 Field Designer 視 窗 中 加 入 AdapterField 類 的 元 件 , 請 在 設 計 畫 面 中 按 右 鍵 :
在 這 個 選 單 中 我 們 可 以 新 增 AdapterField 到 TApplicationAdapter 中 , 請 你 先 選 擇 Add All Fields 這 個 選 項 , 這 會 新 增 一 個 TApplicationTitleField 元 件 至 TApplicationAdapter 元 件 中 。 完 成 後 請 你 再 按 右 鍵 選 擇 New Component 選 單 :
請 選 擇 新 增 一 個 AdapterField 元 件 , 接 著 我 們 再 設 定 這 個 AdapterField 元 件 的 特 性 值 :
在 這 個 程 式 中 , 我 們 的 目 的 是 要 在 Script 中 使 用 這 個 AdapterField 來 取 得 當 天 的 日 期 。 因 此 我 們 要 為 這 個 AdapterField 撰 寫 取 得 日 期 的 事 件 , 請 切 到 Events 頁 , 撰 寫 OnGetValue 事 件 程 式 :
procedure THome.AdaptTodayGetValue(Sender: TObject;
var Value: Variant);
begin
Value:=DateToStr(Date);
end;
完 成 後 我 們 還 要 撰 寫 取 值 的 Script 程 式 , 請 切 到 .html 頁 在 Application.Title 下 一 行 加 入 以 下 的 Script 程 式 :
<h2> 今 天 是 <%= Application.Today.Value %></h1>
編 譯 完 成 後 執 行 程 式 , 你 應 該 可 以 看 到 這 樣 的 畫 面 :
很 簡 單 不 是 嗎 ? 以 往 要 達 到 這 種 效 果 我 們 得 先 寫 個 ASP Object , 接 著 再 使 用 ASP 來 呼 叫 這 個 Object 。 過 程 中 不 但 要 使 用 兩 種 工 具 , 還 得 注 意 COM 複 雜 且 難 懂 的 規 則 , 有 了 WebSnap 之 後 , 這 一 切 都 改 觀 了 。 我 們 既 可 以 得 到 ServerSide-Script 的 優 點 , 又 可 以 使 用 熟 悉 的 元 件 架 構 及 DELPHI 來 設 計 網 頁 程 式 , 這 大 大 的 增 加 程 式 師 的 產 能 。 在 這 個 範 例 中 , 你 可 能 會 很 納 悶 為 何 我 們 新 增 的 AdapterField 使 用 方 式 與 使 用 Title 時 不 同 呢 ? 看 起 來 Title 的 使 用 方 式 似 乎 簡 單 的 多 了 。 這 是 因 為 ApplicationAdapter 的 Wrapper Object 特 別 輸 出 了 一 個 Title 的 特 性 值 來 直 接 傳 回 Title 的 值 , 這 牽 扯 到 Wrapper Object 的 設 計 方 式 , 我 們 等 到 Inside WebSnap 一 文 中 再 詳 細 討 論 這 部 份 。
2-3 、 計 算 機 , AdapterField 與 AdapterAction 的 結 合
AdapterField 元 件 的 目 的 是 用 來 處 理 資 料 , 在 WebSnap 中 還 有 一 種 與 她 相 同 等 級 的 元 件 : AdapterAction , 這 種 Adapter 是 用 來 執 行 某 個 動 作 。 接 著 我 們 就 來 應 用 一 下 AdapterAction , 我 們 要 設 計 一 個 簡 單 的 計 算 機 , 目 的 只 是 要 將 使 用 者 輸 入 的 值 相 加 後 顯 示 出 來 。 請 回 到 IDE 中 新 增 一 個 Page Module 到 專 案 中 , 請 使 用 Internet Toolbar 或 是 New Items Dialog 。
我 們 在 這 個 Page Module 中 選 擇 使 用 AdapterPageProducer , 她 可 以 讓 我 們 使 用 DELPHI 所 提 供 的 視 覺 化 網 頁 設 計 功 能 (Visual Page Designer) 來 設 計 網 頁 :
然 後 我 們 新 增 一 個 Adapter 元 件 來 儲 存 AdapterField 及 AdapterAction:
接 著 我 們 雙 按 Adapter 元 件 中 的 Data 特 性 值 , 新 增 三 個 AdapterField: FirstValue 、 SecondValue,Result
First 與 Second 這 兩 個 AdapterField 是 用 來 儲 存 使 用 者 所 輸 入 的 資 料 。 Result 則 是 用 來 顯 示 結 果 值 用 。 接 下 來 我 們 還 需 要 一 個 確 定 的 按 紐 , 確 切 的 說 是 一 個 AdapterAction , 因 為 我 們 需 要 在 使 用 者 按 下 按 紐 後 執 行 相 加 的 動 作 。 記 得 嗎 ? AdapterAction 就 是 用 來 執 行 動 作 用 的 , 請 雙 按 Adapter 中 的 Actions 特 性 值 新 增 一 個 AdapterAction:
然 後 設 定 Action 的 特 性 值 。
接 著 我 們 還 要 定 義 一 個 變 數 來 儲 存 結 果 , 以 便 將 計 算 的 結 果 顯 示 給 使 用 者 。 在 這 裡 我 們 必 需 要 釐 清 一 個 觀 念 , 表 面 上 來 看 , AdapterField 是 用 來 儲 存 資 料 的 , 但 儲 存 資 料 用 的 容 器 ( 也 就 是 變 數 ) 則 是 要 我 們 來 提 供 。 因 此 請 在 程 式 碼 的 class 區 段 中 加 入 這 一 段 變 數 宣 告 :
private
FResultValue:string;
在 使 用 這 個 變 數 前 我 們 需 要 初 始 化 她 , 免 得 下 次 的 計 算 結 果 不 正 確 , 記 得 第 一 節 的 Web Module 說 明 嗎 ? 最 佳 的 初 始 化 事 件 可 不 是 OnCreate 哦 , 是 OnActivate! 請 在 這 個 事 件 中 將 FResultValue 變 數 初 始 成 空 字 串 , 之 後 再 為 AdaptResult 這 個 AdapterField 添 加 OnGetValue 事 件 , 在 裡 面 加 上 下 面 這 段 程 式 碼 :
Value:=FResultValue;
最 後 我 們 在 AdapterAction.OnExecute 事 件 中 加 上 處 理 計 算 部 份 的 程 式 碼 :
procedure TCalc.AdaptCalcExecute(Sender: TObject;
Params: TStrings);
var
v1,v2:Integer;
begin
v1:=AdaptFirstValue.ActionValue.Values[0];
v2:=AdaptSecondValue.ActionValue.Values[0];
FResultValue:=IntToStr(v1+v2);
end;
你 可 以 發 覺 到 , 在 這 個 事 件 中 我 們 使 用 的 是 AdapterField.ActionValue 這 個 特 性 值 而 不 是 Value 。 這 是 因 為 WebSnap 會 將 使 用 者 所 輸 入 的 值 是 儲 存 在 ActionValue 中 , 以 這 個 範 例 來 解 釋 的 話 就 是 : 使 用 者 輸 入 了 兩 個 值 並 按 下 Calc 按 紐 後 瀏 覽 器 就 會 將 這 些 資 訊 Post( 指 HTTPPost Method) 到 WebSnap 程 式 中 , 接 著 WebSnap 程 式 就 會 解 出 使 用 者 所 輸 入 的 兩 個 值 存 到 AdapterField.ActionValue 特 性 中 , 接 著 取 出 Action 的 資 訊 並 執 行 Action 。 為 何 要 這 麼 麻 煩 呢 ? 呵 ! 你 不 會 想 把 ActionValue 與 Value 合 成 一 個 的 , 因 為 這 樣 你 如 何 分 辨 原 值 與 使 用 者 所 輸 入 的 值 呢 ?
繼 續 我 們 的 程 式 , 現 在 我 們 要 開 始 設 計 計 算 機 的 網 頁 了 。 請 你 雙 按 AdapterPageProducer 開 出 Visual Page Designer 視 窗 :
在 AdapterPageProducer 上 按 滑 鼠 右 鍵 新 增 一 個 AdapterForm 元 件 :
然 後 在 AdapterForm 上 按 右 鍵 選 擇 New Componetns 新 增 一 個 AdapterFieldGroup 元 件 。
接 著 設 定 AdapterFieldGroup 的 Adapter 特 性 值 為 Adapter1 。
由 於 我 們 並 不 想 讓 使 用 者 修 改 Result 的 值 , 因 為 她 是 由 我 們 所 計 算 出 來 的 , 因 此 我 們 要 將 Result 的 控 制 項 改 為 純 文 字 顯 示 。 請 在 AdapterFieldGroup1 上 按 右 鍵 , 選 擇 Add All Fields 選 項 :
接 著 點 選 fldResult Item , 並 設 定 她 的 View Module 為 vmDisplay 。
成 功 的 話 你 會 看 到 Result 的 顯 示 方 式 已 經 變 成 純 文 字 了 。
接 下 來 我 們 還 要 提 供 一 個 確 認 的 按 紐 , 讓 使 用 者 點 選 後 執 行 相 加 的 動 作 。 請 在 AdapterForm 上 按 右 鍵 新 增 一 個 Component , 並 選 擇 AdapterCommandGroup 為 新 增 的 元 件 。
然 後 設 定 她 的 DisplayComponent 特 性 為 AdapterFieldGruop1 。
接 著 在 AdapterCommandGroup1 上 按 右 鍵 新 增 一 個 AdapterActionButton 。
再 設 定 她 的 PageName 及 ActionName 特 性 值 。
完 成 之 後 你 就 可 以 看 到 以 下 的 畫 面 :
到 這 裡 為 止 , 我 們 已 經 完 成 了 這 個 計 算 機 的 網 頁 了 , 接 著 請 編 譯 後 執 行 她 並 開 啟 IE 來 瀏 覽 我 們 的 網 頁 :
本 章 後 記
在 這 一 章 中 我 們 討 論 了 WebSnap 的 基 本 設 計 概 念 以 及 AdapterField 與 AdapterAction 元 件 在 WebSnap 程 式 中 所 扮 演 的 角 色 與 應 用 方 式 , 同 時 也 學 會 了 TPageProducer 及 TAdapterPageProducer 元 件 的 基 本 應 用 。