§フォームの送信
§フォームの定義
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;
}
}
2.0.2 以降、validate
メソッドは次の型を返すことができます: String
, List<ValidationError>
or Map<String,List<ValidationError>>
§バインドエラーの処理
バリデーションを定義するということは、一方でバインドエラーを処理しなければならないということです。
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()
などのメソッドを呼び出すと、新しいデータで埋められた新しいオブジェクトが返ります。
§モデルと関連しないフォームの処理
Model
と関連しない html フォームからデータを取得する必要がある場合、DynamicForm
を使うことができます:
public static Result hello(){
DynamicForm requestData = form().bindFromRequest();
String firstname = requestData.get("firstname");
String lastname = requestData.get("lastname");
return ok("Hello " + firstname + " " + lastname);
}
§独自の 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");
}
});
次ページ: フォームテンプレートヘルパーを利用する