D: Mango で Servlet

Mango は、D 言語でサーバサイドプログラミングをやるためのフレームワークだ。JavaServlet 仕様をもとにしているので、Java でサーバサイドをやったことがあれば、簡単にいじれそう。
とりあえず、Hello World までやってみた。

必要なもの

DMD
D 言語コンパイラDMC も忘れずに。
Build
D 言語用のビルドツール。公式サイト (http://www.dsource.org/projects/build/) の "Windows Executable" というリンクをクリックすると exe が落ちてくる。名前を build.exe にして PATH を通す (または、dmd\bin に入れちゃってもいい)。
Mango 本体
公式サイトのダウンロードページ (http://www.dsource.org/projects/mango/wiki/Downloads) から mango_release_2-0.zip を持ってきて、適当な場所に展開する。

Mango のサイトには他にも 4 つほど zip ファイルがあるけど、後回しでいい。

ソースを書く

テキストファイルに以下の内容を書き、UTF-8 で保存する。UTF-8 に対応したエディタがない場合は、中の日本語を半角英数字にしておけばいい。
ファイル名は、仮に hello.d としましょう。

import mango.http.server.HttpServer;
import mango.servlet.Servlet, mango.servlet.ServletContext, mango.servlet.ServletProvider;
import mango.io.Writer, mango.io.Socket;
import mango.sys.System;

version (Win32)
         pragma (lib, "wsock32");

class Hello : Servlet {
	void service (IServletRequest request, IServletResponse response) {
		response.setContentType ("text/html");
		
		IWriter output = response.getWriter;
		
		output("<title>許せないぜ!</title>"c);
		output("くっ Mango で Servlet という算段か!"c);
	}
}

int main () {
	ServletProvider sp = new ServletProvider();
	ServletContext example = sp.addContext (new ServletContext ("/example"));
	sp.addMapping("/hello", sp.addServlet (new Hello, "hello", example));
	
	InternetAddress addr = new InternetAddress(80);
	HttpServer server = new HttpServer (sp, addr, 1);
	server.start();
	System.sleep();
	
        return 0;
}

ビルド用の設定ファイルを書く

急がば回れ。build.exe に食わせるための設定ファイルを書く。ファイル名は、hello.brf とでもしましょうか。上で書いたソースと同じディレクトリに置く。

-ID:\mango_release_2-0
-O 
-release 
-cleanup 
hello.d

1 行目は、Mango を展開したディレクトリ。最後の行は、上で書いた D 言語ソースのファイル名。

ビルドと実行

後は、コマンドライン

build @hello

とするだけ。'@' を忘れずに。うまくいけば、これで hello.exe ができる。
実行したら、ブラウザで http://localhost/example/hello を開けば、動作を確認できる。

仕組み

Java ではサーブレットコンテナが単体の製品になっていることが多い。Tomcat とか。一方、Mango はフレームワークなので、その機能を使って自分でサーバを書くというスタイルになる。OOWeb とかみたいな感じ。
ただし、Servlet 周りの仕様については、Java とほぼ同じ。上記のソースで ServletContext とか addServlet() とか addMapping() とか見えているが、これはつまり web.xml での Servlet 設定と同じことをしているわけだ。
あと、Mango には I/O ライブラリとしての側面もある。D 言語の標準ライブラリである Phobos は、十分整備されているとは言いがたい。その分、Mango に java.io や java.net などに相当する機能が用意されている。

もっと知るには

Hello World 以降をやるには、Mango のダウンロードページに行き、残りの zip をダウンロードしてくる必要がある。
example パッケージの servlets.d というソースが、より充実したサンプルだ。これを見れば、上記のソースで省略した部分を理解することができる。
doc パッケージは、リファレンスなどの文書類。Mango の機能は多岐に渡っているので、全体像をつかんでおくとよさそう。