テンプレートで処理をする
ここでは、コントローラーに用意したアクションメソッドで必要な処理を行い、表示をさせましたが、実は別のやり方もあります。コントローラーではなく、テンプレートで処理を行わせるというものです。実際にやってみましょう。まず、コントローラーのindexメソッドを修正しましょう。
public static void index(String val) {
render(val);
}
ご覧のとおり、引数に渡された値をそのままrenderの引数に指定して呼び出しているだけです。それ以外には何もしていません。では、続いてindex.htmlのテンプレートを修正します。
#{extends 'main.html' /}
#{set title:'Home' /}
<div>${val ? ('こんにちは、' + val + 'さん!') : 'お名前をどうぞ。'}</div>
<form method="post" action="@{Application.index}">
<input type="text" name="val" />
<input type="submit" value="送信" />
</form>
<div>タグの部分が変わっているのが分かるでしょうか。ここでは、${val ? 値 : 値 }という形で書かれていることが分かります。そう、Javaでおなじみの三項演算子です。このように、テンプレートでは渡された値に応じて簡単な表示の変更などを行わせることができます。
では、もっと複雑な処理をテンプレートでさせたい場合は? 実は、ちゃんとできるのです。例えば今の例であれば、次のような形で記述することも可能です。
#{extends 'main.html' /}
#{set title:'Home' /}
%{
if (val == null){
msg = 'お名前をどうぞ。'
} else {
msg = 'こんにちは、' + val + 'さん!'
}
}%
<div>&{msg}</div>
<form method="post" action="@{Application.index}">
<input type="text" name="val" />
<input type="submit" value="送信" />
</form>
ここでは、%{}%内に実行するコードがそのまま書かれています。これを実行すると、ここに書かれた処理を実行し、表示するメッセージを変数msgに設定します。後は、実際にメッセージを表示する<div>タグに&{msg}と記述して、msgの値を出力させるだけです。このように、Play!では、コントローラーだけでなく、テンプレート内でもそれなりの処理を行いながら表示を作成していくことができます。
ところで、この%{}%内に記述されたコードは、Javaのようですが、完全なJavaのコードではないことに気がついたでしょうか。テキストリテラルはシングルクォートですし、文の終わりを示すセミコロンもありません。実を言えば、ここで書かれているのは、Javaではなく、Groovyのソースコードなのです。Play!にはGroovyが同梱されており、テンプレートなどに記述するスクリプトに利用しているのです。
バリデーションを設定する
多くのWebアプリケーションでは、送信された値をただ利用するのでなく、必要な値が渡されたかどうかをチェックする処理を用意します。「バリデーション」と呼ばれるものです。Play!には、基本的なバリデーション機能が用意されており、それを利用することで簡単に値のチェックを行うことができます。
例として「0~100までの整数を入力すると、その合計を表示する」というものを作ってみましょう。まずコントローラーのindexメソッドを修正します。
public static void index(int val) {
validation.min(val, 0);
validation.max(val, 100);
int total = 0;
for(int i = 0;i <= val;i++)
total += i;
String msg = "合計:" + total;
render(msg);
}
ここでは、「validation」というインスタンスにある「min」「max」といったメソッドを呼び出しています。このvalidationはControllerクラスに用意されているstaticフィールドで、play.data.validation.Validationクラスのインスタンスが設定されています。この中に値のバリデーションに関する機能がまとめられています。今回使ったmin/maxは、第1引数の値をチェックし、それが第2引数の最小値・最大値を超えていないかを調べるものです。
では、バリデーションチェックの結果の表示はどこで行っているのでしょうか。今回は、テンプレート側で表示させることにしましょう。index.htmlを次のように書き換えます。
#{extends 'main.html' /}
#{set title:'Home' /}
#{ifErrors}
<ol>※問題が発生しました。</ol>
#{errors}
<li>${error}</li>
#{/errors}
#{/ifErrors}
#{else}
<div>${msg}</div>
#{/else}
<form method="post" action="@{Application.index}">
<input type="text" name="val" />
<input type="submit" value="送信" />
</form>
これでできました。入力フィールドに0~100の値を入力して送信すると、その合計が表示されます。ここでは、#{ifErrors}~#{/ifErrors}という間に、エラー時の処理を記述しています。この中で、更に#{errors}~#{/errors}というものがあり、その中に${error}があります。これは、#{errors}で発生したすべてのエラーについて繰り返し処理を行っており、その中の${error}でエラーメッセージが表示されているのです。
#{/ifErrors}の後には、#{else}~#{/else}という記述があります。これは、その前の#{ifErrors}が実行されない(つまりエラーが発生していない)場合に、この部分が出力されます。
テンプレートで使えるタグを使うことで、このようにエラーの処理を行うことができます。コントローラー側ではバリデーション後の処理などを何も考えずに済む、というわけです。

