カテゴリ: Play Framework 更新日: 2026/02/07

Play Frameworkのビューでフォームを表示する方法を徹底解説!Twirlテンプレートの基本

ビューでフォームを表示する方法
ビューでフォームを表示する方法

先生と生徒の会話形式で理解しよう

生徒

「Play Frameworkでユーザーが入力するお問い合わせフォームや登録画面を作りたいのですが、ビューではどのように記述すればいいですか?」

先生

「Play FrameworkのビューエンジンであるTwirl(トワール)では、HTMLのフォームタグをそのまま書くこともできますし、フレームワークが提供する便利なヘルパー機能を使ってスマートに書くこともできるんですよ。」

生徒

「普通のHTMLと何が違うんですか?」

先生

「一番のメリットは、コントローラ側で定義したJavaのフォームオブジェクトと簡単に連携できる点です。それでは、具体的な作り方を順番に見ていきましょう!」

1. フォーム表示の基本概念

1. フォーム表示の基本概念
1. フォーム表示の基本概念

Webアプリケーションにおいて、ユーザーからの入力を受け取るフォーム(Form)は非常に重要な要素です。 Play Frameworkのビュー(Twirlテンプレート)では、Javaのコントローラから渡されたフォーム情報を元に、入力項目やエラーメッセージを動的に表示します。

一般的な開発の流れとしては、まずJava側で「入力項目をまとめたクラス」を用意し、それをビューに渡して表示させます。 これにより、入力値の自動保持やバリデーション(入力チェック)結果の表示がスムーズに行えるようになります。

2. Javaでのフォーム用データクラスの準備

2. Javaでのフォーム用データクラスの準備
2. Javaでのフォーム用データクラスの準備

ビューでフォームを表示する前に、まずはJava側で受け皿となるデータクラスを作成します。 初心者の方でも分かりやすいように、シンプルな「ユーザー登録」を例に考えてみましょう。


package models;

import play.data.validation.Constraints;

public class UserFormData {
    @Constraints.Required
    public String name;

    @Constraints.Email
    public String email;

    public String comment;
}

このクラスのフィールド(nameやemail)が、HTMLフォーム内の各入力項目(inputタグ)に対応することになります。 @Constraints.Required などの注釈を付けることで、必須入力などのルールを定義できます。

3. コントローラでフォームをビューに渡す

3. コントローラでフォームをビューに渡す
3. コントローラでフォームをビューに渡す

次に、Javaのコントローラでこのフォームオブジェクトを初期化し、ビューへレンダリングします。 Play Frameworkでは FormFactory というツールを使って、先ほど作ったクラスをフォーム形式に変換します。


package controllers;

import play.mvc.*;
import play.data.Form;
import play.data.FormFactory;
import javax.inject.Inject;
import models.UserFormData;

public class UserController extends Controller {
    @Inject
    FormFactory formFactory;

    public Result showForm() {
        // 空のフォームオブジェクトを作成
        Form<UserFormData> userForm = formFactory.form(UserFormData.class);
        // ビューにフォームを渡す
        return ok(views.html.userView.render(userForm));
    }
}

render(userForm) とすることで、テンプレート側でこのフォーム情報を利用できるようになります。

4. Twirlビューでのフォーム記述方法

4. Twirlビューでのフォーム記述方法
4. Twirlビューでのフォーム記述方法

いよいよ本題のビュー(テンプレート)側の記述です。 ファイル名の先頭で、コントローラから渡された Form 型の引数を受け取る宣言をします。


@(userForm: Form[models.UserFormData])

@import helper._

<!DOCTYPE html>
<html>
<head>
    <title>ユーザー登録フォーム</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css">
