Challenge Engineer Life !

エンジニア人生を楽しみたい!仕事や趣味で学んだ技術的なことを書いていくブログです。

Java 8でSpark 2.0.0が楽しそう

今年はDropwizardが盛り上がる、という話をチラホラ聞きます。

リリースノートをみるとバージョンとしては2013年3月に0.6.2が出て、2014年6月現在0.7.x系のようです。

0.7.0-SNAPSHOTのリリースノートみると、「Upgraded to Java 7」とあって、Java 8出たんだけどなぁと思ったり。

そこで思い出したのですが、Java 8が出たとき話題になっていたSparkってどんななんだろう?と触ってみました。

Spark Micro Web Framework

トップページの作りがうまい感じで
http://www.sparkjava.com/

f:id:kikutaro777:20140622154901j:plain
「え!?こんなんで書けるの!?」って感じで「やってみよう!」意欲をうまく駆り立てる感じですねー。そしてあっさり動くから楽しくなってしまう(^^;

この書き方なんなの?とJava 8やラムダに興味持つ人も増えるのでは…とも思ったり。

自分でも試してみましたが

package jp.co.hoge.myfirstspark;
import static spark.Spark.*;

public class KickSpark {
    public static void main(String... args){
        get("/makimaki", (req, res) -> "堀北真希さん");
    }
}

こんなの書いて実行し、URLにアクセスすると
f:id:kikutaro777:20140622163231j:plain
手軽すぎる(^^;

Lambdaの部分はRouteクラスのインスタンスとなっていて、無名クラスで書くと

package jp.co.hoge.myfirstspark;
import spark.Request;
import spark.Response;
import spark.Route;
import static spark.Spark.*;

public class KickSpark {
    public static void main(String... args){
        get("/makimaki", new Route() {
            @Override
            public Object handle(Request req, Response res) {
                return "堀北真希さん";
            }
        });
    }
}

のようになります。Java 8のおかげでスッキリ書ける(>_<)

ポートはデフォルトで4567となっていますが、以下のようにで簡単に変えることができたり。

package jp.co.hoge.myfirstspark;
import static spark.Spark.*;

public class KickSpark {
    public static void main(String... args){
        setPort(7890); //ポート番号変えてみる
        get("/makimaki", (req, res) -> "堀北真希さん");
    }
}

f:id:kikutaro777:20140622162228j:plain

処理の前後でフィルタを挟んだり

package jp.co.hoge.myfirstspark;
import static spark.Spark.*;

public class KickSpark {
    public static void main(String... args){

        //beforeによるリクエスト前の処理
        before((req, res) -> {
            System.out.println("全てのリクエスト共通");
        });
        
        before("/makimaki", (req, res) -> {
            System.out.println("堀北さんを呼ぶ前の準備");
        });
        
        get("/makimaki", (req, res) -> "堀北真希さん");
        
        //afterによるリクエスト後の処理
        after("/makimaki", (req, res) -> {
            System.out.println("メチャクチャかわいかった!");
        });
        
        after((req, res) -> {
            System.out.println("全てのリクエスト共通");
        });
    }
}

localhost:4567にアクセスすると(上記例だとNot Foundページですが)

全てのリクエスト共通
全てのリクエスト共通

localhost:4567/makimakiにアクセスすると

全てのリクエスト共通
堀北さんを呼ぶ前の準備
メチャクチャかわいかった!
全てのリクエスト共通

Cookieやセッション管理はもちろん、リクエストと応答まわりの処理、テンプレートエンジン(サイトでの例はFreeMaker,Apache Velocity,Mustacheの3つでした)利用もできるので、一通りの機能はあるのではないかなーと。

Java 8とNetBeans 8での具体的手順

最後に、自分のWindows環境でやってみた手順を一応貼っておきます。
Java 8とNetBeans 8、Mavenでやりました。

NetBeansの「ファイル」から「新規プロジェクト」を選択
f:id:kikutaro777:20140622165217j:plain

カテゴリ「Maven」でプロジェクト「Javaアプリケーション」を選択
f:id:kikutaro777:20140622165225j:plain

プロジェクト名やその他情報は適当に
f:id:kikutaro777:20140622165231j:plain

pom.xmlを開いて
f:id:kikutaro777:20140622165237j:plain

JDK7(以下1.7)になっていれば
f:id:kikutaro777:20140622165242j:plain

JDK8(以下1.8)に変えて、Sparkの依存を定義します。

<dependencies>
    <dependency>
        <groupId>com.sparkjava</groupId>
        <artifactId>spark-core</artifactId>
        <version>2.0.0</version>
    </dependency>
</dependencies>

f:id:kikutaro777:20140622165248j:plain

プロジェクトを右クリックしてクラスを追加します(昔は適当なMainクラスを自動で作ってくれていたような…)
f:id:kikutaro777:20140622165254j:plain

f:id:kikutaro777:20140622165259j:plain

以上で準備完了。最初にのせたようなコードを書いて

package jp.co.hoge.myfirstspark;
import static spark.Spark.*;

public class KickSpark {
    public static void main(String... args){
        get("/makimaki", (req, res) -> "堀北真希さん");
    }
}

実行するだけです。
以下のようにListeningになればOK
f:id:kikutaro777:20140622170157j:plain

にほんブログ村 IT技術ブログへ
にほんブログ村 にほんブログ村 IT技術ブログ Javaへ
にほんブログ村