前置き
以前、仕事で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サーバを書く機会があった場合は是非使っていきたいと思います。