Play Frameworkのサンプルコードでプロジェクトの流れを理解する方法
生徒
「先生、Play Frameworkで作ったプロジェクトの動きがまだよくわかりません。」
先生
「それなら、サンプルコードを使ってプロジェクト全体の流れを確認すると理解しやすいです。」
生徒
「サンプルコードって具体的に何をすればいいんですか?」
先生
「簡単なコントローラとビューを作って、ブラウザで確認するだけで、リクエストからレスポンスまでの流れを体験できます。」
1. サンプルコントローラを作成する
まずは、app/controllers ディレクトリに、いちばん最初の入り口となるシンプルなコントローラを作成してみましょう。コントローラは、ブラウザから送られてくるWebリクエストを受け取り、「どんな処理をして、何を返すのか」を決める部分です。ここがしっかりイメージできると、Play Frameworkのプロジェクト全体の流れも理解しやすくなります。
package controllers
import javax.inject._
import play.api.mvc._
// HomeController はアプリの「入り口」になるコントローラ
@Singleton
class HomeController @Inject()(
val controllerComponents: ControllerComponents
) extends BaseController {
// "/" にアクセスされたときに実行される処理のイメージ
def index() = Action { implicit request: Request[AnyContent] =>
// ここでブラウザに返すメッセージを作っている
Ok("Hello, Play Framework!")
}
}
このサンプルでは、HomeController というクラスの中に indexアクション を用意しています。ブラウザから「トップページを見せて」といったリクエストが来たときに、この index() が呼び出され、「Hello, Play Framework!」というテキストをレスポンスとして返す、というイメージです。
@Singleton や @Inject() といった記述は、Play Frameworkが内部でコントローラを管理しやすくするための“おまじない”のようなものだと思っておけば大丈夫です。初心者のうちは「とりあえずこの形で書けば動く」と覚えておき、慣れてきたら依存性注入(DI)といったキーワードを調べていくと理解が深まります。
初心者向け:このコントローラで何が分かる?
この短いコードだけでも、Play Frameworkの基本的な動きが体験できます。
- ブラウザのアクセス先(URL)に応じて、どのメソッドが呼ばれるかを決められること
- サーバー側で文字列などのレスポンスを作成し、ブラウザに返していること
- 「コントローラがリクエストを受け取り、レスポンスを返す」というWebアプリの基本的な役割
この段階では、難しいことを意識する必要はありません。「ブラウザからのリクエストが来たら、この index メソッドが動いて、文字列を返しているんだな」という流れだけつかめれば十分です。次のステップでルーティング設定を行うことで、このコントローラが実際にブラウザから呼び出されるようになります。
2. ルーティング設定を確認する
作成したコントローラを実際にブラウザから呼び出すためには、「どのURLにアクセスされたら、どのメソッドを実行するか」を紐づける設定が必要です。この橋渡し役をしてくれるのが ルーティング(routes) です。Play Frameworkでは、conf/routes ファイルにその対応関係を1行ずつ書いていきます。
まずは、トップページにアクセスしたときに先ほどの HomeController.index が動くよう、次の1行を追記してみましょう。
GET / controllers.HomeController.index
この1行には、それぞれ次の意味があります。
- GET:ブラウザからのHTTPメソッド(「ページを取得する」という意味のGET)
- /:アクセスするパス(URLパス)。ここではトップページを表します
- controllers.HomeController.index:呼び出したいコントローラとアクション名
初心者向け:ルーティングを身近な例でイメージする
ルーティングは、よく「案内係」や「受付表」にたとえられます。
- 「/」という入り口からお客さん(リクエスト)が来たら、HomeControllerのindexへ案内する
- 将来「/about」など別のURLを増やしたい場合も、routesに1行追加するだけで対応できる
ここまで設定できれば、ブラウザで http://localhost:9000 にアクセスしたときに、HomeControllerのindexアクション が呼び出され、「Hello, Play Framework!」というメッセージが返ってくるようになります。次のステップでは、このメッセージをビュー(HTMLテンプレート)に渡して、より見やすい画面として表示する方法を確認していきます。
3. ビューを使ってHTMLを表示する
次は、コントローラで作ったメッセージを「きちんとしたWebページ」として表示してみましょう。そのために使うのが、Play Frameworkのテンプレートエンジンである Twirl(トゥワール) です。Twirlは、普通のHTMLの中に少しだけプログラムの記述を混ぜることができる仕組みで、Playのビュー(画面表示部分)を作るときに必ず登場します。
まずは、app/views/index.scala.html というファイルを作成し、次のような内容を書いてみましょう。
@(message: String)
<!DOCTYPE html>
<html>
<head>
<title>Play Framework Sample</title>
</head>
<body>
<h1>@message</h1>
</body>
</html>
最初の @(message: String) という1行は、「このビューは message という名前の文字列を受け取ります」という宣言です。コントローラから渡された値は、HTML内で @message のように書くことで、実際の文字列に置き換えられます。上の例では <h1> の中に @message を書いているので、ブラウザには見出しとしてメッセージが表示されるイメージです。
続いて、先ほど作成したコントローラを、ビューを呼び出す形に少しだけ書き換えます。
def index() = Action { implicit request: Request[AnyContent] =>
// ビューに表示させたいメッセージを用意して渡す
Ok(views.html.index("Hello, Play Framework with View!"))
}
ここでは、views.html.index(...) が先ほどの index.scala.html を指しており、引数として渡した文字列 "Hello, Play Framework with View!" が、そのまま @message の中身としてHTMLに埋め込まれます。つまり、
- コントローラ:表示したいメッセージを用意する
- ビュー(Twirl):受け取ったメッセージをHTMLの好きな場所に差し込んで画面を作る
という役割分担になっている、と考えると分かりやすくなります。
初心者向け:ビューを使うと何がうれしい?
このステップでは、単に文字列を返すのではなく「HTMLとして見やすいページを返す」ことを体験できます。
- 画面の見た目(HTML)はビュー側にまとめられるので、デザインの変更がしやすい
- コントローラは「どのデータを渡すか」に集中でき、役割がはっきり分かれる
- メッセージの内容を変えるだけで、同じレイアウトのページを何度でも使い回せる
ブラウザからアクセスすると、これまでと同じURLでも、今度は「ただのテキスト」ではなく、ビューを通したHTMLページが表示されます。ここまでできれば、リクエスト → コントローラ → ビュー → HTMLレスポンス という、Webアプリケーションの一連の流れがかなり具体的にイメージできるはずです。
4. 開発サーバーで動作確認する
プロジェクトの流れを確認するには、sbtを使って開発サーバーを起動します。
sbt run
起動後、ブラウザで http://localhost:9000 にアクセスすると、コントローラとビューの動作が確認できます。リクエストが送られ、コントローラが処理し、ビューがHTMLとしてレスポンスを返す、という基本の流れを理解できます。
5. プロジェクト全体の流れを理解するメリット
サンプルコードを使ってプロジェクトの流れを確認することで、以下のことが学べます:
- Play Frameworkのリクエストとレスポンスの流れ
- コントローラとビューの役割
- ルーティング設定の重要性
- ブラウザでの確認方法
初心者が最初にこの流れを理解することで、複雑なWebアプリケーションを作る際にも迷わずに開発を進められるようになります。
まとめ
この記事では、Play Frameworkのプロジェクト構成を理解するために、サンプルコントローラの作成方法、ルーティング設定、ビューを使ったHTML表示、そして開発サーバーを使った動作確認までの流れを丁寧に見てきました。とくに、リクエストからレスポンスまでの一連の仕組みを体験できる点は、初心者にとって大きな学びとなります。
Webアプリケーション開発では、コントローラがどのようにリクエストを受け取り、ビューへどのようにデータを渡し、どのタイミングでHTMLが生成されるのか、という具体的な流れを把握することはとても重要です。この理解によってPlay Frameworkの特徴や動作の仕組みが自然に掴めるようになります。
また、ルーティング設定がどれだけ重要なのかも実際に試すことで明確になります。「ブラウザでURLへアクセスすると、どのメソッドが呼ばれ、何が返ってくるのか」というリンクがつながることで、フレームワーク全体の動作がより立体的に理解できます。
さらに、Twirlテンプレートを使ったビューの生成は、HTML出力をPlay Frameworkらしい形で習得するうえで欠かせません。アプリケーション開発を続けるうちに、ビューとコントローラ間のデータ受け渡しや、複雑な画面構築にも応用できる土台が形成されます。
以下に、記事の流れを踏まえた簡単なサンプルコードを再掲します。記事内で扱った内容を定着させるための振り返りとして役立ててください。
サンプルコントローラの再確認
package controllers
import javax.inject._
import play.api.mvc._
@Singleton
class SampleController @Inject()(val controllerComponents: ControllerComponents) extends BaseController {
def sample() = Action { implicit request: Request[AnyContent] =>
Ok(views.html.index("サンプルメッセージをPlay Frameworkで表示しています"))
}
}
ルーティングの再確認
GET /sample controllers.SampleController.sample
ビューの再確認
@(message: String)
<!DOCTYPE html>
<html>
<head>
<title>Play Framework Sample View</title>
</head>
<body>
<h1>@message</h1>
</body>
</html>
これらのサンプルコードを通して、Play Frameworkの基本的な仕組みを再確認し、どのように開発が進むのかを自然に理解できるようになります。プロジェクト全体を俯瞰しながら構築していくことは、効率的で迷いのない開発につながります。実際に手を動かしながら試すことで、さらに深い理解が得られるでしょう。
生徒
「先生、今日の内容でPlay Frameworkの仕組みがずいぶんわかってきました。」
先生
「それは良いですね。リクエストとレスポンスの流れが理解できると、Webアプリケーション開発がとても楽になりますよ。」
生徒
「コントローラで処理してビューへ渡す動きや、ルーティングの大事さがやっとつながりました。」
先生
「その調子です。今後はもっと複雑な画面や処理も作れるようになりますから、今日の流れをしっかり覚えておきましょう。」
生徒
「はい!次はフォーム入力やデータベース連携にも挑戦してみたいです。」
先生
「もちろんです。基礎ができれば応用はさらに理解しやすくなりますよ。」