Play Frameworkでコントローラからビューを呼び出す流れを完全ガイド!
生徒
「Play Frameworkで、画面を表示させる仕組みが知りたいです。コントローラで作ったデータを、どうやってHTMLに渡すんですか?」
先生
「Play Frameworkでは、MVCモデルという考え方を使います。コントローラが橋渡し役になって、ビュー(HTMLテンプレート)を呼び出すんですよ。」
生徒
「難しそうに聞こえますが、初心者でも簡単に書けますか?」
先生
「はい、テンプレートエンジンのおかげで直感的に書けます。それでは、基本的な流れを詳しく見ていきましょう!」
1. MVCモデルにおけるコントローラの役割
Play Frameworkは、MVC(モデル・ビュー・コントローラ)という設計パターンを採用しています。画面を表示する際、主役となるのが「コントローラ」です。コントローラは、ユーザーからのリクエストを受け取り、必要なデータを準備して、最終的に「ビュー(画面)」を表示する命令を出します。
プログラミング初心者の方には、レストランの「ウェイター」を想像してもらうと分かりやすいでしょう。お客さん(ユーザー)から注文(リクエスト)を受け、厨房(モデル)から料理(データ)を運び、最後にお皿に盛り付けてテーブル(ビュー)に届ける。この「盛り付けて届ける」作業が、今回学習するコントローラからビューを呼び出すという処理にあたります。
2. ビュー(Twirlテンプレート)の基本構造
Play Frameworkでは、Twirl(トワール)というテンプレートエンジンを使用してビューを作成します。ファイル拡張子は .scala.html ですが、中身は普通のHTMLに少し特別な記法を加えたものです。Javaエンジニアにとっても馴染みやすい設計になっています。
まず、データを表示するための受け皿となるHTMLファイルを作成します。ファイルは app/views ディレクトリに配置するのが基本ルールです。以下のコードは、タイトルとメッセージを表示するためのシンプルなビューの例です。
@(title: String, message: String)
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>@title</title>
</head>
<body>
<h1>@title</h1>
<p>@message</p>
</body>
</html>
1行目の @(title: String, message: String) は、この画面を表示するために必要なデータのリスト(引数)を定義しています。HTMLの中で @ をつけると、コントローラから渡された変数を表示することができます。これが動的なWebページ作成の第一歩です。
3. コントローラからビューを呼び出すJavaコード
次に、Javaのコントローラ側でこのビューを呼び出す方法を見てみましょう。Play Frameworkでは、作成した index.scala.html は、ビルド時に自動的に views.html.index というJavaのクラスとして扱えるようになります。
コントローラ内のメソッド(アクション)で render() メソッドを呼び出し、引数にデータを渡すことで、HTMLを生成してユーザーに返却します。非常にシンプルですね。
package controllers;
import play.mvc.*;
import views.html.*; // ビューを読み込むためのインポート
public class HomeController extends Controller {
public Result index() {
// 表示したいデータを準備する
String pageTitle = "マイアプリ";
String welcomeMsg = "Play Frameworkへようこそ!";
// views.html.index.render() でビューを呼び出す
// 引数の順番は .scala.html の1行目と同じにする
return ok(index.render(pageTitle, welcomeMsg));
}
}
ここで使っている ok() は、HTTPステータスコード 200(成功)を返すためのメソッドです。index.render(...) で生成されたHTMLが、ブラウザに届くことになります。
4. ルーティングの設定を確認しよう
コントローラとビューの準備ができたら、最後に「どのURLにアクセスしたら、どのコントローラのメソッドを動かすか」を決める設定が必要です。これが conf/routes ファイルの役割です。
初心者の方は、ここを書き忘れて「ページが見つかりません(404 Not Found)」というエラーになりがちなので注意しましょう。以下のように記述します。
# URLのパス | コントローラ名.メソッド名
GET /welcome controllers.HomeController.index()
ブラウザで http://localhost:9000/welcome にアクセスすると、HomeController の index メソッドが実行され、最終的にHTMLが表示されます。これが一連のリクエストとレスポンスの流れです。
5. リスト(複数のデータ)をビューに渡す方法
実際の開発では、単一の文字列だけでなく、商品のリストやユーザーの一覧など、複数のデータを渡したいことが多いですよね。その場合は、Javaの List を使います。Play FrameworkはJavaのコレクションをそのまま扱うことができるので、非常に強力です。
まずは、リストを受け取るようにビューを書き換えます。
@(items: List[String])
<ul>
@for(item <- items) {
<li>@item</li>
}
</ul>
次に、コントローラでリストを作成して渡します。Java標準の ArrayList などを使ってデータを準備するだけです。
package controllers;
import play.mvc.*;
import java.util.ArrayList;
import java.util.List;
import views.html.*;
public class ItemController extends Controller {
public Result listItems() {
// リストを生成
List<String> shoppingList = new ArrayList<>();
shoppingList.add("コーヒー豆");
shoppingList.add("ペーパーフィルター");
shoppingList.add("マグカップ");
// ビューにリストを渡して呼び出す
return ok(itemlist.render(shoppingList));
}
}
6. 型の安全性とコンパイルチェック
Play Frameworkの大きな特徴の一つは、タイプセーフ(型安全)であることです。もしコントローラから渡すデータの型がビューで定義したものと違っていたり、引数の数が足りなかったりすると、ブラウザを表示する前(コンパイル時)にエラーとして教えてくれます。
他のWebフレームワークでは「画面を開いてみたらエラーで真っ白だった」ということがよくありますが、Playでは開発ツール(sbtなど)が即座に間違いを指摘してくれるため、バグの少ない開発が可能です。初心者にとって、どこが間違っているかすぐ分かるこの仕組みは、学習をスムーズに進める助けになります。
7. ビューへのデータ受け渡しのコツ
コントローラからビューへデータを渡す際、あまりにも多くの引数(20個も30個も)を渡すのはおすすめしません。管理が大変になるからです。関連するデータは一つの「クラス(モデル)」としてまとめてから渡すのが、綺麗なコードを書くコツです。
例えば、ユーザー名、年齢、住所を個別に渡すのではなく、 User というクラスを作って、そのオブジェクトを一つだけビューに渡すようにします。これにより、プロジェクトのディレクトリ構成が整理され、後から見返したときにも分かりやすいプログラムになります。こうした設計の工夫も、コントローラ入門の大切な要素です。
8. 共通レイアウトの活用
Webサイトには、ヘッダー(上のメニュー)やフッター(下の著作権表記)など、どのページでも共通の部分がありますよね。Play Frameworkでは、これを「共通レイアウト」として定義し、各ページで再利用することができます。
コントローラから呼び出す個別のビュー( index.scala.html など)の中で、共通レイアウト( main.scala.html )を呼び出すように記述します。これにより、同じHTMLを何度も書く手間が省け、修正も一箇所で済むようになります。開発生産性を高めるために必須の知識です。
9. デバッグと画面確認
もし画面が思い通りに表示されないときは、コントローラで System.out.println() を使って、変数の値が正しくセットされているかコンソールで確認してみましょう。また、ブラウザの「開発者ツール(F12キー)」を使って、実際に生成されたHTMLソースコードをチェックするのも有効です。
Play Frameworkは「修正して保存したら、ブラウザをリロードするだけですぐに反映される」という非常に快適な開発環境を持っています。どんどんコードを書き換えて、コントローラからビューへデータが流れる様子を体感してみてください。基本さえマスターすれば、どんなに複雑なWebアプリケーションでも作れるようになりますよ!