Edited at

Scalatraを試してみる


前置き

以前、仕事でPlayFrameworkを使っていたのですが、その他のScala系Webフレームワークは全然触った事がありませんでした。

今回は勉強がてらその他のフレームワークを触ってみようと思います。

今回触ってみるのは、Scalatraです。


Scalatra is a simple, accessible and free web micro-framework.

It combines the power of the JVM with the beauty and brevity of Scala, helping you quickly build high-performance web sites and APIs.


公式サイトによれば、シンプルでScalaの美しさと簡潔さを兼ね備えていて、高性能のWebサイトやAPIを迅速に構築できます。とのことです。

現在のstableな最新バージョンは2.6.5のようです。


事前準備

Scalatraを動かすのに必要な次のものをインストール


  • Java 1.8以上

  • sbt 0.13.13


Scalatraプロジェクト作成

好きなところにディレクトリを作成して次のコマンドを実行

sbt new scalatra/scalatra.g8

↑を実行してしばらくすると色々聞かれるので適宜入力する

※今現在、デフォルト設定のままだと、scalatra_version [2.7.0-RC1]をダウンロードするようです。


動かしてみる

出来上がったプロジェクトを実行してみます。

プロジェクトルートで次のコマンドを実行します。

$ sbt

sbt:My Scalatra Web App> jetty:start

これによりhttp://localhost:8080 でサーバが起動します。

アクセスして下の画面が表示されれば起動成功です。

Menubar_と_Scalatra__a_tiny__Sinatra-like_web_framework_for_Scala_と_App Store.png


補足

開発中は、~;jetty:stop;jetty:startでサーバを起動することにより、ソースコードに変更が入った場合に自動的に反映されるので、サーバの再起動が不要になり便利です。

※ただし、自動検知されるのはScalaのソースのみで、テンプレートエンジン(Twirlなど)に変更が入った場合はスルーされるようです。


作成されたプロジェクトの中身を見てみる

自動生成されたプロジェクトのツリーはこんな感じになっています。

my-scalatra-web-app____work_scalatra_my-scalatra-web-app__-_____src_main_scala_ScalatraBootstrap_scala__My_Scalatra_Web_App_.png



  • ScalatraBootstrap ⇒ 起動クラス。ここにControllerが登録されている。別Controller追加可能。


  • MyScalatraServlet ⇒ Controller。ここにルーティングとAction処理を書く

  • twirlディレクトリ配下 ⇒ Twirl Scalatraデフォルトで使用可能なテンプレートエンジン。Playで採用されているものと同じ


ルーティング

Scalatraのルーティングの例をいくつか挙げてみます。


MyScalatraServlet

package com.example.app

import org.scalatra._

class MyScalatraServlet extends ScalatraServlet {

// GET / に対応
get("/") {
// twirlのテンプレート呼び出し
views.html.hello()
}

// 条件による分岐 GET /で何かしらクエリストリングがあるケースに対応
get("/", request.queryString.nonEmpty) {
// 単純な文字列でもOK
"query string is existing"
}

// GET /test?name=***に対応 paramsからnameの値を取得可能
get("/test") {
// HTMLタグをそのままでもOK
<h1>Hello, { params("name") }</h1>
}

// GET /test/***に対応 こっちもparamsからnameの値を取得可能
get("/test/:name") {
<h1>Hello, { params("name") }</h1>
}

// 403を返す
get("/forbidden") {
Forbidden { <h1>Forbidden !!</h1> }
}

// 404を返す その1
get("/notFound1") {
// NotFoundメソッドを呼ぶやり方
NotFound { <h1>Not Found !!</h1> }
}

// 404を返す その2
get("/notFound2") {
// haltメソッドで詳細な情報を返すやり方
halt(
status = 404,
body = <h1>Not Found!!</h1>,
headers = Map(
"X-Hoge" -> "hoge",
"X-Fuga" -> "fuga",
)
)
}
}


触れ込み通り、シンプルですね。わかりやすいと思います。


最後に

ほんの触りだけ紹介してみました。かなり使いやすそうなニオイがします。

PlayFrameworkはちょっと色々含まれすぎていて大仰すぎる、といった場合にはScalatraを採用するのもありかも知れません。

今後、簡単なREST APIサーバを書く機会があった場合は是非使っていきたいと思います。