ユーザーとのやりとりを行う方法で最も一般的なフォームを作成してみる。Playには「フォームヘルパー」と呼ばれる機能がある。これは、フォームの値を一元的に管理することができる。

View(@helper.formの使い方)

@helper.form(~~~)がフォームを生成している。これはhelperと呼ばれるパッケージからオブジェクトを生成してる。

<form>タグの生成

@helper.form( 属性の指定 ) { フォームのコントロール類を記述 }

属性の指定には、本来であれば属性の指定を送信先のアドレスを指定する。helperの場合は、routes.Contoller.methodというような送信先のActionメソッドを指定する。 そうすることによってActionに送信されるフォームが完成する。

例:通常

@helper.form(action = routes.HomeController.send) {
        @(helper.inputText (
            field = form("message")
        ))

        <input type="submit">
    }

上記では、テキストエリアを表示するだけのシンプルなフォームを作成することができる。

3行目でfield = form(“message”)

という記述がされているが、これはフォームに割り当てられるフィールドを示すものである。また、fieldを省略することも可能である。

例:省略系

@helper.form(action = routes.HomeController.send) {
        @(helper.inputText (
            form("message")
        ))

        <input type="submit">
    }

Controller

Injectアノテーションを使用してFormFactoryというフォームを作成してくれる

フォームからの情報を受け取る

フォームから飛ばされてきた情報を受け取る方法を示す。これをしないと、フォームから投げられた情報を使うことができない。

//  HomeController.java

package controllers;

import com.google.inject.Inject;

import play.data.Form;
import play.data.FormFactory;
import play.mvc.Controller;
import play.mvc.Result;

import views.html.*;

public class HomeController extends Controller {
    @Inject
    FormFactory formFactory;

    public static class SampleForm {
        public String message;
    }

    public Result index() {
        return ok(index.render("何か書いてください",
                         formFactory.form(SampleForm.class)));
    }

    public Result send() {
        Form<SampleForm> f = formFactory.form(SampleForm.class).
                                                  bindFromRequest();
        if (!f.hasErrors()) {
            SampleForm data = f.get();
            String msg = data.message;

            return ok(index.render(msg, f));
        } else {
            return badRequest(index.render("Error", 
                                       formFactory.form(SampleForm.class)));
        }
    }
}

投げられてきたフォームの情報は25行目のbindFromRequestで受け取っている。これは送信されたフォームの値をバインドしたFormインスタンスを返すもの。ここではformFactory.form(SampleForm)に記載してある通りにSampleFormインスタンスのpublicフィールドに保管される。 これで、fにSampleFormインスタンス情報を保持させることができた。あとは、これをチェックして必要な値を取り出し処理をしていく。

26行目のif文では、取得したフォームをhasErrorsメソッドでチェックしている。これは、何らかのエラーをチェックするメソッドで、特に入力値のバリデーションで使用するものである。このhasErrorsメソッドは、何かを取得したら使用し、エラーがなければ何か行いたい処理を行わせる方が安全である。

飛んできた情報を取得するために27行目でgetメソッドを使用している。これを利用することでフォームで飛んできた情報を取得することができる。

if文でエラーが発生した場合には、badRequestというメソッドを使用している。これは、何かエラーや問題が発生した際のResultを返すものなので、エラーが発生した場合には、okで返すのではなくbadRequestを返すと覚えておけば良い。

ルーティングの設定

最後に、ルーティングというものをさせないとコンパイルエラーになる。

GET     /send           packageName.controller.send

これは、/sendがGET送信を取得し、その後の処理をpackageName.controller.sendで行うということを意味している。よく忘れるものなので、忘れずに記載しておくこと。プロジェクトファイル直下のconfファイル内にreoutesというファイルがあるのので、その中に記載する。

今すぐシェアしよう!
今すぐシェアしよう!