CGI 的功能, 為什麼要 CGI?
|
CGI 是 一 種 介 面
|
當 您 想 要 使 W3 與 程 式 結 合, 就 需 要 用 CGI
|
一 般 來 說 , HTML 檔 案 是 屬 於 靜 態 的 資 料 . 雖 然 可 以 呈 現 文
字 、 聲 音 、 影 像 乃 至 於 動 畫 等 多 媒 體 資 料 , 但 終 究 只 是
展 示 固 定 資 料 的 一 種 方 式 . 如 果 想 要 列 出 像 是 在 資 料 庫
中 隨 時 會 變 動 的 資 料 , 立 刻 捉 襟 見 肘 |
CGI 是什麼
|
W3 的 主 從 架 構
|
使用者端要有瀏覽器(Browser),如:Netscape、Mosaic..;
|
伺服器則必須存在一個伺服程式(Daemon),通常被統稱為HTTPD
|
另外,還要有一些事先寫好的HTML檔、圖形檔...等.
|
使 用 者 就 透 過 HTTPD 取 得 想 要 看 的 HTML 檔 、 圖 形 檔 , 但 這 些
檔 都 是 固 定 內 容 . 除 了 以 編 輯 器 (Editor) 來 編 輯 更 動 , 否 則 使
用 者 看 到 東 西 都 會 是 一 樣 的 |
今 天 絕 大 部 分 的 HTTPD 都 支 援 CGI , 讓 HTTPD 與 一 般 程 式 溝 通 ,
達 到 顯 示 動 態 資 料 的 效 果 (可 用 程 式 控 制 W3 的 顯 示) . 這 並 沒
有 限 定 使 用 那 種 程 式 , 只 要 符 合 CGI 規 格 的 程 式 就 被 稱 為
CGI 程 式
|
實作的準備
|
以 perl 為 例 , 引 導 讀 者 撰 寫 CGI 程 式
|
(可 用 自 己 熟 悉 的 程 式 語 言 )
|
HTTPD 執 行 CGI 程 式 的 方 式
|
大 部 分 的 HTTPD 都 是 把 CGI 程 式 集 中 放 在 一 個 目 錄 裡 , 因 此 只 有
|
有 些 HTTPD 會 依 MIME 型 態 定 義 或 輸 出 檔 案 形 式 來 決 定 是
否 為 CGI 程 式 , 這 時 使 用 者 可 在 自 己 的 目 錄 下 撰 寫 CGI 程 式 |
若 不 確 定 自 己 的 HTTPD 是 否 有 這 種 功 能 , 可 查 閱 Paul E. Hoffman 先 生
整 理 的 W3 伺 服 器 比 較, 看 看 在 各 項 資 料 的
Script or action based on output file type
及 Script or action based on MIME content-type 是 Yes 還 是 No |
接 下 來 的 例 子 , 是 在 下 面 的 條 件 成 立 :
|
|
|
第一個 CGI 程式
|
檔名 : echoecho.cgi |
#!/bin/sh echo "Content-type: text/html <html> <h1> This is a test of CGI ! </html> " |
---|
檔名 : t-cgi1.cgi |
#!/usr/local/bin/perl srand; print "Content-type: text/html\n\n"; print "<title>t-cgi1.cgi</title>\n"; print "<h1>魔 術 數 字 : ", int(rand(100000)), "</h1>\n"; |
---|
說 明 (以 下 各 點 代 表 列 號) :
|
|
HTTPD 送 出 資 料 不 再 是 取 用 存 在 的 HTML 檔 、 圖 形 檔 ...
|
而 是 執 行 CGI 程 式 , 動 態 產 生 資 料
|
HTML 檔 到 HTTPD 的 資 料 是 HTML 檔 案 的 內 容 , 那 CGI 程 式 到 HTTPD 的 資 料 呢 ? 以 t-cgi1.cgi 來 說 , 其 資 料 內 容 透 過 標 準 輸 出 (Stdout) 至 HTTPD , 輸 出 的 資 料 就 是 底 下 框 框 裡 所 列 : |
Content-type: text/html |
---|
要 注 意 的 , 以 Content-type: text/html 指 定 資 料 MIME 型 態 之 後
必 須 有 兩 個 換 列 字 元 才 能 接 續 其 它 資 料 |
現 在 應 該 有 能 力 擴 增 上 述 程 式 , 使 它 讀 取 資 料 庫 中 的 紀 錄 ,
然 後 透 過 W3 顯 示 . 這 些 都 屬 於 單 向 , 亦 即 僅 讓 W3 動 態 顯 示 . 想
要 使 W3 接 受 使 用 者 輸 入 的 資 料 , 需 要 多 一 點 技 術 |
接受使用者輸入的 HTML 標籤 (tag)
|
以 下 各 個 說 明 , 會 有 <form></form> 標 籤 , 我 們
安 排 在 執 行 CGI 程 式 這 部 分 做 說 明
|
把 表 格 想 像 成 製 作 問 卷 調 查 所 需 要 的 項 目 |
簡 單 的 問 卷 會 有 單 選 、 複 選
|
有 時 候 選 擇 項 目 太 多 ,
恐 怕 版 面 變 得 零 亂 , 我 們 可 利 用 視 窗 環 境 的 特 點 :
捲 動 軸 選 擇 來 做 |
還 有 些 會 要 填 學 校 / 工 作 單 位 或 身 份 證 字 號 ... 等 屬 於
單 列 文 字 資 料 ,
|
也 有 要 寫 寫 建 議
之 類 的 多 列 文 字 |
當 使 用 者 輸
入 的 資 料 有 保 密 的 必 要 , 不 希 望 輸 入 資 料 時 , 過 往 的 人 群 都 看
得 到 (例 如 某 些 情 況 下 , 會 對 出 生 年 、 月 、 日 敏 感) , 可 以 使 用
密 碼 式 單 列 文 字 輸 入 |
如 果 同 一
份 問 卷 , 可 能 因 為 填 寫 的 族 群 不 同 會 要 分 A 、 B 卷 , 這 時
隱 藏 式 資 料 就 派 上 用 場 |
另 外 , W3 的 表 格 有 可 點 取 圖 形
的 能 力 . 和 <img> 的 ismap 能 力 相 彷 |
最 後 , 和 一 般 問 卷 較 大 的 不 同 在 於 如 何 使 W3 伺 服 器 去
執 行 CGI 程 式 . 是 我 們 在 此 需 要 瞭 解 的 重 點 |
CGI 程式如何接收使用者的輸入資料?
|
CGI 程 式 是 利 用 標 準 輸 出 (Stdout) 將 資 料 送 至 HTTPD
|
HTTPD 則 是 透 過 標 準 輸 入 (Stdin) 或 環 境 變 數 (Environ.
Variable) 把 接 收 到 的 使 用 者 輸 入 , 傳 給 CGI 程 式 |
|
---|
HTTPD 傳 給 CGI 程 式 資 料 的 模 樣
|
job=%BA%DE%B2z%A4H%AD%FB&age=24&sex=%A4k&email=cynthia@www.fido.net.tw&comments=N%2FA |
---|
職業 管理人員 年齡 24 性別 女 電子郵件地址 cynthia@www.fido.net.tw 建議 N/A |
---|
所 得 到 的 結 果
|
在 處 理 上 , 一 般 遵 循 下 面 步 驟
|
判 斷 是 用 GET 或 POST 傳 遞 資 料
|
URL 編 碼 字 串 切 割 (以 & 分 段) , 取 得 參 數 對 (NAME=VALUE pairs)
|
將 編 碼 部 分 還 原 --- 先 將 + 轉 為 空 白 (space) , 再 把 %xx (xx 為 16 進 位) 轉 為 單 一 字 元
|
在 WebSite 執行的 CGI 程式範例:
|
資料庫的使用範例:
|
在 伺 服 器 動 態 改 變 資 料 Server Push 範 例
|
在 使 用 者 端 要 求 改 變 資 料 Client Pull 範 例
|