Documentation

You are viewing the documentation for the 2.2.x release series. The latest stable release series is 2.4.x.

§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 タスク

stagedist タスク は、ネイティブパッケージプラグイン を使うために完全に見直されました。

ネイティブパッケージを使う利点は、いつもの zip ファイルに加えて、例えば tar.gz, RPM, OS X ディスクイメージ, Microsoft インストーラ (MSI) など多くの種類のアーカイブがサポートされていることです。さらに、Play 用の Windows バッチスクリプトが Unix のものと同様に提供されるようになりました。

より詳しい情報は、ドキュメント スタンドアローン版のアプリケーションを作成する で読むことができます。

§組み込みの gzip サポート

Play は、すべてのレスポンスの gzip 圧縮を組み込みでサポートするようになりました。これを有効にする方法については、gzip エンコードの設定 を参照してください。


このドキュメントの翻訳は Play チームによってメンテナンスされているものではありません。 間違いを見つけた場合、このページのソースコードを ここ で確認することができます。 ドキュメントガイドライン を読んで、お気軽にプルリクエストを送ってください。