Play Frameworkで変数をビューに渡す方法を完全ガイド!Twirlテンプレートの使い方
生徒
「Play Frameworkで作ったプログラムの中で計算した結果を、ブラウザの画面に表示したいのですが、どうすればいいですか?」
先生
「それには、コントローラで作った『変数』を『ビュー』という画面担当のファイルに渡してあげる必要があります。Play FrameworkではTwirl(トワール)というテンプレートエンジンを使って、とても簡単に実現できますよ。」
生徒
「変数を受け渡すための特別な決まりがあるんですか?」
先生
「はい、テンプレートの先頭で『どんなデータを受け取るか』を宣言するのがポイントです。具体的なやり方を一緒に見ていきましょう!」
1. 変数をビューに渡すとは?
Webアプリケーションの開発では、プログラム(Java)側で処理したデータ(ユーザー名、合計金額、最新のニュースなど)を、最終的にユーザーが目にする画面(HTML)に組み込む必要があります。これを変数の受け渡しと呼びます。
Play Frameworkでは、この橋渡しを非常に厳格、かつ安全に行う仕組みが備わっています。Java側からビューへデータを「引数」として渡すことで、動的なWebページが完成します。MVCモデルにおける「C(Controller)」から「V(View)」へのデータの流れを理解することが、Webアプリ開発の第一歩です。
2. ビュー側での受け取り宣言(パラメータ定義)
Twirlテンプレート(拡張子が .scala.html のファイル)で変数を受け取るには、ファイルの一番最初の行に「どんな名前で、どんな種類のデータを受け取るか」を記述しなければなりません。これを「パラメータ定義」と呼びます。
書き方は非常にシンプルで、@(名前: 型) のように記述します。例えば、文字列を受け取りたい場合は @(message: String) となります。この宣言を忘れると、Java側からデータを送っても「そんな変数は知らないよ」というエラーになってしまいます。
3. 文字列をビューに渡す最小構成のサンプル
まずは最も基本となる、一つの文字列を画面に表示させる例を見てみましょう。最初にビューファイルを作成します。
@(userName: String)
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>挨拶ページ</title>
</head>
<body>
<h1>こんにちは、@userName さん!</h1>
</body>
</html>
HTMLの中に変数を埋め込むときは、変数名の前に @(アットマーク) を付けるのがTwirlのルールです。次に、このビューを呼び出すJavaのコントローラを書きます。
package controllers;
import play.mvc.*;
import views.html.*;
public class UserController extends Controller {
public Result showWelcome() {
String name = "山田太郎";
// views.html.ファイル名.render(引数) でビューを呼び出す
return ok(views.html.index.render(name));
}
}
このように、render メソッドの括弧の中に渡したい変数を指定するだけで、JavaからHTMLへデータが送り届けられます。
4. 複数の変数を渡す方法
実際の開発では、名前だけでなく日付や数値など、複数の情報を同時に渡したい場面がほとんどです。その場合は、パラメータ定義をカンマ , で区切って記述します。
@(title: String, score: Integer, isPassed: Boolean)
<div>
<h2>@title</h2>
<p>点数: @score 点</p>
<p>結果: @if(isPassed){ 合格 } else { 不合格 }</p>
</div>
Javaのコントローラ側でも、定義した順番通りに値をセットして呼び出します。型が一致していないとコンパイルエラー(プログラムを実行する前のチェックでのエラー)になるため、バグを未然に防ぐことができます。
5. リスト(複数のデータ)を渡して繰り返し表示する
ニュースの一覧や商品のリストなど、同じ形式のデータを複数並べて表示したいときは、Javaの List などのコレクションを渡します。これには @for という構文を使います。
@(items: List[String])
<ul>
@for(item <- items) {
<li>@item</li>
}
</ul>
注意点として、Twirl内部ではScalaの型として扱うため、java.util.List を受け取る場合は List[String] のように大括弧を使います。Java側からの呼び出しは以下の通りです。
public Result showItems() {
java.util.List<String> shoppingList = java.util.Arrays.asList("リンゴ", "バナナ", "オレンジ");
return ok(views.html.itemlist.render(shoppingList));
}
6. 自作のクラス(モデル)を渡す方法
String型やInteger型といった基本的な型だけでなく、自分で作った「会員情報クラス(Userクラス)」なども渡せます。これにより、複雑なデータ構造もスッキリと扱うことが可能になります。
テンプレートの先頭で @(user: models.User) のように、パッケージ名を含めたフルネーム(完全修飾名)で型を指定するのがコツです。画面側では @user.getName() のようにして、クラスの中にあるメソッドを呼び出してデータを表示します。これにより、大規模な開発でもデータ管理が非常に楽になります。
7. 変数が見つからない場合のエラー解決
「変数が見つかりません(not found)」というエラーが出た場合、多くは「ビューのパラメータ定義」と「コントローラの引数」が一致していないことが原因です。以下の3点を確認しましょう。
- 綴り(スペル)は間違っていないか
- データの型(StringやIntegerなど)は合っているか
- 引数の数は同じか
Play Frameworkは型チェックが非常に強力なので、エラーが出たときは「安全なプログラムのためにパソコンが教えてくれている」と考えて修正に取り組みましょう。
8. デフォルト値やオプションの活用
時には「値がある時だけ表示したい」「値がなければ決まった文字を出したい」ということもあります。Java側で Optional を使って渡すこともできますが、ビュー側で簡単な条件分岐 @if(...) を使うことで、ユーザーに優しい画面作りができます。
例えば、ログインしている時だけ「ログアウト」ボタンを出す、といった制御もこの変数の受け渡しの応用で実現できます。コントローラから「ログイン状態」という真偽値(Boolean)を渡して、ビューで切り替えるのが一般的な手法です。
9. 変数受け渡しのセキュリティ(エスケープ)
Twirlの素晴らしい点は、渡された変数を表示する際に、自動的にHTMLエスケープをしてくれることです。もしユーザーが悪意のあるスクリプトを名前に混ぜて送ってきても、Twirlはそれをただの文字列として無害化して表示します。
特別な設定をしなくても、標準でセキュリティ対策が行われるため、初心者の方でも安心して動的なWebサイトを作ることができます。これが現代的なフレームワークであるPlay Frameworkを使う大きなメリットの一つです。
10. 表現豊かなビューを目指して
Javaの変数をビューに渡すことができれば、もう静的なHTMLだけのサイトではありません。ユーザーの操作やサーバーの状態に合わせて刻々と変化する、生きたWebサイトを作ることができます。今回学んだパラメータ定義と render メソッドの使い方をマスターして、自分だけの動的なページをどんどん作ってみてください!