Play Framework 2.4 入門 【インストールからHerokuでのデプロイまで】
Play FrameworkはJava, Scalaで書けるMVCアーキテクチャーによるWebアプリケーション・フレームワークです。 この記事では、Play Framework 2.4のインストール、Herokuへのデプロイ、Eclipseでのプロジェクトのインポート、Playアプリケーションの構造について順に紹介していきます。
必要なもの
- Java8(Java SE Development Kit 8 - Downloads)
- インストールします
- Play Framework2.4(Play Framework - Build Modern & Scalable Web Apps with Java and Scala)
- ダウンロードして展開します
サンプルを動かす
サンプルWebアプリケーションを作ります。activator new [アプリ名]でアプリを生成してくれます。 初めの実行はいろいろダウンロードされるので少し時間がかかります。 最後にテンプレートについて聞かれるので答えます。 今回は play-scala を選択しました。
$ activator new [アプリ名] ... Browse the list of templates: http://typesafe.com/activator/templates Choose from these featured templates or enter a template name: 1) minimal-akka-java-seed 2) minimal-akka-scala-seed 3) minimal-java 4) minimal-scala 5) play-java 6) play-scala (hit tab to see a list of all templates) > play-scala
生成されたフォルダに移動後、activator run でアプリケーションを実行します。 こちらも、初めの実行にはいろいろダウンロードされるので時間がかかります。 気長に待ちましょう。
$ cd [アプリ名] $ activator run Getting org.scala-sbt sbt 0.13.8 ... ... --- (Running the application, auto-reloading is enabled) --- [info] p.c.s.NettyServer - Listening for HTTP on /0:0:0:0:0:0:0:0:9000 (Server started, use Ctrl+D to stop and go back to the console...)
サーバーが動いたら、localhost:9000にアクセスします。 Welcome to Playと表示されればひとまずサンプルアプリの実行は完了です。 Ctrl-Dで終了します。
Eclipseで読み込む
Eclipseでプロジェクトを読み込みます。そのためにはScalaのプラグインが必要です。 ここではEclipse Marsを使っています。
EclipseのメニューからHelp->New Softwareで以下のリンクを貼り付けて、Scala関連のもろもろをインストールします。
http://download.scala-ide.org/sdk/lithium/e44/scala211/stable/site
Eclipseのプロジェクトファイルを作るには、play 2.4では少し作業が必要。
プロジェクトフォルダで以下のコマンドを実行してください。
$ echo addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "4.0.0") >> project/plugins.sbt $ activator eclipse
実行し終わったらEclipseからプロジェクトをインポートします。 EclipseのメニューからFile->Import->General->Existing Projects into Workspace->Select root directoryでアプリのフォルダを選択します。
Herokuで動かす
作ったアプリをHerokuを使って公開しましょう。 データ量が少なければ無料で使えます。以下のリンクからSign upを選択してHerokuに登録します。
登録が終わったら、以下のリンクからHeroku Toolbelt(必要なソフトウェア)をインストールします。
インストールしたら、以下の一連のコマンドでデプロイできます。
$ git init $ heroku create [アプリ名] $ git add . $ git commit -m "first commit" $ git push heroku master
$ heorku open
でブラウザで開き、エラーメッセージがでなければデプロイは成功です。
編集した結果を更新してデプロイするには以下のコマンドを実行します。
$ git add . $ git commit -m "commit messege" $ git push heroku master
以下のリンクにアクセスすると、公開したアプリの状況などが確認できます。 また、アプリの削除などもここから行えます。
これでひとまずHeroku編は終了です。
アプリケーションの構造を理解する
いままではサンプルを動かしていただけでしたが、この辺でPlay Frameworkで作られたアプリの構造について確認していきましょう。 プロエジェクトの構造は以下のようになっています。
app/ controllers/ Application.scala views/ index.scala.html main.scala.html conf/ routes project/ public/ target/ build.sbt
この中で重要なのが、appフォルダです。 ここにメインのロジックを記述していくことになります。 MVCのControllerとViewはデフォルトでありますが、Modelについては初めはありません。データベースを使い始めるとでてきます。
まずは、この中のApplication.scalaに注目してみましょう。
- controllers/Applicatoin.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.")) } }
indexメソッドに代入されたこのActionとはなんでしょうか。 以下に公式からの引用文を載せます。
基本的に play.api.mvc.Action は、リクエストを処理してクライアントへ送るレスポンスを生成する (play.api.mvc.Request => play.api.mvc.Result) 型の関数です。
Ok は コンテントタイプ text/plain のレスポンスボディを含む、 ステータス 200 OK のレスポンスを生成します。
要はHTTPリクエストを受け取って、HTTPレスポンスを返す関数と見ていいでしょう。
conf/routesを見てみると、よりよくわかります。 routesには以下の一文があります。
GET / controllers.Application.index
GETリクエストがあった時に、Application.indexメソッドを発行することを指定しています。
次に気になるのはResult型のOkに渡された引数views.html.indexです。 これは、ビルドするときに後述するindex.scala.htmlをレンダリングされて生成されるものです。
index.scala.htmlを見て行きましょう。
- views/index.scala.html
@(message: String) @main("Welcome to Play") { @play20.welcome(message) }
@(message: String)で先ほどの引数を受け取っています。 そして、@mainで後述するmain.scala.htmlを呼び出します。 この@main("Welcom to Play"){}で囲まれた部分が、main.scala.htmlの引数として与えられます。 @play20.welcom(message)という部分を今まで渡して来たわけです。
次にmain.scala.htmlを見てみましょう。
- view/main.scala.html
@(title: String)(content: Html) <!DOCTYPE html> <html lang="en"> <head> <title>@title</title> <link rel="stylesheet" media="screen" href="@routes.Assets.versioned("stylesheets/main.css")"> <link rel="shortcut icon" type="image/png" href="@routes.Assets.versioned("images/favicon.png")"> <script src="@routes.Assets.versioned("javascripts/hello.js")" type="text/javascript"></script> </head> <body> @content </body> </html>
注目すべきは@(title: String)(content: Html)の部分です。titleに"Welcom to Play"が渡され、contentにHtml形式のオブジェクトが渡されています。 そして、@title, @contentでその中身を参照しています。 なんとなく流れがつかめたのではないでしょうか。
試しに以下のように少し書き換えてみましょう。
- controllers/Applicatoin.scala
package controllers import play.api._ import play.api.mvc._ class Application extends Controller { def index = Action { Ok(views.html.index("Hello, Play!")) } }
- views/index.scala.html
@(message: String) @main("Play") { <h1>@message</h1> }
その後、
$ activator run
を実行後、localhost:9000にアクセスして、 Hello, Play! と表示されるのを確認します。 簡単ですが、以上でチュートリアルを終了します。
次回はデータベース接続などについて触れていきたいと思います。