增加 WWW 文件的互動性─ 資料庫系統與共同通道介面的運用

June 4, 1996 曾元顯
Accessed times
前言 | 如何傳資料給伺服器 | 共同通道介面 | 資料庫管理系統 | 結語

前言

上一期我們介紹全球資訊網路(簡稱WWW)伺服器的安裝,其中重要的 觀念之一就是說明磁碟機中某個路徑的檔案如何對應到一個 URL (Uniform Resource Locator,一致性的資源定位器),而成為全球資訊網路上的一份文件。 瞭解這種對應後,資訊的提供者只要將檔案的 URL 告訴別人即可,而資訊的消 費者則只要知道某個檔案的 URL,透過瀏覽器即可取得這份文件。這種模式大 幅降低資訊傳播的困難。不過到目前為止,這裡所描述的文件均屬於靜態文件(單 純的磁碟檔案)。事實上,透過 URL 我們還能取用到動態的文件,亦即根據使 用者給定的條件由程式臨時產生的文件。

動態文件有什麼好處?它可以讓你玩一些把戲,增加使用者瀏覽時的趣味。 例如,顯示某份文件被取用的次數,或者顯示一幅特殊的圖,隨使用者點選位置 的不同而顯現不同的畫面。不過最重要的是它能提供伺服器端與使用者端雙向的 互動,完成令人訝異的各種應用,包括書目資料查詢、全文檢索、網路選課、線 上購物等。

在 WWW 上製作動態文件有數種方式。一是用 Sun 公司推出的 Java 語 言或是用 Netscape 推出的 Javascript 語言來撰寫程式。這些語言還未被各種 軟、硬體平台支援,但已成為一種潮流,學習的人非常多。另一種較為傳統並且 幾乎每一種 WWW 伺服器都有支援的方式則是透過「共同通道介面」(Common Gateway Interface,簡稱 CGI)來達成 [1, 2]

             HTTP           CGI
     使用者 <-------> 伺服器 <---> 通道程式

「共同通道介面」是一種定義 WWW 伺服器與「通道程式」(Gateway Program)溝通方式的標準。上圖顯示使用者、伺服器、與通道程式之間互動的 關係。當伺服器收到使用者以 HTTP 通訊協定傳來的需求時,如果此項需求是單 純傳回一個檔案,伺服器就找出該檔案傳回,然後結束與使用者的連線。如果此 項要求需要額外的處理,例如查詢資料庫內容,伺服器本身不會去執行這項處 理,而是依據 CGI 規定的方式傳資料給「通道程式」執行,「通道程式」執行 完後,再依據 CGI 規定的方式將處理結果傳給伺服器,伺服器再回傳給使用者。 這種運作模式下,伺服器本身是小小的一支程式,它的其餘功能,就由通道程式 來擴充。通道程式可以用伺服器主機能夠執行的任何程式語言來撰寫,並且通常 與資料庫或其他系統結合。此種結合,使 WWW 伺服器演變成為各種應用系統與 使用者之間溝通的橋樑。由於 CGI 介面簡單明瞭(對 C 語言程式設計師與 Unix 系統的使用者而言更是如此),使得過去以單機或區域網路為環境的各種應用系 統,都能透過 WWW 以一致性的操作介面,被全世界所取用(world-wide availabe)。


如何傳資料給伺服器

在瞭解共同通道介面之前,首先簡介使用者如何傳送資料給伺服器。使用者 可以在具有 「ISINDEX」 標示的 HTML 文件中輸入資料傳給伺服器。瀏覽這類 文件時,可以看到一個輸入框, (「ISINDEX」 標示必須要瀏覽原始文字檔案才 看得到,例如利用 Netscape 命令列上 VIEW 選項下的Document Source 觀 看)。使用者輸入資料後按 「Enter」鍵即可。另一種方式是將資料直接附加 在此文件的 URL 上。舉個例子,台大圖書館系的「圖書館學刊」可以在網路上 看到,連到  http://140.112.3.188/cgi-bin/keysrch.cgi/search/author 可以輸入作者名查詢某個作者寫了哪篇文章。或者直接以下面的 URL http://140.112.3.188/cgi-bin/keysrch.cgi/search/author?張三 查詢是否有「張三」寫的文章,其中的「?」號,是分隔 URL 與參數的符號。

