俺とプログラミング

某IT企業でエンジニアをしてます。このブログではプログラミングに関わることを幅広く発信します。

Play Framework 2.4 入門 【インストールからHerokuでのデプロイまで】

Play FrameworkはJava, Scalaで書けるMVCアーキテクチャーによるWebアプリケーション・フレームワークです。 この記事では、Play Framework 2.4のインストール、Herokuへのデプロイ、Eclipseでのプロジェクトのインポート、Playアプリケーションの構造について順に紹介していきます。

必要なもの

パスを通す

Play Frameworkではインストールとかは必要なく、展開したフォルダにパスを通すだけでOKです。 Linuxの場合以下のコマンドでパスを通します(ホームフォルダにactivatorとして展開した場合)。

$ echo export PATH=$PATH:~/activator >> ~/.profile
$ source ~/.profile

サンプルを動かす

サンプル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を見て行きましょう。

@(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を見てみましょう。

@(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!"))
  }
}
@(message: String)

@main("Play") {

  <h1>@message</h1>

}

その後、

$ activator run

を実行後、localhost:9000にアクセスして、 Hello, Play! と表示されるのを確認します。 簡単ですが、以上でチュートリアルを終了します。

次回はデータベース接続などについて触れていきたいと思います。

Play Framework 2徹底入門 JavaではじめるアジャイルWeb開発

Scalaスケーラブルプログラミング第2版

Copyright © 2016 ttlg All Rights Reserved.