Documentation

You are viewing the documentation for Play 1. The documentation for Play 2 is here.

Play 1.0.1 — リリースノート

Play 1.0.1 は Play 1.0 ブランチのメンテナンスリリースです。このリリースは大量の小さなバグを修正し、JPA オブジェクトのより良いバインディング、XSS セキュリティ問題を回避する HTML および Javascript コードの自動エスケープを提供します。

Play 1.0.1 はメンテナンスリリースであり、バージョン 1.0 との完全な互換性があります。何か問題にぶつかったら Google Group にて質問してください。

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

テンプレートにおける HTML コードの自動エスケープ

全ての動的な式は、アプリケーションにおける XSS セキュリティ問題を回避するために、テンプレートエンジンによってエスケープされます。このため、 <h1>Title</h1> を含む title 変数は、以下のようにエスケープされます:

${title} --> &lt;h1&gt;Title&lt;/h1&gt;

これらを本当にエスケープせずに表示したい場合は、 raw() メソッドを明示的に呼び出す必要があります:

${title.raw()} --> <h1>Title</h1>

素の HTML の大部分を表示したい場合は、 #{verbatim /} タグを使うこともできます:

#{verbatim}
    ${title} --> <h1>Title</h1>
#{/verbatim}

もちろん、この機能は既存のアプリケーションを壊してしまうかもしれないので、デフォルトでは有効ではありません。これは以下の行を application.conf ファイルに追加することで有効にすることができます:

future.escapeInTemplates=true

この行は、リリース 1.0.1 で作られた新規アプリケーションには追加されます。

@javax.inject.Inject サポート

Spring module モジュールで提供されるような DI コンテナを使っている場合、 @Inject アノテーションを使うことができます。この @Inject アノテーションは、定義された Java Beans をコントローラ、ジョブ、またはメーラに自動的にインジェクションします。このアノテーションは static フィールドに作用します。

例えば、Spring に定義された PriceWatcher サービスをコントローラにインジェクションするには、以下のようにするだけです:

public class Application extends Controller {
    
    @Inject
    static PriceWatcher prices;
    
    public static void index() {
        prices.getAll(); // prices is defined here
    }
    
}

自動リロードは期待通り動作するはずです。

JPA オブジェクトのより良いバインディング

以前は、HTTP を使って JPA オブジェクトを自動的に紐付ける方法はありませんでした。例えば:

public static void save(User user) {
    user.save(); // fail in 1.0
}

User は JPA エンティティクラスであり、user は Binder によって作成された一時的なオブジェクトで、まだ Hibernate によって管理されていないので、このコードは失敗します。

古いやり方は、以下のように edit() メソッドを使うものでした:

public static void save(Long id) {
    User user = User.findById(id);
    user.edit(params);
    user.save(); // ok
}

今では、HTTP パラメータに user.id フィールドを渡すことができます。Play は id フィールドを見つけると、HTTP パラメータを編集する前に、データベースからマッチするインスタンスをロードします。その後、HTTP リクエストの他のパラメータが適用されます。こうして、HTTP パラメータを直接保存することができます。

public static void save(User user) {
    user.save(); // ok with 1.0.1
}

もちろん、この機能は既存のアプリケーションを壊してしまうかもしれないので、デフォルトでは有効ではありません。これは以下の行を application.conf ファイルに追加することで有効にすることができます:

future.bindJPAObjects=true

この行は、リリース 1.0.1 で作られた新規アプリケーションには追加されます。

コマンドラインからのフレームワーク ID の設定

フレームワーク ID によって、同じ Play アプリケーションを異なる設定 (例えば dev, test, staging, production, など…) で実行することができます。

コマンドラインを使うことで、アプリケーションが使用する フレームワーク ID を指定することができます。例えば、アプリケーションを production モードで実行するには、以下のコマンドを:

play run --%production

以下の行を application.conf ファイルに定義して実行します:

application.mode=dev
%production.application.mode=prod

これは、フレームワーク id 情報を使用する全ての既存のコマンドと互換性があります。今でも、デフォルト ID は play id コマンドを使って定義します。

ちなみに play test は以下と等価です:

play run --%test

カスタムバリデーション

必要なバリデータを play.data.validation パッケージから探すことができませんか? 自分で書きましょう。一般的な @CheckWith アノテーションを使って、独自の Check 実装を紐付けることができます。

例:

public class User {
    
    @Required
    @CheckWith(MyPasswordCheck.class)
    public String password;
    
