h1. Play 1.0.2 — リリースノート

**Play 1.0.2** は play 1.0 ブランチのメンテナンスリリースです。主な新機能は、モジュールリポジトリのサポートと、組込みの CSRF 攻撃対策です。大量の小さなバグも修正されています。

p(note). **Play 1.0.2** はメンテナンスリリースであり、バージョン 1.0 シリーズとの完全な互換性があります。何か問題にぶつかったら "Google Group":http://groups.google.com/group/play-framework にて質問してください。

"1.0.2 ロードマップページ":http://www.playframework.org/roadmap/1.0.2 にて、修正されたバグについて読むことができます。もっとも重要な変更は、このページにてハイライトされています。

h2. <a>Module repository</a>

モジュールリポジトリのゴールは、Play フレームワークの寄贈されたモジュールを集約して、簡単にインストールできるようにすることです。以下は、モジュールに関連する新しいコマンドです:

* @play list-modules@, リポジトリの内容を一覧します。
* @play install@, モジュールの特定のバージョンをローカルにインストールします。
* @play new-module@, 新規モジュールのスケルトンを作成します。
* @play build-module@, モジュールをパッケージし、リポジトリに公開します。

ほとんどすべてのモジュールが削除されていることに気付くかと思います。すぐに利用できるのは、一連の ‘中心的な’ モジュール: testrunner, docviewer, crud そして secure だけです。

その他のモジュールはオプションです。このため、例えば GWT サポートをインストールしたい場合は、単に @play install gwt@ とタイプして、このモジュールの最新バージョンを取得します。

なぜモジュールを移動したのでしょうか? それは、フレームワークの核となる部分に集中する必要があり、プロジェクト管理をシンプルにする必要があるからです。また、多くの人がいくつかの寄贈されたモジュールを欲しがっており、これは次のやり方で容易に行うことができます: それぞれのモジュールは、専用の管理者を持つスタンドアロンのプロジェクトとするのです。このため、モジュールに特化したバグを報告する際は、そのプロジェクトのホームページと専用のバグトラッカを使用してください。

即座に得られる利点として、これ以降、モジュールのライフサイクルはフレームワークのライフサイクルに縛られなくなります。モジュールは、フレームワークそのものよりも高い頻度でリリースすることができます。そして最後に、フレームワークにはオプションモジュールを一切含めないので、Play の配布サイズは半分になります。

モジュールリポジトリに関する詳細は "専用のページ":modules を読んでください。

h2. <a>組込みのクロスサイトリクエストフォージェリ対策</a>

CSRF は、ウェブアプリケーションにおいて真の問題になる場合があります:

bq. この攻撃手法は、ユーザが認証されていると信じている web アプリケーションにアクセスするページに悪意あるコードかリンクを含めることで実行されます。この web アプリケーションのセッションがタイムアウトされていない場合、攻撃者は認証されていない命令を実行できる場合があります。

この攻撃を防ぐために最初にすることは、GET と POST メソッドを適切に使用することです。これは、アプリケーションの状態を変更に使用されるのは POST メソッドだけであるべきということを意味します。

POST リクエストをセキュアで重要なアクションとして適切に保証する唯一の方法は、認証トークンを発行することです。現在の Play 1.0.2 にはこれを扱う組み込みのヘルパがあります:

* 新しい @checkAuthenticity()@ メソッドがコントローラで利用可能であり、これはリクエストパラメータ中に有効な認証トークンが存在するかどうかチェックし、何かが正しくない場合は、認証不可のレスポンスを送信します
* @session.getAuthenticityToken()@ は、現在のセッションにおいてのみ有効な認証トークンを生成します
* @#{authenticityToken /}@ は、どのようなフォームにも加えることができる hidden 入力フィールドを作成します

例えば、以下のようにすると:

bc. public static destroyMyAccount() {
    checkAuthenticity();
    …
}

適切な認証トークンを含むフォームから呼ばれた場合にのみ動作します:

bc. #{form @ destroyMyAccount()}
    #{authenticityToken /}
    <input type="submit" value="destroy my account">
#{/form}

もちろん、コントローラ階層におけるすべてのアクションを保護したい場合は、これを事前フィルタとして追加することができます。より詳しくは "セキュリティガイド":security を読んでください。

