§プロジェクトの立ち上げ
§はじめに
このチュートリアルでは、実際の web アプリケーションを始めから終わりまでコーディングすることによって、Play 2 フレームワークについて学びます。このアプリケーションでは、Play アプリケーション開発の優れたプラクティスを紹介しつつ、実際のプロジェクトで必要となるあらゆるものを使っていきます。
このチュートリアルは、いくつかの独立した部分に分かれています。それぞれの部分では、より複雑な機能を紹介し、実際のプロジェクトが必要とするすべてのこと: バリデーション、エラー処理、完成されたセキュリティフレームワーク、自動化されたテストスイート、きらびやかな web インタフェース、管理領域などを提供します。
このチュートリアルに含まれる すべてのコード は、あなたのプロジェクトに使用することができます。コードの断片をコピーアンドペーストするか、または全体をまるごと流用することを推奨します。
§プロジェクト
これからタスク管理システムを作成します。これは、とても想像力に富んだ選択ではありませんが、モダンな web アプリケーションで必要な機能のほとんどの部分を試すことができます。
このタスク管理プロジェクトを ZenTasks と呼ぶことにしましょう。
このチュートリアルはサンプルアプリケーションとしても配布されています。最終的なコードは Play インストール先の
samples/java/zentasks
ディレクトリにあります。
§前提条件
何よりも、まず Java がインストールされていることを確認してください。Play は Java 6 以降 を必要とします。
私たちはコマンドラインを多用するので、Unix ライクな OS のほうが良いでしょう。もし Windows 上で動かす場合でも、問題なく動作します。ただコマンドプロンプトでいくつかのコマンドを実行しなければならないだけです。
このチュートリアルは、あなたが Java と Web 開発 (特に HTML, CSS, および JavaScript) に関する知識を既に持つものとします。しかしながら、あらゆる JEE コンポーネントに関する深い知識は必要としません。Play は ‘フルスタック’ な Java フレームワークであり、必要な Java API のすべての部分を提供するか、またはカプセル化します。JPA エンティティマネージャを設定する方法や、あるいは JEE コンポーネントをデプロイする方法を知っている必要はありません。
もちろんテキストエディタが必要です。もし Eclipse や Netbeans のようなフル機能の Java IDE に慣れているなら、もちろんそれを使用できます。しかし、Play であれば、Textmate, Emacs または VI のようにシンプルなテキストエディタでも楽しく作業できます。これは、フレームワーク自身がコンパイルとデプロイを管理するからです。間もなくその様子をご覧に入れます…
このチュートリアルの後半で、Lighttpd と MySql を使い、‘production’ モードの Play アプリケーションをデプロイする方法を示します。しかし、Play はこれらのコンポーネントなしでも動作することができるので、もしこれらをインストールできなくても問題ありません。
§play フレームワークのインストール
インストールは非常に簡単です。 ダウンロードページから最新のバイナリパッケージをダウンロードして、任意のパスに展開してください。
windows を使用している場合、パスにスペースを含めないのは一般的に良い案です。例えば、
c:\play
はc:\Documents And Settings\user\play\
よりも良い選択です。
効率的に作業するためには、作業パスに play ディレクトリを加える必要があります。パスを追加することで、コマンドプロンプトでただ play
とタイプすれば、play ユーティリティを使用できるようになります。正常にインストールが完了したことを確認するには、新しいコマンドラインを開いて play
とタイプしてください; このコマンドは play の基本的なヘルプを表示します。
§プロジェクトの作成
play が正しくインストールされたので、いよいよタスクアプリケーションを作成します。play アプリケーションの作成は、play コマンドラインユーティリティによって完全に管理されており、とても簡単です。play コマンドラインユーティリティは、すべての Play アプリケーション間において標準的なプロジェクトレイアウトを割り当てます。
新しいコマンドラインを開いて、以下をタイプしてください:
~$ play new zentasks
アプリケーションの完全な名前を入力するプロンプトが表示されます。 ‘ZenTasks’ とタイプしてください。その後、使用するテンプレートを選択するプロンプトが表示されます。Java アプリケーションを作成するので、 2 をタイプしてください。
ここで Java または Scala を選んでも、後からいつでも変更することができます。
play new
コマンドは zentasks/
ディレクトリを新規に作成し、一連のファイルやディレクトリをここに追加します。以下は、もっとも重要なディレクトリです:
app/
ディレクトリはアプリケーションの中心部であり、モデル、コントローラ、およびビュー用のディレクトリに分けられています。 他の Java パッケージを含むこともできます。
conf/
ディレクトリは、特に重要な application.conf
ファイル、ルーティングを定義する routes
ファイル、国際化のための messages
ファイルなど、アプリケーションを設定する全てのファイルを保存します。
public/
は JavaScript, スタイルシート、および画像ディレクトリを含む公的に利用可能なリソースを保存します。
project/
は、プロジェクトのビルドファイル、特に play フレームワークが依存する外部のライブラリやプラグインを定義することのできるファイルを保存します。
test/
には、すべてのアプリケーションテストを保存します。テストは Java の JUnit として書かれるか、または Selenium テストとして書かれます。
play は UTF-8 を唯一のエンコーディングとして使用するので、これらのディレクトリでホスティングされたすべてのテキストファイルが UTF-8 でエンコードされていることは非常に重要です。テキストエディタの設定がこれに従っていることを確認してください。
もし、あなたが熟練した Java 開発者であれば、すべての .class ファイルがどこに行ってしまったのか不思議に思うことでしょう。実は、どこにもありません: play はいかなる class ファイルも使用せず、Java ソースファイルを直接読み込みます。舞台裏では、実行中の Java ソースをコンパイルするために SBT コンパイラを使用しています。
これは、開発工程において 2 つの非常に重要なことを可能にします。最初の 1 つは、play はあなたが Java ソースファイルに加えたいかなる変更をも検出して、実行時にそれを自動的にリロードするということです。 2 番目は、Java の例外が発生したとき、play はソースコードそのものを示しながらより良いエラーレポートを作成するということです。
実際のところ、play はアプリケーションの
/target
ディレクトリにバイトコードのキャッシュを保持しますが、これは大きなアプリケーションの再起動を高速化するためだけのものです。必要であれば、play clean
コマンドを使うことでこのキャッシュを破棄することができます。
§アプリケーションの実行
ここまで来れば、新しく作成したアプリケーションを試してみることができます。コマンドラインに戻り、新たに作成された zentasks/
ディレクトリに移動したら、 play
とタイプしてください。Play コンソールが起動します。ここで run
とタイプしてください。Play がアプリケーションをロードし、9000 番ポートで web サーバを起動します。
ブラウザから http://localhost:9000 を開くことで、新しいアプリケーションを閲覧することができます。新しいアプリケーションは、それが首尾よく作成されたこと示す標準のウェルカムページを表示します。
新しいアプリケーションがどのようにしてこのページを表示するのかを見てみましょう。
アプリケーションのエントリーポイントは conf/routes
ファイルです。このファイルはアプリケーション上のアクセス可能な URL をすべて定義します。 生成された routes ファイルを開くと、最初の ‘route’ が確認できるでしょう:
GET / controllers.Application.index()
この設定は、web サーバが /
パスに対する GET
リクエストを受け取った場合には controllers.Application.index()
という Java メソッドをコールしなければならないことを play に伝えています。
スタンドアロンな Java アプリケーションを作成するとき、一般的に以下のようなメソッドを定義することで単一のエントリーポイントを設けます:
public static void main(String[] args) {
...
}
play アプリケーションには、各 URL あたり 1 つのエントリーポイントがあります。 私たちは、これらのメソッドを ‘アクション’ メソッドと呼びます。アクションメソッドは ‘コントローラ’ と呼ぶ特別なクラスで定義されます。
controllers.Application
コントローラがどのようなものか見てみましょう。app/controllers/Application.java
ソースファイルを開いてください:
package controllers;
import play.*;
import play.mvc.*;
import views.html.*;
public class Application extends Controller {
public static Result index() {
return ok(index.render("Your new application is ready."));
}
}
コントローラクラスは play.mvc.Controller
クラスを継承します。このクラスは index アクションで使用した ok()
メソッドのような、コントローラ向けの便利なメソッドを提供します。
index アクションは public static Result
なメソッドとして定義されています。アクションメソッドはこのようにして定義されます。コントローラクラスは決してインスタンス化されないので、アクションメソッドは static です。アクションメソッドは、フレームワークがリクエストされた URL にレスポンスできるよう public として宣言されます。アクションメソッドは常にアクションの実行結果である play.mvc.Result
を返します。
デフォルトの index アクションはシンプルです: views.html.index
テンプレートの render()
メソッドに文字列 "Your new application is ready."
を引き渡してコールします。そして、これを ok()
の結果としてラップし、返却します。
テンプレートは /app/views
ディレクトリに存在するシンプルなテキストファイルです。テンプレートがどのようなものかを見るには、app/views/Application/index.scala.html
ファイルを開いてください:
@(message: String)
@main("Welcome to Play 2.0") {
@play20.welcome(message, style = "Java")
}
テンプレートの内容はとても簡単に見えます。実際、ここにあるものはすべて Scala テンプレートディレクティブです。
@(message: String)
ディレクティブは、このテンプレートが受け付ける引数を宣言します。この場合、引数は message
と呼ばれる String
型のひとつの変数です。この message
引数は後でテンプレート内で使用されます。
@play20.welcome()
ディレクティブは、ブラウザに表示されたウェルカムメッセージを生成する組み込みの Play 2 テンプレートを呼び出します。先に引数ディレクティブで宣言したmessage
パラメータを引き渡していることが分かります。
@main()
ディレクティブは、main.scala.html
という別のテンプレートを呼び出します。@play20.welcome()
と @main()
は、いずれもテンプレート合成の使用例を示しています。テンプレートの合成は、共通化された部分を再利用することで複雑なウェブページを作成することができる強力な概念です。
app/views/main.scala.html
テンプレートを開いていてください:
@(title: String)(content: Html)
<!DOCTYPE html>
<html>
<head>
<title>@title</title>
<link rel="stylesheet" media="screen"
href="@routes.Assets.at("stylesheets/main.css")">
<link rel="shortcut icon" type="image/png"
href="@routes.Assets.at("images/favicon.png")">
<script src="@routes.Assets.at("javascripts/jquery-1.7.1.min.js")"
type="text/javascript"></script>
</head>
<body>
@content
</body>
</html>
引数の宣言に注目してください。ここでは、title
パラメータと、第二引数として Html
型の content
を受け取っています。第二引数をそれ自身の括弧内に置くことで、先に index.scala.html
テンプレートで見た構文を利用することができます:
@main("Welcome to Play 2.0") {
...
}
content
引数は、@main
ディレクティブに続く波括弧の中にあるブロックを実行することで取得されます。そして、@content
は <body>
タグの間に挿入されています。このようにして、あるテンプレートを別のテンプレートでラップする、テンプレート合成を使用しています。
コントローラファイルを編集することで、play がどのようにして自動的にこれをロードするのか試してみることができます。 app/controllers/Application.java
ファイルをテキストエディタで開いて、 ok()
呼び出しの後に続くセミコロンを削除することで間違いを埋め込んでください:
public static Result index() {
return ok(index.render("Your new application is ready."))
}
ブラウザに戻りページをリフレッシュしてください。play が変更を検出して Application
コントローラをリロードしようとする様子を見ることができます。しかし、間違いがあるためコンパイルエラーが発生します。
OK, エラーを修正して、実際の変更を加えましょう:
public static Result index() {
return ok(index.render("ZenTasks will be here"));
}
今度は、play は適切にコントローラをリロードし、JVM 上の古いコードを置き換えました。 ページの表題には変更した後の文字が表示されています。
ここで、app/views/Application/index.scala.html
テンプレートを編集してウェルカムメッセージを置き換えてみましょう:
@(message: String)
@main("Welcome to Play 2.0") {
<h1>@message</h1>
}
Java コードの変更と同じように、変更内容を確認するには、ただブラウザでページをリフレッシュするだけです。
いよいよタスクアプリケーションのコーディングを始めました。このままテキストエディタで作業し続けることも、Eclipse や NetBeans のような Java IDE でプロジェクトを開くことも可能です。Java IDE をセットアップする場合は、 このページ を確認してください。
コーディングを始める前にもうひとつ。ブログエンジンにはデータベースが必要です。開発目的のために play には HSQLDB と呼ばれるスタンドアロンの SQL データベース管理システムが付属しています。より堅牢なデータベースが必要になって切り替える前までは、これが開発を開始するにはベストな方法です。インメモリデータベースか、またはアプリケーションを再起動してもデータを保持するファイルシステムデータベースのいずれかを選ぶこともできます。
初めのうちは、アプリケーションモデルを何度もテストし、変更します。このため、常にフレッシュなデータセットで起動するインメモリデータベースはより良い方法です。
データベースを設定するためには、 conf/application.conf
ファイルを開き、次の行のコメントを外します:
db.default.driver=org.h2.Driver
db.default.url="jdbc:h2:mem:play"
どのような JDBC 対応データベースについても、そしてコネクションプールの設定すらも容易に構成することができますが、今はここまでにしておきます。加えて、Ebean を有効にする必要があるので、次の行を非コメント化します:
ebean.default="models.*"
§バージョン管理システム (VCS) を使った変更管理
プロジェクトに従事する場合、ソースコードをバージョン管理システム (VCS) に保存することを強くお勧めします。VCS は、変更が何かを壊した場合に以前のバージョンに戻ることや、複数人で作業すること、そしてアプリケーションの連続したバージョンすべてにアクセスすることを可能にします。もちろん、プロジェクトを保存するには、どのような VCS を使用することができますが、ここでは例として Git を使用します。Git は分散バージョン管理システムで、Play には Play アプリケーションを Git リポジトリ内で構成するサポートが組み込まれています。
Git のインストールはこのチュートリアルの範囲を超えていますが、どのようなシステム上においても非常に簡単です。Git をインストールしたら、zentasks ディレクトリに戻り、以下をタイプしてアプリケーションのバージョン管理を初期化してください:
$ git init
これでリポジトリに対するルートディレクトリが作成されます。Play が既に無視するファイルの適切なリストを含む .gitignore
ファイルを自動的に生成しているので、無視するファイルについて心配する必要はありません:
$ git add .
最後に変更をコミットします:
$ git commit -m "ZenTasks initial commit":
最初のバージョンがコミットされ、プロジェクトのための信頼できる基盤ができました。
次章 に進みましょう
このドキュメントの翻訳は Play チームによってメンテナンスされているものではありません。 間違いを見つけた場合、このページのソースコードを ここ で確認することができます。 ドキュメントガイドライン を読んで、お気軽にプルリクエストを送ってください。