    static class MyPasswordCheck extends Check {
        
        public abstract boolean isSatisfied(Object user, Object password) {
            return notMatchPreviousPasswords(password);
        }
        
    }
}

テストランナーの更新

selenium をバージョン 1.0.1 final に更新し、UI を改良しました。Selenium テストは全画面で実行されます。さらに “Run all tests” のような新機能がいくつか追加されています。

アプリケーションを test モードで実行した場合、ローカルのドキュメントを利用することもできます。

HTML5 をデフォルトの doctype へ、そして JQuery を新規アプリケーションへ

新規アプリケーションにはデフォルトの HTML スケルトンが含まれます。以前、このスケルトンは XHTML 1.0 Transitional でフォーマットされた HTML でした。今では、デフォルトで HTML5 doctype となります:

<!DOCTYPE html>
 
<html>
    <head>
        <title>#{get 'title' /}</title>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <link rel="stylesheet" type="text/css" media="screen" href="@{'/public/stylesheets/main.css'}">
        #{get 'moreStyles' /}
        <link rel="shortcut icon" type="image/png" href="@{'/public/images/favicon.png'}">
        <script src="@{'/public/javascripts/jquery-1.3.2.min.js'}" type="text/javascript" charset="utf-8"></script>
        #{get 'moreScripts' /}
    </head>
    <body>
        #{doLayout /}
    </body>
</html>

これは単なるデフォルト設定であり、当然、お望みであればどのような doctype にも変更可能です。しかしながら、HTML5 は間違いなく次世代的であり、簡単です。

デフォルトテンプレートには JQuery Javascript ライブラリが含まれます。これは、モダンな web アプリケーションには優れた Javascript フレームワークが必要であり、かつ我々が JQuery を愛しているからです。こちらも単なるデフォルト設定であり、お望みのどんな Javascript ライブラリで置き換えることもできます。

ああ、そして、デフォルトテンプレートには追加のスクリプトと/またはスタイルを挿し込む 2 つのデフォルトのプレースホルダが含まれます。例えば、以下のようにしてビューに追加します:

#{set 'moreScripts'}
<script src="@{'/public/javascripts/gears_init.js'}" type="text/javascript">
</script>
#{/set}

これで、このビューにて gear Javascript ライブラリにアクセスすることができるようになります。

#{list} タグの改善

items パラメータはオプションとなり、デフォルトの arg 引数で置き換えることが可能です。

このため:

#{list items:users, as:'user'}
    <li>${user}</li>
#{/list}

を、以下のように書き換えることができます:

#{list users, as:'user'}
    <li>${user}</li>
#{/list}

as パラメータもまたオプションです。デフォルト変数名として _ を使用します:

#{list users}
    <li>${_}</li>
#{/list}

新しい #{jsAction /} タグ

この #{jsAction /} タグは、サーバ側で定義されたルートを Javascript 関数として取り込めるようにします。これは、自由な引数を使う AJAX によって URL を呼び出す必要がある場合に、とても便利です。

例を見てみましょう:

GET     /users/{id}        Users.show

このルートをクライアント側に取り込むことができます:

<script type="text/javascript">
    var showUserAction = #{jsAction @Users.show(':id')}
    
    var displayUserDetail = function(userId) {
        $('#userDetail').load( showUserAction({id: userId}) )
    }
</script>

見ての通り、自由な引数を定義するために :name 構文を使用します。可変引数と固定引数を一緒に使用することも可能です。この #{jsAction /} タグは Javascript 関数を出力します。この関数は全ての可変引数を定義する Javascript オブジェクトを引数として受け取ります。

新しいサンプルアプリケーション: ‘booking’

この 予約 アプリケーションは、有名な JBoss Seam フレームワークの予約アプリケーション を移植したものです。

この予約アプリケーションは、ステートレスなフレームワークを使って、クライアント側で RESTFul な方法で複雑な状態をどのように管理するかを示します。

Eclipse プラグインは順調です

Eclipse 専用プラグインを提供するためにがんばって作業しています。現状はアルファ版ですが、すでに利用可能です。このプラグインは Play インストールパスの support/eclipse ディレクトリにあります。

IntelliJ IDEA のサポート

今や Play フレームワークは、そのままで IntelliJ IDEA をサポートします!

Play アプリケーションを IntelliJ IDEA プロジェクトに変換するには、 idealize コマンドを使います:

# play idealize myApp

コンテキストメニューから実行やデバッグを行うことができます。

次のリリース: Play 1.0.2 リリースノート