前回は、SSIを使ったアクセスカウンタの仕組みを紹介しました。今回は、クライアントから入力を受け取って処理するCGIを紹介します。
- SSIとCGIの違い -
前回紹介したアクセスカウンタは、Webページに対するユーザーのアクセス――Webサーバーへの読み出し要求――という行為をきっかけに起動され、Webサーバー側に保存していたアクセス数を記録したファイルをオープンして、そのファイルに対する読み出しと書き込みを行います。
アクセスカウンタでは、ユーザーの明示的な入力を受け取る必要がありません。そのためSSIを使い、比較的簡単な仕組みで実現できます。ユーザーの入力を受け取って処理をするCGIでは、アクセスカウンタのように簡単な処理とはなりません。
まず、単純な例で、ユーザーの入力を受け取ってそれを処理するCGIの仕組みを理解しておきましょう。
- データを受け取るWebアプリケーション -
以下のような仕様のWebアプリケーションを想定します。
(1) |
ブラウザにテキストボックスを2つとコマンドボタンを表示する
1つにユーザーの名前、もう1つに生年(生まれた年)を西暦で入力することとします。名前を入力する方をtxtName、生年を入力する方をtxtBornYとしておきましょう。 |
(2) |
ユーザーが、それぞれのテキストボックスに値を入力
txtNameにユーザーの名前、txtBornYに生年が入力されます。入力された値(文字列)はブラウザに表示されますが、まだWebサーバーには届いていません。 |
(3) |
ユーザーがコマンドボタンをクリック
コマンドボタンのクリックにより、Webサーバーに対してCGIプログラムを起動する要求が送られます。同時に、テキストボックスに入力された値がCGIプログラムに渡されます。
――ここでCGIプログラムが起動し、処理を実行します―― |
(4) |
クライアントのブラウザに、以下のような内容を表示
xxxx さん(入力されたユーザーの名前)は xx 歳(ユーザーの年齢)です。 |
- CGIプログラムの処理 -
上記(3)の段階でCGIが起動し、処理が行われます。この部分を、もう少し詳しく見ていきましょう。ここからは、CGIプログラムの動作手順となります。
以下の説明に登場する変数などの識別名や処理手順は、実際にはプログラミング言語に依存します。ここでは特定の言語に依存する説明は避け、あくまで一般的な考え方だけを説明します。
(1) |
クライアントのブラウザに入力されたデータを受け取る |
(2) |
受け取ったデータを変数に格納する
txtNameに入力された「氏名」を文字列型のstrName、txtBornYに入力された「生年」は、整数型のintBornYに格納するとします。 |
(3) |
「生年」と「現在の西暦年」から「年齢」を計算
仮に現在の西暦年がGetYearという関数から得られるとしたら、年齢は以下のような式で求められます。
GetYear - intBornY
この値を、整数型のintYearsOldに保存するとしましょう。
正確を期すためには生年月日を取得し、現在の年月日から年齢を求めるべきでしょう。ここでは説明のために、処理を簡略化しています。 |
(4) |
上の式で求められた年齢と氏名から、表示用の文字列を生成
氏名をstrName、年齢をintYearsOldという変数に格納しているとしたら、最終的に以下のような形の文字列を生成します。
<B> -- strName -- </B> " さんは " <B> -- intYearsOld -- </B> "歳です。"<BR>
例えば、今が2002年で、ユーザーがブラウザの画面から
氏名:山村 均
生年:1980
と入力したとします。すると上記の処理によって、最終的に
<B>山村 均</B> " さんは " <B>22</B> "歳です。"<BR>
というHTML形式の文字列が生成されます。
この文字列をWebサーバーからクライアントへ送信すると、ブラウザには
山村均 さんは 22 歳です。 |
- 処理結果をHTML形式で出力する -
ここで例に取り上げたCGIプログラムの処理自体は、整数値の減算と文字列の連結という、非常に単純な機能だけを使っています。もちろん、もっと複雑な処理を記述することも可能です。重要なことは、個々のCGIプログラムの処理内容ではなく、ユーザーが入力した値を元に処理をし、最終的にHTML形式のデータを生成して標準出力に送る――ということです。
プログラム内部の処理は、当然言語に依存するため、具体的なソースコードを紹介することはできません。単純な数値の四則計算を行ったり、関数を使って複雑な計算を行ったりすることになるでしょう。ただ、どのような言語を使ってどのような処理を行っても、最終的には文字列変換や文字列連結などの処理を行い、HTML形式のデータを生成して、それを標準出力へ送ることになります。
|
|
|