Play framework の概要
Play framework は、肥大化したエンタープライズ Java を代替する洗練されたフレームワークです。開発者の生産性に注目し、RESTful アーキテクチャを目指します。Play は アジャイルソフトウェア開発 のための完璧なガイドです。
Play framework のゴールは Java による Web アプリケーション開発を容易にすることです。これをどのようにして達成するのかを見ていきましょう。
コードを見てみたいですか?
Play でできる 5 つのすごいこと を確認するか、いきなり hello world チュートリアル を始めてみてください。
痛みの伴わない Java フレームワーク
Play は純粋な Java フレームワークであり、あなた好みのツールやライブラリで開発を続けることができます。開発プラットフォームとして既に Java を使用しているのならば、別の言語や IDE、ライブラリに切り替える必要はありません。 もっと生産的な Java 開発環境に切り替えるだけです!
バグを直してリロード
web アプリケーションの開発生産性が低いことで悪名高い Java EE プラットフォームですが、その主な原因は何度もくり返される退屈なコンパイル-パッケージング-デプロイのサイクルです。
そこで我々は Play による開発プロセスが効率的になるよう開発サイクルを見直しました。
play フレームワークは Java のソースコードを直接コンパイルし、サーバを再起動する必要なしに JVM へ動的にリロードします。ちょうど LAMP や Rails のように、コードを編集してリロードすれば直ちに変更点を見ることができます。
お望みであれば、フル機能の Java IDE を使わなくてもシンプルなテキストエディタさえあれば作業できます。これはとても楽しいことです。
どのようなエラーが発生した場合でも、フレームワークはできる限り問題の原因を特定して表示します。
スタックトレースからは余分な情報が取り除かれ、より簡単に問題を解決できるよう最適化されています。テンプレートの実行についても、いかに Java スタックトレースとうまく統合されているか見てみてください。
シンプルなステートレス MVC アーキテクチャ
一方にはデータベースがあり、もう一方には Web ブラウザがあります。これらの間で状態を保持すべきなのでしょうか?
ステートフルでコンポーネントベースの Java Web フレームワークは、自動的にページの状態を保持するのを容易にしますが、他に多くの問題をもたらします: ユーザがふたつ目のウィンドウを開いたら何が起こるでしょう? ブラウザの戻るボタンを押したら?
Share Nothing アーキテクチャは、PHP に始まり、Ruby on Rails や Django など数多くの Web フレームワークで奨励されています。ブラウザがどんどん強力になっていくにつれて、今や Ajax やオフラインストレージを使って、クライアントサイドで状態保持の問題を解決することが容易になっています。
もう Web に紛い物の状態を再構築するために HTTP モデルをハックする必要はありません。‘share nothing’ には、画面の部品を同時にレンダリングすることや、画面の一部を更新 (または段階的に表示する) ことを容易にする側面もあります。
HTTP-コードマッピング
もしあなたが Servlet API や Strtus のような Java の Web フレームワークを使っているならば、HTTP プロトコルを Java の奇妙な API やコンセプトで抽象化したビューを使ってきたことになります。私たちは違う考え方をします。Web アプリケーションフレームワークは HTTP とそのコンセプトに対して完全かつ容易なアクセス手段を提供すべきです。これが Play とその他の Java web フレームワークの根本的な違いです。
HTTP, Request/Response パターン, REST アーキテクチャ, content-type ネゴシエーション, URI はいずれも Play framework の主要な概念です。
例えば、URI パターンと Java の呼び出しの紐付けはたった一行です:
GET /clients/{id} Clients.show
もし日々の web 開発で Ajax や REST, Web ページ間の戻る/進むといった問題の管理に直面しているのであれば、是非 Play を試してみてください。
効率的なテンプレートエンジン
私たちは JSP と式言語の考え方を気に入っています。しかし、なぜタグライブラリを作成するのに大量の設定ファイルが必要なのでしょうか? なぜ表示元となるオブジェクトモデルに完全にアクセスできないのでしょう? JSP には多くの制限があり、フラストレーションが募ります。これが、我々が JSP の影響を受け、JSP のような制約のないテンプレートエンジンを作成した理由です!
このような書き方にはみんなもう飽き飽きなはずです:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<c:choose>
<c:when test="${emails.unread != null && fn:size(emails.unread)}">
You have ${fn:size(emails.unread)} unread email(s)!
</c:when>
<c:otherwise>
You have no unread emails!
</c:otherwise>
</c:choose>
こんな書き方のほうが気に入ると思います:
You have ${emails.unread ?: 'no'} ${emails.unread?.pluralize('email')} !
Play のテンプレートエンジンで使用する式言語は Java の構文と一貫性を持つ Groovy です。Play は主に HTML レスポンスをレンダリングするためにテンプレートシステムを使用しますが、email メッセージや JSON レスポンスなどのドキュメントを生成するのにも使えます。
強化された JPA
Java Persistence API (JPA) は、Java で利用できる、もっともきれいなオブジェクト-リレーショナルマッピング (ORM) API です。もし JPA を知っているなら、Play で JPA がいとも簡単に利用できることに驚くでしょう。なんの設定も無しに Play は自動的に JPA のエンティティマネージャを起動し、コードがリロードされたときはまるで魔法のように同期を行います。
さらに、スーパークラス play.db.jpa.Model
を使うことでコードをよりきれいにすることもできます。こんな感じです:
public static void messages(int page) {
User connectedUser = User.find("byEmail", connected()).first();
List<Message> messages = Message.find(
"user = ? and read = false order by date desc",
connectedUser
).from(page * 10).fetch(10);
render(connectedUser, messages);
}
テスト駆動開発 (お好みで)
組み込みのテストランナーは テスト駆動開発 による作業を容易にします。シンプルなユニットテストから完全な受入テストまで、あらゆる種類のテストを記述し、Selenium を使用してブラウザでこれらを実行することができます。コードのカバレッジ率も計測されます。
フルスタック・アプリケーションフレームワーク
Play framework は我々自身の Java アプリケーションから閃きを得ていました。Play は最近の web アプリケーションを作成するのに必要な、以下に示す全てのツールを備えています:
- JDBC を介したリレーショナルデータベースのサポート
- (JPA API と共に) Hibernate を利用したオブジェクト-リレーショナルマッピング
- 必要に応じて分散 memchashed システムを簡単に使える組み込みキャッシュサポート
- JSON または XML による簡単な web サービス利用 (SOAP のようなガラクタではない、 本当 の web サービスの話です)
- 分散認証のための OpenID サポート
- どこ (アプリケーションサーバ, Google App Engine, Cloud, その他...) にでもデプロイできる web アプリケーション
- イメージ操作 API
モジュールアーキテクチャは、色々なものを web アプリケーションに組み込むことを可能にします。アプリケーションモジュール のおかげで、Java コードやテンプレート、そして (JavaScript や CSS ファイルなどの) 静的なリソースを簡単に再利用する事ができます。
やってみよう
Play framework をインストール して最初のアプリケーション開発を始めてみましょう。