Documentation

You are viewing the documentation for the 2.1.x release series. The latest stable release series is 2.4.x.

§フォームの送信

§フォームの定義

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");
    }
  
});

次ページ: フォームテンプレートヘルパーを利用する


このドキュメントの翻訳は Play チームによってメンテナンスされているものではありません。 間違いを見つけた場合、このページのソースコードを ここ で確認することができます。 ドキュメントガイドライン を読んで、お気軽にプルリクエストを送ってください。