|
実際の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は大したもんだ。
|