4
3

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.

Scalatraを試してみる

Last updated at Posted at 2019-07-03

前置き

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

4
3
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
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?