java界隈の話題にはあまり目を向けていないのですが、 少しはscalaを触っておいてもいいかと思い、 比較的盛り上がってそうなPlay Frameworkを動かしてみようと思います。

以下、作成物はこのページをそのままなぞっているだけです。

チュートリアルはとても充実していて、少しバージョンが古いですが日本語訳もありますので、 真面目にやりたい人は上記を見ることをおすすめします。

Play Frameworkについて

  • scala / java 製
  • テンプレートエンジンはscala主体のものらしい
  • scalaという言語の特性から、scalaでもjavaでも開発可能
  • 今時のrailsやdjangoのような構成

今のところはこれくらいの理解しかありません。

インストール

色々方法があるようですが、以下に書いているTypesafe Activatorというものを使用する方法を試します。

Installing

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



blog comments powered by Disqus