[PR]テレビ番組表
今夜の番組チェック

#4 CGIで"Hello!!"

update 99.12.13

実際のCGIプログラミングを行なってみる。
CGIとして対象にする言語は以下の3つ。
1.C言語
2.ASP
3.Perl
4.Servlet

で、実際の動きだが、例えば、以下のようなフォームを作成し、[OK]ボタンクリック時、サーバーが"HELLO,xxx!!"といったデータを返すものを作成してみる。
(xxxの部分にはテキストボックスへの入力文字が当てはまる)

(現在は実際には動きません)。

まずC言語におけるCGIの開発である。
C言語においては、環境変数はgetenv()を使用して取得する。
すると、以下のようなソースになるはずだ。

main()
{
int i;
char buf[0xff];
char query_string[0xff];

strcpy( querystring, getenv("QUERY_STRING"));
for(i=0;querystring[i]!='\0';i++) {
if(query_string[i]=='=') break;
buf[i] = query_string[i] ;
}
buf[i]='\0';

printf("Content-type: text/html\n\n");
printf("<HTML>\n");
printf("HELLO,%s!!<br>\n",buf);
printf("</HTML>\n");
}

うわっ、すごいはしょったプログラムだ。文字列の抽出ロジックが場当たり的だ。
・・・・・・まぁ、きっとこれでHTMLは出力されるはずだ。
・POSTされた場合、getenv("QUERY_STRING")で入力文字列を取得。
・printfで吐き出す。
ぐらい覚えておけばいいだろう。

で、ASPの説明である。
ASPはMicorosoftのIISをインストールすることにより使用が可能になる。
実はその際特別な設定は特にいらない。デフォルトの状況でASPが既に使用できるのだ。
ソースは以下のようになる。

<%@ LANGUAGE = VBScript %>

<%
// POSTされた文字列の取得
text2 = Request.QueryString("text1")
%>

<HTML>

HELLO, <%= text2 %> !! <BR>

</HTML>

見てもらえれば分かる通り、非常にHTML構文に似ている。・・・というより、HTML構文そのままである。
実際のASPのコードは<% ・・・ %>に記述される。
ASPはタグ記述形式の言語であり、それ故にHTML構文を取得したものがこれを覚えることはかなり容易である。

次はPerlについてである。
Perlは元来Webサーバー専用のスクリプトとして開発された訳ではないので、それが使用できるかどうかはかなりまちまちである。
もし、使用できないのなら、Perl自体のインストールが必要になるはずだが、それが結構めんどうだ。日本語を使用するとなると、追加モジュールが必要となるので、更にめんどうだ。
Perlのインストール方法はあなた自身の努力に任せるとして(Perl初心者の部屋)、先ほどのASPと同等の処理をPerlで実行しようとするとどうなるか?

# POSTの場合か否か
if ($ENV{'REQUEST_METHOD'} eq "POST")
{

# 文字列の読み込み
# 変数$str に POSTされた文字列を確保
read(STDIN, $query_string, $ENV{'CONTENT_LENGTH'});
# 解析する
# 文字列の分離
($name, $value) = split(/=/, $query_string);
$value =~ tr/+/ /;
$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg;

# 表示
print "Content-type: text/html\n\n";
print "<HTML>\n";
print "HELLO, $value !!"
print "</HTML>\n";

}

exit(0);

で、多分いいと思う。
(普段から全く使用してないので、自信はないが・・・)
とりあえず知らない人には全く分からない言語だと思う。主にUNIXで使用されていた言語であるので、Windowsしか触ったことのない僕にはちんぷんかんぷんだ。
またPerlを知っている人には突っ込まれると思うので書いておくが、上のコードは日本語変換の処理を行なっていない。日本語パッチを当てるとか、jcode.plというツールを使えばいいらしい。ふーん。

Perlの優れているところは、文字列の操作が簡単なことだ。
上の例では、

$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg;

という一文が出てくるが、これはPOSTされた文字列が"%3A%4B..."となっているのをデコード(復元)してくれる。Perlの持つ文字列操作に対する強さの現われである。・・・が、実のことを言えば、それはあくまでもC言語と比較した場合の優位性であり、ASPとかServeltと比較したときはどうかな、と思ってしまう。(二つともデコード用の関数を持つ)

で、最後にServletである。
Servletに関して言うと、多くのソフトハウスがエンジンの開発(ランタイムライブラリ?)を行なっている。
僕の中でのお勧めはJRunだろう。IISとApacheに対応しているし。

先ほどのコードをServletで書くと以下のようになる。


class SampleServlet extends HttpServlet
{
public void doPost(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException
{

// 文字列を取得
String str = req.getParameter("text1");
// 書き込む
res.setContentType("text/html");
PrintWriter pr = res.getWriter();
pr.println("<HTML>");
pr.println("HELLO," + str + "!!");
pr.println("</HTML>");

}
}


Servletの場合はスクリプトではない為、上のソースをコンパイルし、.classファイルを作成する必要がある。
Servletの場合はJava言語をベースにしているということもあって、徹底的なオブジェクト言語であるので、好きな人は好きだろう。
(ASPはそれと比較するならば、オブジェクト言語 + タグ記述形式)

以上、非常に簡単に説明してきた。細かなところは個人に任せたいと思う。

・・・ただ、やっぱりASPって使いやすいなぁ、と思う。
Micorosoftは大したもんだ。


HOME

RETURN