2009年1月26日月曜日

v8cgiのインストールと簡単なサンプル

v8cgiWWW SQL Designerを作ったondrej.zara氏が作ったサーバサイドJavaScript実行環境&ライブラリ。
CGI感覚で手軽にJavaScriptでWebプログラムが書ける。(さらに、テンプレート機能を使えばPHP感覚で書ける。)

ソースとWindows用のバイナリが配布されている。
メールライブラリや画像ライブラリ(GD)、テンプレートライブラリなどが付属している。


Windowsへのインストール
(参考:Installation - v8cgi - How to install v8cgi - Google Code

  1. v8cgi - Google CodeからZIPをダウンロード。展開して適当なフォルダに置く。(例:C:\test\v8cgi)
  2. v8cgi.confをCドライブの直下(コンパイル時に指定された場所)に移動する。
  3. v8cgi.confの中身を編集。(パスを環境に合わせる。)
    (例)
    // put default .js and .dll files here
    Config["libraryPath"] = "c:/test/v8cgi/lib";
  4. コマンドプロンプトからv8cgi.exeを実行してみる。エラーが無ければOK。
    C:\test\v8cgi>v8cgi.exe
    Nothing to do.
  5. Apacheの設定ファイルhttpd.confにCGI実行の設定を追加。
    (例)
    <Location /v8cgi>
     Options +ExecCGI
     AddHandler cgi-script .ssjs
    </Location>
    ※mod_cgiが有効になっていなかったら有効にしておく。
    LoadModule cgi_module modules/mod_cgi.so
  6. Apacheを再起動。
  7. Webのディレクトリにテスト用のScriptを作る。(例:htdosc\v8cgi\exaple.ssjs)
    (例 1)
    #!/test/v8cgi/v8cgi.exe
    response.write("Hello v8cgi!");
     ※responseオブジェクトはデフォルトでインスタンスが生成されている。(参考:API_HTTP - v8cgi - Library "http.js" - Google Code
    (例 2)
    #!/test/v8cgi/v8cgi.exe
    System.stdout("Content-type: text/plain\n\n");
    System.stdout("Hello v8cgi!");
     ※response.writeを使わない場合、Content-typeを出力しないと500 Internal Server Error(Premature end of script headers: example.ssjs)になる。
  8. 上記のファイルにアクセスしてみる。エラーが無ければOK。



DBを使う例
#!/test/v8cgi/v8cgi
library("mysql.dll");
library("query.js");

Query.setDB(new MySQL().connect("localhost", "db_user", "db_password", "schema"));

var result = new Query(Query.SELECT)
 .field("id").field("name") //SELECT
 .table("members") //FROM
 .where("%f = %s", "name", "TARO") //WHERE
 .execute();

response.write(result.numRows() + "<br>");

var rows = result.fetchObjects();
for (var i = 0; i < rows.length; i++) {
 response.write(rows[i]["id"] + ":" + rows[i]["name"] + "<br>");
}


テンプレートを使う例
テンプレートを呼び出すファイルの記述
#!/test/v8cgi/v8cgi
library("template.js");

var t = new Template({suffix: "tpl.html"}); //現行バージョン(0.2.0)にはバグがあるのでsuffixを指定しないとエラーになる
var var1 = "abc"; //動的なデータは変数に入れておけばテンプレート内から参照できる
var var2 = 123;
response.write(t.process("example")); //現行バージョン(0.2.0)ではdataを渡しても無視される

テンプレートの記述(example.tpl.html)
<html>
<head><title>TEST</title></head>
<body>
This is a random number: $(Math.random())

$code( for(var i = 0; i < 10; i++) { )
<li>$(i)</li>
$code( } )

$(var1) $(var2)
</body>
</html>


REQUEST情報を取り出す方法
"HTTP_"で始まる情報はrequest.header()で取り出せるが、それ以外は直接_headersの中から取り出すしか無さそう。
#!/test/v8cgi/v8cgi
response.write(request._headers["SCRIPT_URL"]);


感想
  • シンプルでよい。ソース追って理解できる。
  • DBアクセス、テンプレートエンジン、メール送信と揃っていて、即戦力っぽい。
  • DAOがORマッパーでなくSQLヘルパーなのが好き。さすがERDを描くためにツールを作ってしまった人だけある。
  • DBアクセスがプレースホルダーでないのが残念。escapeはしているようだがPreparedでないと何かと嫌。

  • response.writeってのがASPみたいでちょっと嫌。echo()とかでラップすればよいが。
  • 実際に使うとしたらmod_rewriteを絡めたオレームワーク(オレオレ・フレームワーク)を被せることになりそう。



参考:Apache Tutorial: CGI による動的コンテンツ - Apache HTTP サーバ

0 件のコメント:

ブログ アーカイブ

tags