Statistical Programming

Play Framework入門

Play2フレームワークの開発フローについてまとめます。

インストールなどは省略して、プロジェクト作成から。
まずはターミナルを起動しプロジェクトを作成したいディレクトリに移ります。

cd /Desktop

その後playコマンドでプロジェクト作成。

play new sample

するとプロジェクト名と開発言語について質問がくるので
それに回答
→プロジェクト作成完了。

次に、

play run

コマンドをうちサーバーを起動。
ターミナルから任意のブラウザに移り

http://localhost:9000

を打ち込むとwelcomeページが表示されます。
これでプロジェクトはとりあえず作られ動きます。

さて、welcomeページに行けたはいいもののいったいどういった風なディレクトリ構造になっているのでしょうか?
調べてみると以下のようなディレクトリ構造をしていました。

app → アプリケーションのソースコード
└ assets → 別の言語へコンパイルされるアセットのソースファイル
└ stylesheets → 通常は LESS CSS のソース
└ javascripts → 通常は CoffeeScript のソース
└ controllers → アプリケーションのコントローラ
└ models → アプリケーションのビジネスロジック
└ views → テンプレート
conf → 設定ファイル
└ application.conf → メイン設定ファイル
└ routes → ルート定義
public → 公開アセット
└ stylesheets → CSS ファイル
└ javascripts → JavaScript ファイル
└ images → 画像ファイル
project → sbt 設定ファイル
└ build.properties → sbt プロジェクトの基本ファイル
└ Build.scala → アプリケーションのビルドスクリプト
└ plugins.sbt → sbt プラグイン
lib → 管理されないライブラリ依存性
logs → デフォルトのログ保存場所
└ application.log → デフォルトのログファイル
target → Play により生成されたファイル
scala-2.9.1 
└ cache 
└ classes → コンパイルされたクラスファイル
└ classes_managed → Play 管理下のクラスファイル (テンプレートなど)
└ resource_managed → Play 管理下のリソース (less など)
└ src_managed → 生成された中間コード (テンプレートなど)
test → 単体テストや機能テストのソースフォルダ


設定ファイルはconfの中のに入っておりその中のroutesを見てみると、welcomeページは

GET / controllers.Application.index


このように定義されていました。
このwelcomeページはどうやらGETでrequestを受け取り
appフォルダのcontrollersパッケージの中にあるApplication.scalaファイルの中で定義されており、Controllerクラスを継承したApplicationオブジェクトのindex関数を参照することによって表示できていたのです!(なんともまあめんどくさい笑)

object Application extends Controller {

def index = Action {
Ok(views.html.index("Your new application is ready."))
}
}


これを見てふにゃ?んんんだこれ????
と自分はなったので補足しますと、

基本的に play.api.mvc.Action は、リクエストを処理してクライアントへ送るレスポンスを生成する (play.api.mvc.Request => play.api.mvc.Result) 型の関数です。Play アプリケーションが受け取ったリクエストのほとんどは、Action によって処理されます。」

とのことです。
要はリクエストが来たらそのリクエストに対応するActionを返すための記述らしいです。
Actionの中でOkとありますがこれは空の 200 OK ステータスの HTTP レスポンスを生成するためのものです。この他にもHtmlやXmlなど様々な値をActionメソッドは返します。ではOkのなかのあやつはなんなのじゃ?

views.html.index("Your new application is ready.")

→appフォルダのviewsパッケージのなかにあるindex.scala.htmlを引数つきで渡しています。
Okは空なのでその中身を引数で与えているといったところでしょうか。

さらにそのindex.scala.htmlファイルを見てみます。

@(message: String)

@main("Welcome to Play 2.0") {

@play20.welcome(message)

}


最初の@から始まる行は引数を表しています。
次の行はなにやらmain()を実行しています。
さらにその中に入れ子となってはいっているのが@play20.welcome(message)です。
@mainは同ディレクトリに存在するmain.scala.htmlを表しており、
main.scala.htmlファイルは先ほどと同じく一番上の行が引数。
それから下がテンプレートとなるhtmlファイルです。ようやく見覚えがある形がでてきましたw
その中にまたしても@〜が入っておりこのおかげで外部から値を組み込むことができています。