24
24

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

フューチャーアーキテクトAdvent Calendar 2015

Day 4

spark frameworkのちょっとした応用

Last updated at Posted at 2015-12-03

spark frameworkはJava8のラムダ式を使用したシンプルなWebアプリケーションフレームワークです。
Spark Framework - A tiny Java web framework

基本的な機能については上記の公式サイトやこちらが参考になります。

今回はマニュアルには書いてないけど、こうするとよさそうと思ったことを書いていきます。

route

railsのroutes.rbやplayのrouteに相当するルーティングをmainメソッドに記載することがspark frameworkの特徴になっています。

HelloWorld.java
import static spark.Spark.*;

public class HelloWorld {
    public static void main(String[] args) {
        get("/hello", (req, res) -> "Hello World");
    }
}

ただ、このままダラダラと書いていくと

  • ルーティングが1ファイルに固まっていてみにくい。
  • チームで開発するときに編集が競合しやすい。
  • 加えてフィルタに相当する機能や組み込みjettyの設定もここに書く。
    といったことになり、よろしくありません。

じつは別クラスにできます。こんな感じで

Main.java
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は関数型インターフェースなので、

ResponseTransformerの関数型の書き換えその1
get("/api/hoge/:id", (req, res) -> {
    return Hoge.get(req.params(":id"));
}, JsonUtil::dataToJson);

という感じでメソッド参照が使えます。

また、テンプレートエンジンも標準で提供されているものもありますが、あまり使い勝手がよくない場合もあるので、

ResponseTransformerの関数型の書き換えその2
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に流れていく(のかな?すいません、未確認です)

以上です。初投稿でした。

24
24
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
24

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?