前置き
以前、仕事で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 でサーバが起動します。
アクセスして下の画面が表示されれば起動成功です。

補足
開発中は、~;jetty:stop;jetty:startでサーバを起動することにより、ソースコードに変更が入った場合に自動的に反映されるので、サーバの再起動が不要になり便利です。
※ただし、自動検知されるのはScalaのソースのみで、テンプレートエンジン(Twirlなど)に変更が入った場合はスルーされるようです。
作成されたプロジェクトの中身を見てみる
自動生成されたプロジェクトのツリーはこんな感じになっています。

- 
ScalatraBootstrap⇒ 起動クラス。ここにControllerが登録されている。別Controller追加可能。 - 
MyScalatraServlet⇒ Controller。ここにルーティングとAction処理を書く - twirlディレクトリ配下 ⇒ Twirl Scalatraデフォルトで使用可能なテンプレートエンジン。Playで採用されているものと同じ
 
ルーティング
Scalatraのルーティングの例をいくつか挙げてみます。
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サーバを書く機会があった場合は是非使っていきたいと思います。