spark frameworkはJava8のラムダ式を使用したシンプルなWebアプリケーションフレームワークです。
Spark Framework - A tiny Java web framework
基本的な機能については上記の公式サイトやこちらが参考になります。
今回はマニュアルには書いてないけど、こうするとよさそうと思ったことを書いていきます。
route
railsのroutes.rbやplayのrouteに相当するルーティングをmainメソッドに記載することがspark frameworkの特徴になっています。
import static spark.Spark.*;
public class HelloWorld {
public static void main(String[] args) {
get("/hello", (req, res) -> "Hello World");
}
}
ただ、このままダラダラと書いていくと
- ルーティングが1ファイルに固まっていてみにくい。
- チームで開発するときに編集が競合しやすい。
- 加えてフィルタに相当する機能や組み込みjettyの設定もここに書く。
といったことになり、よろしくありません。
じつは別クラスにできます。こんな感じで
public class Main {
public static void main(String[] args) {
// common configuration
CommonRoute.route();
// Filter configuration
FilterRoute.route();
// business configuration
BusinessRoute.route();
// default route
DefaultRoute.route();
// initialization
InitRoute.route();
}
}
初期化
組み込みjettyから起動する際はmainメソッドがエントリーポイントになります。
上にも記載していますが、route定義と関係ない処理でも実行されるため、初期化に利用できます。
シングルトンオブジェクトの作成なり、データベースマイグレーションなりお好きな通り。
ビューへの引き継ぎ
sparkでビュー(というかモデルからレスポンスへの変換)はいくつか方法があり、
-
(req, res) -> "Hello World"
という形のStringを返すラムダを書く。 - ResponseTransformerを実装する。
- テンプレートエンジンを呼び出すプラグインを利用する。(ResponseTransformerの特殊形)
といった方法があります。
ただマニュアルにも記載がある通り、ResponseTransformerは関数型インターフェースなので、
get("/api/hoge/:id", (req, res) -> {
return Hoge.get(req.params(":id"));
}, JsonUtil::dataToJson);
という感じでメソッド参照が使えます。
また、テンプレートエンジンも標準で提供されているものもありますが、あまり使い勝手がよくない場合もあるので、
get("hoge/:id", (req, res) -> {
Map<String, Object> variablesMap = new HashMap<String, Object>();
variablesMap.put("hoge", Hoge.get(req.params(":id")));
return ThymeleafTemplateEngine.render(variableMap, "hoge_show");
};
のような感じで必ずしもResponseTransformerを使わなくても大丈夫です。
最終的にはStringが返せればHttpServeletResponseのoutputstreamに流れていく(のかな?すいません、未確認です)
以上です。初投稿でした。