Scala製WebフレームワークPlayに入門する

最初はチュートリアルに従ってダウンロードしてこようとしていたが、どうやらbrewで簡単にインストールできるということで以下の記事に従って。

Mac での Play20 開発環境構築は brew install play だけ - seratch's weblog in Japanese

$ brew install playでは以下のようにエラーが出てしまった。

▶ brew install play
Error: No available formula for play
Play 2.3 replaces the play command with activator:
  brew install typesafe-activator

You can read more about this change at:
  https://www.playframework.com/documentation/2.3.x/Migration23
  https://www.playframework.com/documentation/2.3.x/Highlights23

ということでtypesafe-activatorをインストールしてみる。

$ brew install typesafe-activator

サンプルアプリをつくってみる

playではactivatorコマンドを使うらしい。以前はplayコマンドだったみたいだけど。なんだかイケてない感じしちゃうけど、まーいっか。

$ activator new hello-play

こうするとテンプレートをどれにするかきかれます。

今回は公式のチュートリアルの動画に従って6のplay-scalaを選択。

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)
> 6
OK, application "hello-play" is being created using the "play-scala" template.

これでhello-playというアプリの雛形が作成されました!

playの標準アプリの構成はここで確認できます。

Anatomy

app                      → Application sources
 └ assets                → Compiled asset sources
    └ stylesheets        → Typically LESS CSS sources
    └ javascripts        → Typically CoffeeScript sources
 └ controllers           → Application controllers
 └ models                → Application business layer
 └ views                 → Templates
build.sbt                → Application build script
conf                     → Configurations files and other non-compiled resources (on classpath)
 └ application.conf      → Main configuration file
 └ routes                → Routes definition
public                   → Public assets
 └ stylesheets           → CSS files
 └ javascripts           → Javascript files
 └ images                → Image files
project                  → sbt configuration files
 └ build.properties      → Marker for sbt project
 └ plugins.sbt           → sbt plugins including the declaration for Play itself
lib                      → Unmanaged libraries dependencies
logs                     → Standard logs folder
 └ application.log       → Default log file
target                   → Generated stuff
 └ scala-2.10.0            
    └ cache              
    └ classes            → Compiled class files
    └ classes_managed    → Managed class files (templates, ...)
    └ resource_managed   → Managed resources (less, ...)
    └ src_managed        → Generated sources (templates, ...)
test                     → source folder for unit or functional tests

見た感じRailsなどのMVCフレームワークと特に変わったところはないかなと感じたけど、唯一target/cassesというディレクトリがJava系言語っぽいかなと思った。ここにはPlayのビルドシステムによってコンパイルされたScalaJavaのクラスファイルがが入ったりする。

各ディレクトリの用途については公式ドキュメントのページで一読しておくのがよい。

ということで試しにローカルのWebサーバーを走らせてみましょう。以下のようにします。

$ activator run

初期設定のポート番号は9000になってます。

初回だったからか自分の場合はscala-sbtとsbtのダウンロードとかプロジェクト関連のファイルのアップデートやらなんやらでめちゃくちゃ時間かかったけど、無事動きました。

Screenshot 2015-05-20 00.08.11.png

きたー! Welcome#index画面だ!!!

ここの画面を読めばなんか一通りどんな風にアプリが動くのか理解できると思う。

簡単に最初の方の超重要な部分だけひろってみると、まずconf/routesでルーティングの設定をしているのでこれを確認してみる。

# conf/routes

# Routes
# This file defines all application routes (Higher priority routes first)
# ~~~~

# Home page
GET     /                           controllers.Application.index

# Map static resources from the /public folder to the /assets URL path
GET     /assets/*file               controllers.Assets.at(path="/public", file)

これによると/にGETでリクエストをおくると、controllers.Application.indexメソッドが実行されるとのこと。

ということでapp/controller/Application.scalaを確認してみる。

# app/controllers/Application.scala

package controllers

import play.api._
import play.api.mvc._

object Application extends Controller {

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

}

ということでここではindexメソッドが定義されてて、このメソッドはHTTPのステータスコード200 OKのレスポンスならviews.html.indexメソッドが呼び出される。多分これはapp/views/index.scala.htmlを呼び出すのかな?この辺の挙動というか、まずScala自体をきちんと勉強できてない。

# app/views/index.scala.html

@(message: String)

@main("Welcome to Play") {

    @play20.welcome(message)

}

チュートリアルにも書いてあった、activator uiというものも試しにやってみた。

$ activator ui

これはブラウザのグラフィカルの画面からソースをいじったり、ビルドしたり、チュートリアルを読んだりできるというとても素晴らしい機能。

まぁ全てコマンドライン上でできることではあると思うので、それが苦でなければここのチュートリアルに一通りみてあとはコマンドラインでやればよいと思う。

ということでここまでで一通りPlayでWebアプリを動かすことができた。

ここからどんどん使っていってどんどん記事書けたらと思います。

今回作ったサンプルアプリのソースはこちら。

totzYuta/hello-play · GitHub