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接続やデプロイ方法などについて確認できればいいな…