h2. <a>デフォルトで HEAD メソッドをサポート</a>

Play は、GET メソッド用のルートが存在する場合、自動的に HEAD リクエストに応答します。これは、HTTP RFC によって、いかなるリソースも HEAD リクエストに同様に応答することが求められているからです。

"http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html":http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html 

bq. HEAD メソッドは、サーバがレスポンスにおいてメッセージボディを返してはならない事を除けば GET と同一である。HEAD リクエストへのレスポンスにおける HTTP ヘッダに含まれる外部情報は、GET リクエストへのレスポンスで送られる情報と同一であるべきである。このメソッドは、エンティティボディ自身を転送する事なしにリクエストによって意味されるエンティティに付いての外部情報を得るために使用される。このメソッドは、ハイパーテキストリンクの正当性、アクセス可能性、最近の修正のテストのために、しばしば使用される。

このため、いかなる HEAD リクエストもアクションメソッドを起動しますが、レスポンスの内容はクライアントに送信されません。もちろん、HEAD リクエストに応答するカスタムルートを routes ファイルに追加することで特化することも可能です。例えば、以下のようにします:

bc. GET     /orders/{id}         Orders.show
HEAD    /orders/{id}         Orders.showHead

h2. <a>新しいサンプルアプリケーション、‘zencontact’</a>

"Wicket ベースの連絡先管理アプリケーション":http://blog.zenika.com/index.php?post/2009/03/10/Concours-Developper-une-application-web-en-Wicket3 の移植版である新しいサンプルです。興味がある人のために、Scala モジュールパッケージには、このアプリケーションの Scala 版が含まれています。

!images/zencontact!

h2. <a>アプリケーションサーバへのより良いデプロイ</a>

複数のアプリケーションサーバで、play が生成する WAR アーカイブのデプロイをテストしました。現在の "互換性マトリクス":deployment を確認することができます。

|| JBoss 4.2.x || JBoss 5.x || JBoss 6M2 || Glasshfish v3 || IBM Websphere 6.1 ||IBM Websphere 7 || Geronimo 2.x || Tomcat 6.x || Jetty 7.x || Resin 4.0.5 ||
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |  ✓ | ✓  |


h2. <a>テンプレートにおける新しいリバース機能</a>

アクションの **絶対** URL を生成する <code>@@</code> 構文をタグのパラメータとして利用することができます。例えば、以下のようにします:

bc. #{form @@save()}
…
#{/}

これは、URL を絶対形式で表現する必要のある email のようなものを生成するためにテンプレートエンジンを使用する場合に便利です。

複雑なオブジェクトのバインディングもサポートしました。このため、例えば次のようなアクションがあったとして:	

bc. public static void search(SearchParams params) {
    …
}

SearchParams が以下のような場合:

bc. public class SearchParams {
    public String keywords;
    public String mode;
}

テンプレートに次のように書くことができます:

bc. @{search(params)}

これは、次のような、クエリ文字列に複数の値を含む URL を生成します:

bc. /search?params.keywords=xxxx&params.mode=AND

h2. <a>アプリケーション JavaDoc を生成する新しいコマンド</a>

以下を使って、プロジェクトの **JavaDoc** を容易に生成することができます:

bc. play javadoc 

このコマンドはプロジェクトと、プロジェクトが使うモジュールの javadoc API ドキュメントを生成します。

h2. <a>今回のリリースでも Eclipse プラグインはさらに良くなります</a>

Eclipse プラグインには、いくつかの新機能があります:

* コンテンツアシスタント、不明なアクションの検出とハイパーリンクを備えた高度な routes ファイルエディタ
* コンテンツアシスタントとハイパーリンクを備えた高度なテンプレートファイルエディタ
* 新規コントローラ、モデルおよびテンプレートを作成するためのウィザード
* (組込みの web ブラウザを使った) テストランナーの統合

!images/route-completion!

!images/eclipse-tests!

このプラグインをインストールするには、 @$PLAY_HOME/support/eclipse@ から @$ECLIPSE_HOME/dropins@ に JAR ファイルをコピーしてください。

p(note). 次のリリース: %(next)"Play 1.0.3 リリースノート":releasenotes-1.0.3%
