🔗
Play Framework+Scala レシピ #3 ─ パラメータ付きルートで “Hello, Alice” を返す
0. ウォームアップ — プロジェクトを起動しておく
cd play-samples/play-scala-hello-world-tutorial
sbt run # 前回からターミナルを残しているなら不要
起動済みのまま ソース保存 ⇒ ホットリロード で進めます。
ターミナルを止めてしまった人は再度 run
してください。
1. コントローラを拡張 — 動的テキストを返す
app/controllers/HelloController.scala
を開き、次のメソッドを 追記 します。
package controllers
import javax.inject._
import play.api.mvc._
@Singleton
class HelloController @Inject()(cc: ControllerComponents)
extends AbstractController(cc) {
// 既存の hello メソッドはそのまま
/** パスパラメータ name を受け取り動的文字列を返す */
def greet(name: String) = Action { implicit request: Request[AnyContent] =>
Ok(s"Hello, $name!")
}
}
行 | 役目 |
---|---|
def greet(name: String) |
文字列パラメータ name を関数引数で受け取る |
Ok(s"...") |
Play の Result 生成ヘルパー。s" で 文字列補間
|
2. routes に パラメータ付き エンドポイントを 1 行追加
conf/routes を開き、ファイル末尾に次を追加して保存します。
# --- ここから追加 ---
GET /hello/:name controllers.HelloController.greet(name: String)
3. ブラウザ / curl で動作確認
curl http://localhost:9000/hello/Alice
# Hello, Alice!
curl http://localhost:9000/hello/Bob
# Hello, Bob!
4. HTML ビュー版も作ってみよう(おまけ)
同じパラメータを Twirl テンプレート に渡して HTML を返す手順です。
4-1. テンプレートを追加
app/views/greet.scala.html
を新規作成。
@(name: String)
@main("Greeting") {
<h1>Hello, @name!</h1>
}
4-2. Controller に HTML 用メソッドを追加
def greetHtml(name: String) = Action { implicit request =>
Ok(views.html.greet(name))
}
4-3. routes に登録
GET /hello/html/:name controllers.HelloController.greetHtml(name: String)
保存すると再コンパイル。
ブラウザ http://localhost:9000/hello/html/Play で「Hello, Play!」の HTML 版 が表示されれば成功です。
5. よくあるつまずき Q&A
症状 | チェックポイント |
---|---|
404 が返る |
routes 保存し忘れ / 行末の空行不足 / URL タイポ |
500 or コンパイルエラー | Scala ファイル名・クラス名一致? greet メソッドの引数と routes の型が一致? |
日本語パラメータが文字化け | URL エンコード必須:/hello/%E3%81%82%E3%81%84%E3%81%86
|
再コンパイルが遅い | sbt シェルで ~run を使うとファイル変更検知が高速 |
6. まとめ 🎯
-
パスパラメータ は
/foo/:bar
+def action(bar: String)
の組み合わせで簡単 - テキスト・JSON・HTML 返却のどれも
Ok(...)
で統一インターフェース - ホットリロードなので 保存→ブラウザ更新 の開発ループが超高速
これで 「固定文字列レスポンス」→「動的レスポンス」 へ一歩前進しました。
次回は フォーム POST を受け取り、バリデーションして JSON を返す ところまで掘り下げる予定です。
Enjoy Play & Happy Coding! 🔗💥
Discussion