v8cgiはWWW SQL Designerを作ったondrej.zara氏が作ったサーバサイドJavaScript実行環境&ライブラリ。
CGI感覚で手軽にJavaScriptでWebプログラムが書ける。(さらに、テンプレート機能を使えばPHP感覚で書ける。)
ソースとWindows用のバイナリが配布されている。
メールライブラリや画像ライブラリ(GD)、テンプレートライブラリなどが付属している。
Windowsへのインストール
(参考:Installation - v8cgi - How to install v8cgi - Google Code)
- v8cgi - Google CodeからZIPをダウンロード。展開して適当なフォルダに置く。(例:C:\test\v8cgi)
- v8cgi.confをCドライブの直下(コンパイル時に指定された場所)に移動する。
- v8cgi.confの中身を編集。(パスを環境に合わせる。)
(例)// put default .js and .dll files here
Config["libraryPath"] = "c:/test/v8cgi/lib"; - コマンドプロンプトからv8cgi.exeを実行してみる。エラーが無ければOK。
C:\test\v8cgi>v8cgi.exe
Nothing to do. - Apacheの設定ファイルhttpd.confにCGI実行の設定を追加。
(例)<Location /v8cgi>
※mod_cgiが有効になっていなかったら有効にしておく。
Options +ExecCGI
AddHandler cgi-script .ssjs
</Location>LoadModule cgi_module modules/mod_cgi.so
- Apacheを再起動。
- Webのディレクトリにテスト用のScriptを作る。(例:htdosc\v8cgi\exaple.ssjs)
(例 1)#!/test/v8cgi/v8cgi.exe
※responseオブジェクトはデフォルトでインスタンスが生成されている。(参考:API_HTTP - v8cgi - Library "http.js" - Google Code)
response.write("Hello v8cgi!");
(例 2)#!/test/v8cgi/v8cgi.exe
※response.writeを使わない場合、Content-typeを出力しないと500 Internal Server Error(Premature end of script headers: example.ssjs)になる。
System.stdout("Content-type: text/plain\n\n");
System.stdout("Hello v8cgi!"); - 上記のファイルにアクセスしてみる。エラーが無ければ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 件のコメント:
コメントを投稿