</head>
<body class="container mt-5">
    <h2 class="mb-4">ユーザー情報の入力</h2>

    @helper.form(action = routes.UserController.showForm()) {
        <div class="mb-3">
            @helper.inputText(userForm("name"), '_label -> "お名前", 'class -> "form-control")
        </div>
        <div class="mb-3">
            @helper.inputText(userForm("email"), '_label -> "メールアドレス", 'type -> "email", 'class -> "form-control")
        </div>
        <div class="mb-3">
            @helper.textarea(userForm("comment"), '_label -> "備考", 'class -> "form-control")
        </div>
        <button type="submit" class="btn btn-primary">送信する</button>
    }
</body>
</html>

@helper.form は、適切な action 属性と method="POST" 属性を持つformタグを自動生成してくれます。 また、@helper.inputText を使うと、ラベルや入力エラー時の表示もまとめて処理してくれるため、非常に便利です。

5. フォームヘルパーが生成するHTMLの構造

5. フォームヘルパーが生成するHTMLの構造
5. フォームヘルパーが生成するHTMLの構造

Twirlのヘルパーを使うと、実際にブラウザには以下のようなHTMLが出力されます。 手書きで書く手間が省けるだけでなく、BootstrapなどのCSSフレームワークと相性の良い構造になっています。


<form action="/user/show" method="POST">
    <dl id="name_field">
        <dt><label for="name">お名前</label></dt>
        <dd><input type="text" id="name" name="name" value="" class="form-control"></dd>
    </dl>
    <!-- 他の項目も続く -->
</form>

このように、dl, dt, dd タグを使って構成されるのがPlayのデフォルトの挙動です。 もしデザインをより細かくカスタマイズしたい場合は、独自のフィールドコンストラクターを作成することも可能ですが、まずはこの基本形を覚えるのが近道です。

6. CSRF対策(セキュリティ設定)

6. CSRF対策(セキュリティ設定)
6. CSRF対策(セキュリティ設定)

Play Frameworkでは、セキュリティ対策としてCSRF(クロスサイトリクエストフォージェリ)攻撃を防ぐ仕組みが標準で備わっています。 フォームを送信する場合、この設定を有効にしていると、フォーム内にトークン(秘密の合言葉)を埋め込む必要があります。

Twirlのヘルパーを使っている場合、以下の一行をフォーム内に追加するだけで対応完了です。


@helper.form(action = routes.UserController.submit()) {
    @CSRF.formField
    @* ... 入力項目 ... *@
}

これだけで、目に見えない hidden 属性の入力項目が追加され、安全にデータを送信できるようになります。

7. セレクトボックスやラジオボタンの表示

7. セレクトボックスやラジオボタンの表示
7. セレクトボックスやラジオボタンの表示

テキスト入力以外にも、選択肢から選ぶセレクトボックスやラジオボタンも頻繁に使われます。 これらも専用のヘルパーで簡単に記述できます。


@helper.select(
    userForm("gender"),
    options = Seq("M" -> "男性", "F" -> "女性"),
    '_label -> "性別",
    '_default -> "-- 選択してください --"
)

@helper.inputRadioGroup(
    userForm("pref"),
    options = Seq("1" -> "東京", "2" -> "大阪"),
    '_label -> "お住まい"
)

options には、Javaの MapList を渡すこともできるため、データベースから取得したマスターデータをそのまま選択肢に反映させることが可能です。

8. エラーメッセージの表示制御

8. エラーメッセージの表示制御
8. エラーメッセージの表示制御

ユーザーが誤った入力をした際、フォームヘルパーは自動的にエラーメッセージを表示してくれます。 しかし、時には特定の位置にまとめてエラーを出したいこともあります。

そのような場合は、userForm.hasErrorsuserForm.errors を使うことで、独自のエラー表示エリアを作ることができます。


@if(userForm.hasErrors) {
    <div class="alert alert-danger">
        入力内容に不備があります。修正してください。
    </div>
}

このように、Java側でのバリデーション結果をビューで柔軟に扱えるのが、Play Frameworkの大きな魅力です。

9. 静的なHTMLとヘルパーの使い分け

9. 静的なHTMLとヘルパーの使い分け
9. 静的なHTMLとヘルパーの使い分け

「必ずしもヘルパーを使わないといけないの?」という疑問を持つ方もいるでしょう。 結論から言えば、普通のHTMLタグ(<input>など)を書いても全く問題ありません。

特にデザインが非常に複雑で、ヘルパーが生成するHTML(dlタグなど)が邪魔になる場合は、手書きの方が制御しやすいこともあります。 その際は、name 属性をJavaのクラスのフィールド名と一致させることだけ忘れないようにしましょう。 そうすれば、送信されたデータは正しくJava側で受け取ることができます。

10. フォーム作成のコツとまとめ

10. フォーム作成のコツとまとめ
10. フォーム作成のコツとまとめ

Play Frameworkでのフォーム作成は、「Java側のモデル定義」「ビュー側での受け取り宣言」の連携が肝心です。 まずはシンプルなテキスト入力から始め、徐々にセレクトボックスやバリデーションを追加して、慣れていくのが良いでしょう。

Twirlテンプレートの強力なヘルパー機能を使いこなせば、安全で使いやすい入力画面を短時間で構築できるようになります。 今回学んだ基本を活かして、ぜひ素敵なユーザーインターフェースを作ってみてくださいね!

カテゴリの一覧へ
新着記事
New1
Jakarta EE
Jakarta EEとクラウドネイティブ開発の相性とは?初心者向けにわかりやすく解説
New2
Jakarta EE
JakartaEE JSPのリクエスト属性とスコープの基本を徹底解説!初心者向け入門ガイド
New3
Play Framework
Play Frameworkのビューテストを徹底解説!Twirlテンプレートの品質を高める方法
New4
Jakarta EE
JakartaEE フィルタで認証と認可を実装する方法を初心者向けに解説!サーブレットのセキュリティ入門
人気記事
No.1
Java&Spring記事人気No1
Jakarta EE
Jakarta EEとSpringの比較|どちらを選ぶべきか?初心者向けに徹底解説!
No.2
Java&Spring記事人気No2
Play Framework
Play Frameworkのビューを共通化!テンプレート間のインクルード方法を徹底解説
No.3
Java&Spring記事人気No3
Play Framework
Play Frameworkプロジェクト作成直後にやるべき初期設定ガイド!初心者でも安心
No.4
Java&Spring記事人気No4
Play Framework
Play Frameworkで多言語対応(i18n)を徹底解説!Twirlテンプレートでの使い方
No.5
Java&Spring記事人気No5
Jakarta EE
Jakarta サーブレットのHttpServletRequestを徹底解説!初心者でもわかる基本操作と使い方
No.6
Java&Spring記事人気No6
Jakarta EE
Jakarta EEの標準仕様とAPI一覧を完全解説!初心者でもわかるエンタープライズJavaの基本
No.7
Java&Spring記事人気No7
Jakarta EE
Jakarta EEとJava EEアプリの互換性を完全解説!移行で困らないための基礎知識
No.8
Java&Spring記事人気No8
Play Framework
Play FrameworkでCSSやJavaScriptを読み込む方法を徹底解説!静的リソースの組み込みガイド