另外一種傳資料給伺服器的方式是透過表格(FORM)的填寫。瀏覽器將 表格內的資料傳給伺服器時又分為兩種:「GET」與「POST」(同樣利用 Netscape 命令列上 VIEW 選項下的Document Source 指令觀看原始文字檔,可 查出是哪一種)。如果傳送的方法為「GET」,瀏覽器會將表格內的資料經過 「編碼」後附加在 URL 後面。此種「編碼」只是轉換空白與某些特殊字元的表 示方式使其不會造成剖析 URL 時的錯誤。請連到輔大圖資系課程預選文件: http://www.lins.fju.edu.tw/cgi-bin/w3-msql/lins/insert.htm 選擇其中「課程大綱」的連結(如果您不能順利連上,請以140.136.85.1 代替 www.lins.fju.edu.tw)。瞭解瀏覽器對「GET」方式的處理程序後,我們也可以 直接以 URL 附加資料的方式傳資料給伺服器。例如,下面的 URL http://www.lins.fju.edu.tw/cgi-bin/w3-msql/lins/outline.htm?f_NO=7 可以傳回「數位化圖書館」的課程大綱。其中「f_NO」是變數名稱,「7」是 此變數的參數。您也可以將上面的「7」改成「1」到「20」之間的數,看看 會傳回什麼資料。注意,此「GET」的方式與 「ISINDEX 」 不同,您必須知道 有哪些變數以及這些變數的名稱,並且知道上述的編碼方式,才能正確的利用 URL 傳送資料給伺服器。這就是為什麼必須用表格(FORM)的原因(透過表 格,只要填入資料,按「確定」鈕即可)。

若瀏覽器以「POST」方式將表格內的資料傳給伺服器,(Netscape)瀏覽 器首先會顯示一個對話框,說明 WWW 上傳送資料不具保密性,請使用者確認 是否要傳送此份資料。如果使用者決定傳送,瀏覽器就將表格內的資料「編碼」 (與「GET」方法一樣),附加在傳送訊息的後面(不是 URL 後面),傳給 伺服器。 「POST」的方式有什麼好處?由於「GET」是將資料附在 URL 後 面,而 URL 長度有限,一般只能達到 128 位元,因此您不能利用「GET」傳 送很多資料。而「POST」則無此限制。

使用者還可以透過「額外路徑」(extra path)的方式傳資料給伺服器,此 時資料是附加在 URL 後面,但是看起來卻像是檔案的路徑。這種方法通常用在 傳遞檔案名稱,讓 CGI 程式處理這個檔案。後面介紹的範例就運用這種方式。


共同通道介面

伺服器收到使用者端傳來的資料後,依下列方式傳資料給通道程式:

通道程式接收資料後必須做解碼的動作才能正確解讀使用者的輸入。網路上 已有解碼程式可資利用,請參閱參考資料 [3 ]

至於通道程式的執行結果如何傳回給使用者呢?最普遍的方式是透過「標準 輸出」(又是源自 UNIX),通常第一、二行必須輸出如下: print "Content-type: text/html" print 第一行表示回覆的是一份 HTML 文件,第二行為一行空白,空白行以後,是 CGI 程式要讓瀏覽器顯示的結果。伺服器收到從「標準輸出」傳來的資料後, 回傳給使用者,完成使用者資料的處理。

這種模式下,HTML 文件透過表格的運用處理了通道程式的使用者介面。 因此從通道程式的角度看,它只要從適當的地方讀入資料、解碼、處理、將結果 寫到標準輸出,即可完成世界各地使用者的輸入處理,這使得程式設計(與設計 出來的程式)的價值到達了一種前所未有的境界。不僅如此,此種模式也大幅降 低開發網路應用程式的技術門檻。當網路上使用者付費制度建立後,未來不必安 裝大而無當的軟體在硬碟裡,使用量身剪裁、切合本身需求的網路程式的時代, 即將來臨。


資料庫管理系統

目前大部份的資料庫管理系統提供兩種模式讓使用者運用。一種是命令模 式:使用者透過資料庫管理系統提供的介面對資料庫下命令,完成資料庫的處理 動作。系統提供的資料庫命令都相當高階,如 SQL(Structured Query Language)、QUEL等,便利使用者處理資料。第二種為程式庫的模式:資料 庫系統以提供 C 語言或其他語言程式庫的方式,讓使用者自行開發相關的應用 系統。比起命令模式,此種方式運用上較具彈性。

有了資料庫系統提供的程式庫,只要利用 HTML 編寫瀏覽器端的使用者介 面,再撰寫符合 CGI 規格的資料庫程式與 WWW 伺服器交換資料,即可完成 全球資訊網路上的資料庫應用系統,例如,書目資料查尋、課程預選,讓學校或 圖書館的作業網路化。

為了因應全球資訊網路的使用者需求,有些資料庫管理系統廠商另外又提供 一種更便利的方式,就是將資料庫命令內嵌(embed)在 HTML 語法裡, 撰 寫 HTML 文件即可開發資料庫網路應用系統。

接下來筆者以 mSQL 資料庫系統為例,介紹此種方法。

mSQL 為澳洲龐德大學一位研究員發展出來在 UNIX 作業系統運作的資料 庫管理系統。原先為共享軟體,現在已商業化,不過費用比起大型資料庫軟體如 Oracle, DB2, informix, 少很多。最重要的是,非營利機構可以免費使用。它支援 非常有限但足夠運作的 SQL 查詢語言功能,這也是它為什麼叫做mini SQL 的 原因。

