§フォームの送信
§フォームの定義
play.data
パッケージには HTTP フォームデータの送信とバリデーションを行うヘルパがいくつか含まれています。フォーム送信を処理する最も簡単な方法は、既存のクラスをラップする play.data.Form
オブジェクトを定義することです。
public class User {
public String email;
public String password;
}
Form<User> userForm = form(User.class);
ノート: 内部で行われる値のバインディングには Spring data binder が使われています。
このフォームは HashMap<String,String>
型のデータから User
の値を生成することができます。
Map<String,String> anyData = new HashMap();
anyData.put("email", "[email protected]");
anyData.put("password", "secret");
User user = userForm.bind(anyData).get();
スコープ内にリクエストが存在する場合は、リクエストの内容から直接バインドすることができます。
User user = userForm.bindFromRequest().get();
§制約の定義
JSR-303 (Bean バリデーション) アノテーションを使って、バインディング時にチェックされる制約を追加することができます。
public class User {
@Required
public String email;
public String password;
}
Tip:
play.data.validation.Constraints
クラスには組み込みのバリデーションアノテーションがいくつか含まれています。
トップオブジェクトに validate
メソッドを追加することで、アドホックなバリデーションを定義することもできます。
public class User {
@Required
public String email;
public String password;
public String validate() {
if(authenticate(email,password) == null) {
return "Invalid email or password";
}
return null;
}
}
§バインドエラーの処理
バリデーションを定義するということは、一方でバインドエラーを処理しなければならないということです。
if(userForm.hasErrors()) {
return badRequest(form.render(userForm));
} else {
User user = userForm.get();
return ok("Got user " + user);
}
§フォームに初期値を設定する
よくあるケースとして、編集などのためにフォームに予め値を設定したい場合は、以下のようにします。
userForm = userForm.fill(new User("[email protected]", "secret"))
Tip:
Form
オブジェクトはイミュータブルです。つまり、bind()
やfill()
などのメソッドを呼び出すと、新しいデータで埋められた新しいオブジェクトが返ります。
§独自の DataBinder を登録する
独自オブジェクトからフォームのフィールド、またはその逆方向のマッピングを定義したいときは、そのオブジェクトのために新たなフォーマッタを登録する必要があります。例えば、JodaTime の LocalTime
オブジェクトのためのフォーマッタを登録する場合は、次のようなコードになります。
Formatters.register(LocalTime.class, new SimpleFormatter<LocalTime>() {
private Pattern timePattern = Pattern.compile(
"([012]?\\\\d)(?:[\\\\s:\\\\._\\\\-]+([0-5]\\\\d))?"
);
@Override
public LocalTime parse(String input, Locale l) throws ParseException {
Matcher m = timePattern.matcher(input);
if (!m.find()) throw new ParseException("No valid Input",0);
int hour = Integer.valueOf(m.group(1));
int min = m.group(2) == null ? 0 : Integer.valueOf(m.group(2));
return new LocalTime(hour, min);
}
@Override
public String print(LocalTime localTime, Locale l) {
return localTime.toString("HH:mm");
}
});
次ページ: フォームテンプレートヘルパーを利用する
このドキュメントの翻訳は Play チームによってメンテナンスされているものではありません。 間違いを見つけた場合、このページのソースコードを ここ で確認することができます。 ドキュメントガイドライン を読んで、お気軽にプルリクエストを送ってください。