libro
www.tuyano.com
初心者のためのPlay Framework入門

コントローラーとビュー[Java編] (4/4)

作成:2013-02-17 09:59
更新:2013-02-17 09:59

■Formクラスを使ったフォームの処理

では、Javaのコードを作成しましょう。まず最初に、フォームの値を管理するためのクラスを作成しましょう。今回は、formsパッケージを用意して、そこに「MyForm」というクラスとして作成することにします。

apps」フォルダの中に、「forms」というフォルダを新たに作成してください。そしてその中に、「MyForm.java」を用意し、下のリスト欄を参考にソースコードを記述します。MyFormクラスは、見ればわかるようにPOJOのクラスです。inputという名前のpublicなフィールドがあるだけですね。このように、保管する値はpublicなフィールドとして用意しておきます。

フォーム用のクラスが用意できたら、コントローラーの修正です。今回は、indexと、フォームを送信した時の処理を行うsendformの2つのアクションメソッドを用意してあります。それぞれフォームのための対応が必要となりますので、以下に整理しておきます。

・indexのフォーム関連
ここでは、フォームを管理する「Form」クラスのインスタンスを作成しています。以下の部分ですね。
Form<MyForm> form1 = new Form(MyForm.class);
Formは、見ればわかるように総称型を使ってクラスを指定するようになっています。これは、データの保管用に組み込まれるクラスです。先ほど作成したMyFormを利用しますので、Form<MyForm>という形で宣言をし、new Formする際にMyForm.classを引数に指定してやります。これで、フォームの値をMyFormで保管するFormインスタンスができあがります。

(※new Formでインスタンスを作成するのは、Play 2.1でのやり方です。2.0では、Formクラスのformメソッドを使い、「form(MyForm.class)」という形でインスタンスを作成していました。)

後は、renderする際に、このform1インスタンスを引数に渡すのを忘れないようにします。これにより、index.scala.html側のform1: Form[forms.MyForm]Formインスタンスが渡されることになります。

・sendformのフォーム処理
送信されたフォームの処理を行う場合、少しだけFormインスタンス作成の処理が違ってきます。new Formでインスタンスを作成したら、「bindFromRequest」というのを呼び出すのです。
Form<MyForm> form1 = new Form(MyForm.class).bindFromRequest();
このように処理が書かれていますね? これにより、作成されたFormインスタンスに、送信されたフォームの値がバインドされます。bindFromRequestは、フォームの値をForm内のMyFormに組み込んだインスタンスを返す働きをするメソッドです。

これで、フォームの値を保持したFormインスタンスができあがりました。ここからフォームの値を取り出したければ、「get」を呼び出します。
MyForm data = form1.get();
これで、FormからMyFormインスタンスが取り出されます。このMyFormの値を調べれば、フォームの値がわかるというわけです。

フォーム用のクラスというのを用意しないといけないのがちょっと面倒ですが、これによりフォームとコントローラーの間でデータを自然にやり取りできるようになります。Playでは、フォームヘルパーを利用した双樹が基本ですから、このやり方に慣れておきましょう。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

※MyForm.javaソースコード

package forms;

public class MyForm {
    public String input;
}


※Applicaiton.javaソースコード

package controllers;

import forms.*;
import play.*;
import play.mvc.*;
import play.data.*;
import views.html.*;

public class Application extends Controller {
    
    public static Result index() {
        String title = "Play Sample";
        String message = "何か書いてください。";
        Form<MyForm> form1 = new Form(MyForm.class);
        return ok(index.render(title, message, form1));
    }
    
    public static Result sendform() {
        Form<MyForm> form1 = new Form(MyForm.class).bindFromRequest();
        String title = "Play Sample";
        MyForm data = form1.get();
        String message = "あなたは、「" + data.input + "」と書きました。";
        return ok(index.render(title, message, form1));
    }
}


※routesの記述

GET     /           controllers.Application.index()
POST   /sendform   controllers.Application.sendform

※関連コンテンツ

「初心者のためのPlay Framework入門」に戻る