mSQL 與 WWW 的介面軟體是一支稱為 w3-msql 的通道程式。使用者以 「額外路徑」(extra path)的方式將內嵌 SQL 語言的 HTML檔案傳給 w3- msql,方法如下: http://IP_address/cgi-bin/w3-msql/Path/To/Your/Page.html 其中「IP_address」是 WWW 主機的位址,「cgi-bin」是一般放置通道程式的 目錄,「Path/To/Your/Page.html」是一份內嵌 mSQL 命令的 HTML 文件,檔 案「Page.html」放置在「文件路徑」下的「Path/To/Your」的子目錄。

所謂內嵌 SQL 語言在HTML 文件裡,是利用 HTML 的註解語法達成的:

   <! msql  command  arguments>

HTML 的註解以「<!」開始,以「>」結束,瀏覽器對註解內的內容都不 做解譯,亦即不顯示出來。「msql command arguments」是內嵌的資料庫命令 語法。內嵌文件會被伺服器端的 w3-msql 先處理,將內嵌命令展開成一般的 HTML 敘述,再傳到使用者端,因此瀏覽器顯示此份文件時,它已是一般的 HTML 文件,瀏覽器根本不知道它被誰處理過。

底下提供的範例,讀者可以連到下列位址觀看此份文件被 w3-msql 處理 後,再被瀏覽器顯示出來的結果: http://140.136.85.1/cgi-bin/w3-msql/lins/outline.htm?f_NO=7 範例中的內嵌命令,可參考 http://140.136.85.1/~tseng/msql/w3-msql.html http://bond.edu.au/People/bambi/mSQL/ 以獲得詳細的說明。

===============================================================
<! msql connect> <! 連上資料庫 >
<! msql database preselect><! 宣告使用資料庫「preselect」>
<! msql query "select name, name_e, teacher, option, credit_d, quota, allow, 
time, outline from courses where NO='$f_NO'" q><! 查詢「courses」的資料,
欄位資料name對應到@q.0, name_e對應到@q.1, teacher對應到@q.2依此類推>

<!-- 查詢老師 HOME PAGE 的 URL -->
<! msql query "select  URL  from teachers where name='@q.2'" q1>

<HTML>
<TITLE>Course Ouline:<!msql print " @q.1"></TITLE>
<body>
<CENTER>
<!msql print "<h1>@q.0</h1>"><! 印出中文課名 >
<!msql print "<h2>@q.1</h2>"><! 印出英文課名 >

<TABLE COLSPEC="L20 L20 L20 L20" border>
<CAPTION ALIGN=top></CAPTION>
<TR align=center><TH>老師<TH>學分<TH>限制人數<TH>選修年級<TH>上課
時間</TR>
<! msql if (@q1.0 == "") ><! 加入某個老師的 URL 連結,如果有的話 >
    <! msql print "<TR align=center><TD>@q.2
       <TD>@q.4<TD>@q.5<TD>@q.6<TD>@q.7</TR>">
<! msql else>
    <! msql print "<TR align=center><TD><a href='@q1.0'>@q.2</a>
       <TD>@q.4<TD>@q.5<TD>@q.6<TD>@q.7</TR>">
<! msql fi>
</TABLE><BR>

<TABLE COLSPEC="C20" border>
<CAPTION ALIGN=top></CAPTION>
<TR><TD><pre><! msql print "@q.8"></pre></TD></TR>
</TABLE>
</CENTER>
<! msql free q><! 釋放「q」所佔用的空間 >
<! msql free q1><! 釋放「q1」所佔用的空間 >
<! msql close><! 關閉與資料庫的連線 >
</body>
</HTML>
================================================================

結語

上面舉的「課程大綱」的例子,可以想像成在網路上查詢某本書的詳細書目 資料,兩者用到的技術是一樣的。因此讀者可以瞭解到,讓圖書館書目查詢的服 務上全球資訊網路,其技術門檻比以往降低很多,熟悉資料庫命令、 HTML 語法 以及上述的概念,幾乎就夠了。本文筆者以 mSQL 資料庫為例,並不表示它可以 用來完成較複雜的應用。由於 mSQL 是免費的,某些功能不足,例如對一部份中 文字無法處理、 w3-msql不支援「POST」方法等,使用起來有時候必須自行寫 程式做相當多的處理才能解決問題。當然這點不妨礙它作為簡介的範例,也不失 為學校教學最好的材料。相對的,商用的資料庫系統,一定會提供較完備的功能 與介面,使用者開發網路應用程式,就變得非常快速簡便了。

參考資料:

  1. Shishir Gundavaram, CGI Programming on the World Wide Web, O'Reilly & Associates, Inc., March 1996.
  2. Ian S. Graham, HTML Sourcebook, John Willey & Sons, Inc., 1995.
  3. Steven Grimm, "UN-CGI", http://www.hyperion.com/~koreth/uncgi.html.