§Play 2.2 の変更点
§Java と Scala の新しい構造の Result
これまで Result は、同期または非同期、全体またはチャンクのいずれかの形を取っていました。これら異なる種類のすべてを取り扱うことは、アクション合成およびフィルタの実装を難しくしていました。多くの場合、ある機能はすべての種類の Result に適用しなければならないのですが、非同期 Result を再帰的に同期 Result に戻すよう実装し、また Result 全体およびチャンクされた Result に同じロジックを適用する必要があるためです。
Play における非同期アクションと同期アクションの間に、Play が同期または非同期モードで動作できるかのような気にさせて、混乱を招く、不自然な区別も作ってしまいました。実際のところ、Play は 100% 非同期であり、例えば IO のような他の非同期アクションが、アクションの処理中に完了する必要があるかによって、Result を非同期に返却するか、そうしないかを区別します。
そこで、Java と Scala における Result の構造を単純化しました。いまはただひとつ、SimpleResult
型の Result があるのみです。依然として Result
スーパークラスは様々な場所で動作しますが、非推奨とします。
この単純化は、リクエストの処理中に非同期処理を行いたい場合、Scala アプリケーションでは以下のように async
アクションビルダーを使うことができる一方で、Java アプリケーションでは単純に Promise<SimpleResult>
を返すことができるようになることを意味しています:
def index = Action.async {
val foo: Future[Foo] = getFoo()
foo.map(f => Ok(foo))
}
§バッファリングおよび keep alive 制御の改善
Play がどのように、そしていつ Result をバッファリングするかは、HttpConnection
型の connection
という新しいプロパティを持つ SimpleResult
という Scala API でより良く表現されるようになりました。
これに Close
を設定した場合、ボディを一度送信するとレスポンスはクローズされ、バッファリングされません。KeepAlive
を設定すると、Play は HTTP 仕様に従い、転送エンコーディングまたはコンテント長が指定されていない場合に限り、コネクションをキープし、レスポンスをバッファリングしようと試みます。
§新しいアクション合成とアクションビルダーメソッド
アクションのスタックをより強力に作ることのできる、Scala アプリケーション用の ActionBuilder
トレイトを提供しています:
object MyAction extends ActionBuilder[AuthenticatedRequest] {
def invokeBlock[A](request: Request[A], block: (AuthenticatedRequest[A]) => Future[SimpleResult]) = {
// アクションを認証し、リクエストを認証済みのものにラップする
getUserFromRequest(request).map { user =>
block(new AuthenticatedRequest(user, request))
} getOrElse Future.successful(Forbidden)
}
// ロギングアクション、CSRF チェックアクション、そして HTTPS のみ許容するアクションでアクションを組み立てる
def composeAction[A](action: Action[A]) =
LoggingAction(CheckCSRF(OnlyHttpsAction(action)))
}
アクションビルダーの処理結果は、オプションのパーサとリクエストパラメータ、そして非同期なバリアントを伴った、組み込みの Action
のように扱うことができます。アクションに渡されるリクエストパラメータの型は、ビルダーで指定された型、上記例の場合は AuthenticatedRequest
になります:
def save(id: String) MyAction(parse.formUrlEncoded) = { request =>
Ok("User " + request.user + " saved " + request.body)
}
§Java promise API の改良
Java Promise クラスは、その機能を Scala の Future および Promise により近づけることを目的として改良されました。特に、Promise のメソッドに実行コンテキストを渡せるようになりました。
§コンテキストを渡した Iteratee ライブラリの実行
Iteratee, Enumeratee そして Enumarator のメソッドを呼ぶ際には、実行コンテキストが必要になります。Iteratee ライブラリに実行コンテキストを見せることは、実行箇所におけるよりきめ細やかな制御を提供し、またいくつかの場面においてはパフォーマンスの向上につながります。
実行コンテキストは暗黙的に渡すことができるので、Iteratee を使うコードへの影響はほとんどありません。
§sbt 0.13 サポート
いくつかのユーザビリティ、そしてパフォーマンスが改善されます。
ユーザビリティの改善のひとつとして、例えば samples/java/helloworld/build.sbt
のような Play プロジェクトをビルドする build.sbt
ファイルをサポートするようになりました:
import play.Project._
name := "helloworld"
version := "1.0"
playJavaSettings
Java プロジェクトには playJavaSettings
の宣言が必要になります。同様に、Play の Scala プロジェクトには playScalaSettings
が存在しています。この新しいビルド設定のサンプルについては、サンプルプロジェクトを確認してください。play.Project
を使った build.scala を使用している以前のメソッドも、引き続きサポートされます。
sbt 0.13 における変更点のさらなる詳細については、sbt の リリースノート を参照してください。
§新しい stage と dist タスク
stage と dist タスク は、ネイティブパッケージプラグイン を使うために完全に見直されました。
ネイティブパッケージを使う利点は、いつもの zip ファイルに加えて、例えば tar.gz, RPM, OS X ディスクイメージ, Microsoft インストーラ (MSI) など多くの種類のアーカイブがサポートされていることです。さらに、Play 用の Windows バッチスクリプトが Unix のものと同様に提供されるようになりました。
より詳しい情報は、ドキュメント スタンドアローン版のアプリケーションを作成する で読むことができます。
§組み込みの gzip サポート
Play は、すべてのレスポンスの gzip 圧縮を組み込みでサポートするようになりました。これを有効にする方法については、gzip エンコードの設定 を参照してください。