java界隈の話題にはあまり目を向けていないのですが、 少しはscalaを触っておいてもいいかと思い、 比較的盛り上がってそうなPlay Frameworkを動かしてみようと思います。
以下、作成物はこのページをそのままなぞっているだけです。
チュートリアルはとても充実していて、少しバージョンが古いですが日本語訳もありますので、 真面目にやりたい人は上記を見ることをおすすめします。
Play Frameworkについて
- scala / java 製
- テンプレートエンジンはscala主体のものらしい
- scalaという言語の特性から、scalaでもjavaでも開発可能
- 今時のrailsやdjangoのような構成
今のところはこれくらいの理解しかありません。
インストール
色々方法があるようですが、以下に書いているTypesafe Activatorというものを使用する方法を試します。
$ sudo aptitude -y install openjdk-8-jdk ... $ wget https://downloads.typesafe.com/typesafe-activator/1.3.6/typesafe-activator-1.3.6.zip $ unzip typesafe-activator-1.3.6.zip $ mv activator-dist-1.3.6 ~/ $ echo 'PATH=$HOME/activator-dist-1.3.6:$PATH' >> ~/.bashrc $ $SHELL -l
project作成
このあたりはrailsなどと同じような雰囲気です。
$ activator new test-app play-scala ... $ cd test-app $ ./activator run
この状態で http://localhost:9000 へアクセスすると、ページを表示できます。
Play Frameworkのバージョンは2.4.3になっています。
controller / template / route
自前のページを作成してみます。
app/controllers/Application.scala
package controllers import play.api._ import play.api.mvc._ class Application extends Controller { def index = Action { Ok(views.html.index("Your new application is ready.")) } def first = Action { val message = "First Message" Ok(views.html.first(message)) } }
テンプレートでは、変数を型指定で受け取る必要があるようです。
app/views/first.scala.html
@(message: String) <h1>@message</h1>
この際のルーティング設定は単純ですね。
conf/routes
# Routes
# This file defines all application routes (Higher priority routes first)
# ~~~~
# Home page
GET / controllers.Application.index
GET /first controllers.Application.first
# Map static resources from the /public folder to the /assets URL path
GET /assets/*file controllers.Assets.versioned(path="/public", file: Asset)
テンプレート変数
こういうのは通常、Modelや自前のオブジェクトなどを渡すのがよくあるパターンなのでしょうか。
Play Frameworkのテンプレートはどうやらテンプレート側で受け取る定義が必要になるので、 このあたりは簡潔に済ませたほうが良さそうに感じます。
そういうわけで、複数の値を渡す場合はどうするのか、実践してみました。
app/controllers/Application.scala
package controllers import play.api._ import play.api.mvc._ class Application extends Controller { def index = Action { Ok(views.html.index("Your new application is ready.")) } def first = Action { val message = "First Message" val messages = Map("h2" -> "Second Message", "h3" -> "Third Message") val num_list = Seq(1, 3, 5, 7, 9) Ok(views.html.first(message, messages, num_list)) } }
単純にカンマ区切りで引数を設定すれば、複数の値を渡せるようです。
受け取る側は、やはり型指定が必要です。
app/views/first.scala.html
( message: String, messages: Map[String, String], num_list: Seq[Int] ) <h1>@message</h1> <h2>@messages("h2")</h2> <h3>@messages("h3")</h3> <ul> @for(num <- num_list) { <li>Number @num</li> } </ul>
以上、Hello Worldに毛が生えた程度の内容ですが、今回はここまでにしておきます。
次はDB接続やデプロイ方法などについて確認できればいいな…