Gaucheプログラミング(立読み版) > 第2部: 実用 > CGIを書こう > www.cgiライブラリを利用する


[Prev] [Next] [Up] [Contents][フレーム表示] [フレーム解除

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

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エスケープの方法を説明します。


[Prev] [Next] [Up] [Contents][フレーム表示] [フレーム解除

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