ユーザーとのやりとりを行う方法で最も一般的なフォームを作成してみる。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というファイルがあるのので、その中に記載する。