Gaucheプログラミング(立読み版)

www.cgiライブラリを利用する Slideshow

CGIスクリプトを書く場合、「SchemeスクリプトをCGIとして起動する」で見たようにprint手続きで本体部を書くこともできますが、「HTMLを手軽に生成する」で使ったtext.html-liteライブラリで生成したHTMLが使えると便利です。

Gaucheには、text.html-liteライブラリで生成したHTMLリストが簡単に使えるwww.cgiライブラリが用意されています。

www.cgiライブラリとtext.html-liteライブラリを使って、「SchemeスクリプトをCGIとして起動する」で書いたhello.cgiを書き直してみましょう。

#!/usr/local/bin/gosh

(use www.cgi)
(use text.html-lite)

(cgi-main
 (lambda (params)
   (list
    (cgi-header)
    (html-doctype)
    (html:html
     (html:body
      (html:p "Hello, Gauche!"))))))

まず、HTTPサーバーがgoshインタプリタを実行するために、最初の行に次の式を書きます。

#!/usr/local/bin/gosh

www.cgiライブラリとtext.html-liteライブラリが使用できるように次の式を書いておきます。

(use www.cgi)
(use text.html-lite)

cgi-main手続きでCGIを簡単にする

www.cgiライブラリのcgi-main手続きを利用すると、CGIに必要ないくつかの処理を簡単に書くことができます。

 (cgi-main
  (lambda (params)  ...) ;; HTTPヘッダを含むリストを返す手続き
 )

cgi-mainの最初の引数は「HTTPのヘッダ部を含むリストを返す手続き」です。ここではlambda式を書いて無名の手続きとして記述しています。

この手続きの最初の引数に渡されるのは「CGIに与えられたパラメータのリスト」です。ここでは最初の引数にparamという名前を付けています。このサンプルではparamは使われませんが、次節以降でCGIパラメータの取得方法を説明します。

cgi-header手続きでHTTPヘッダ部を出力する

HTTPのヘッダ部を含むリストを構築する上で便利な手続きがあります。www.cgiライブラリのhttp-header手続きです。

    (cgi-header)

引数なしで単独で記述すると次のHTTPのヘッダ部を出力します。

 Content-Type: text/html; charset=UTF-8

上記のUTF-8となっている箇所はGaucheの内部エンコーディングです。どの内部エンコーディングでビルドされたGaucheであるかによってかによってこの値は異なります。

html-doctype手続きでHTML Doctypeを出力する

HTTPの本体部ではまずtext.html-liteライブラリのhtml-doctype手続きを書いています。

    (html-doctype)

この手続きが引数なしで評価されると以下のHTML Doctypeを出力します。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
       "http://www.w3.org/TR/html4/strict.dtd">

text.html-liteライブラリでHTML要素のリストを構築する

HTTPの本体部では、HTML Doctypeに続いて、text.html-liteライブラリを使って構築されたHTML要素のツリーが出力されます。

    (html:html
     (html:body
      (html:p "Hello, Gauche!")))

cgi-main手続きによって、上記は以下のHTMLとして出力されます。

<html><body><p>Hello, Gauche!</p
></body
></html
>

www.cgiを使うとCGIが楽に書けることを見てきました。次節以降ではCGIパラメータの取得方法やHTMLエスケープの方法を説明します。

 by えんどうやすゆき

Comment Form:

コメント・トラックバック規約を必ずお読みください。

 

Comments:

2007/04/30 11:47:09 shiro
「「HTMLを手軽に生成する」で使ったtext.html-liteライブラリで生成したHTMLが
使えると便利です。」--- 参照関係が変 (節の順序を入れ替えた?)

「Gaucheには、text.html-liteライブラリで生成したHTMLリストが簡単に使える
www.cgiライブラリが用意されています。」---www.cgiとtext.html-liteは
直交しているのでこの記述は変。

「cgi-mainの最初の引数は「HTTPのヘッダ部を含むリストを返す手続き」です。」
---「HTTPのヘッダ部を含むリスト」だけでは不明瞭。何のリストだかわからない。
text.treeの説明を省きたいなら、「連結した時に
HTTPのヘッダ部を含むリプライになっているような文字列のリスト」かなあ。
でもほんとはリストじゃなくてtreeなんだよね。text.treeの説明をいれた方が
わかりやすくならないかなあ。

「引数なしで単独で記述すると次のHTTPのヘッダ部を出力します。」
あれ、引数なしで呼んだ場合、charset=の部分は出力しませんよ。

「text.html-liteライブラリを使って構築されたHTML要素のツリーが出力されます。」
これも、「HTML要素のツリー」と言うとSXMLみたいな論理構造を想像してしまうが
text.html-liteが出力するのはあくまでテキストの断片のツリーであって
論理構造は反映してない。やはりtext.treeの説明を抜きでやるのはきついのでは。


Trackback URL: http://karetta.jp/trackback/book/011473/011475

Trackbacks:


このサイトについて|ヘルプ|Q&A|個人情報保護|プライバシーポリシー|利用規約|コメント・トラックバック規約|削除規程|広告掲載
Copyright (c) 2005-2007 Time Intermedia Corporation