Documentation

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

§Gönderilen formları karşılamak

§Bir form tanımlamak

play.data paketi HTTP form verisi göndermek ve doğrulamak için birçok yardımcı içerir. Form gönderimini karşılamak için en kolay yol mevcut bir sınıfı sarmalayan bir play.data.Form tanımlamaktır:

public class User {
    public String email;
    public String password;
}
Form<User> userForm = Form.form(User.class);

Not: Altında yatan bağlamalar Spring data binder kullanılarak yapılmıştır.

Bu form HashMap<String,String> verisinden bir User sonuç değeri üretebilir:

Map<String,String> anyData = new HashMap();
anyData.put("email", "[email protected]");
anyData.put("password", "secret");

User user = userForm.bind(anyData).get();

Kapsam içinde mevcut bir isteğiniz varsa, istek içeriğini doğrudan bir nesneye bağlayabilirsiniz:

User user = userForm.bindFromRequest().get();

§Kısıtlamalar tanımlamak

JSR-303 (Bean Validation) annotation’ları kullanarak bağlama sürecinde kontrol edilecek ilave kısıtlamalar tanımlayabilirsiniz:

public class User {

    @Required
    public String email;
    public String password;
}

İpucu: play.data.validation.Constraints sınıfı halihazırda birçok doğrulama annotation’ları içerir.

Ayrıca üst nesnenize bir validate metodu ekleyerek özel doğrulama da tanımlayabilirsiniz:

public class User {

    @Constraints.Required
    public String email;
    public String password;

    public String validate() {
        if (authenticate(email, password) == null) {
            return "Invalid email or password";
        }
        return null;
    }
}

Yukarıdaki örneğte döndürülen mesaj global bir hata olacak.

validate-metodu şu türleri döndürebilir: String, List<ValidationError> veya Map<String,List<ValidationError>>.

validatemetodu annotation tabanlı kısıtlamalar denetlendikten sonra, ancak ve ancak onlar geçerse çağrılır. Eğer doğrulama geçerse null döndürmek zorundasınız. Herhangi bir nullolmayan değer döndürmeye (boş string veya boş list) başarısız bir doğrulama olarak davranılır.

List<ValidationError> alanlar için ilave doğrulamalara sahipseniz yararlı olabilir. Örneğin:

public List<ValidationError> validate() {
    List<ValidationError> errors = new ArrayList<ValidationError>();
    if (User.byEmail(email) != null) {
        errors.add(new ValidationError("email", "This e-mail is already registered."));
    }
    return errors.isEmpty() ? null : errors;
}

Map<String,List<ValidationError>> kullanmak, map’in anahtarlarını hata kodları olacak şekilde, yukarıdaki örnekte emailda olduğu gibi List<ValidationError>a benzerdir.

§Bağlama hatalarını idare etmek

Tabii ki eğer kısıtlamalar tanımlarsanız, bağlama hatalarını idare edebilmeniz gerekir.

if (userForm.hasErrors()) {
    return badRequest(views.html.form.render(userForm));
} else {
    User user = userForm.get();
    return ok("Got user " + user);
}

Genellikle, yukarda gösterildiği gibi, form basitçe bir şablona geçirilir. Global hatalar aşağıdaki şekilde sunulabilir:

@if(form.hasGlobalErrors) {
    <p class="error">
        @form.globalError.message
    </p>
}

Belirli bir alan için hatalar aşağıdaki biçimde sunulabilir:

@for(error <- form("email").errors) {
    <p>@error.message</p>
}

§Varsayılan değerler ile bir formu doldurmak

Bazen, çoğunlukla düzenleme için, bir formu mevcut değerler ile doldurmak isteyeceksiniz:

userForm = userForm.fill(new User("[email protected]", "secret"));

İpucu: Formnesneleri immutable’dır. bind() ya da fill() gibi metodlara çağrılar yeni veriyle doldurulmuş yeni bir form döndürür.

§Bir modelle ilişkisi olmayan bir form doldurmak

Bir Model ile ilişkisi olmayan bir HTML formundan veri almak için DynamicForm kullanabilirsiniz:

public static Result hello() {
    DynamicForm requestData = Form.form().bindFromRequest();
    String firstname = requestData.get("firstname");
    String lastname = requestData.get("lastname");
    return ok("Hello " + firstname + " " + lastname);
}

§Özel bir DataBinder kaydetmek

Özel bir nesneden bir form alan string’ine ve tam tersine bir eşleşme tanımlamak isterseniz bu nesne için yeni bir Formatter tanımlamalısınız. JodaTime’ın `LocalTime’ı gibi bir nesne için bu işlem aşağıdaki gibi görünebilir:

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

});

Bağlama başarısız olduğunda bir hata anahtarları dizisi yaratılır ve messages dosyalarında ilk tanımlanan kullanılır. Bu dizi genellikle şunları içerir:

["error.invalid.<fieldName>", "error.invalid.<type>", "error.invalid"]

Hata anahtarları Spring DefaultMessageCodesResolver tarafından yaratılır. Kök “typeMismatch” “error.invalid” ile değiştirilir.

Sonraki: Form şablonu başlıklarını kullanmak


Dokümantasyonun bu çevirisi Play ekibi tarafından yapılmamaktadır. Eğer bir hata bulduysanız, bu sayfanın kaynak kodu burada bulunmaktadır. Dokümantasyon yönergelerini okuduktan sonra lütfen katkı yapmaktan çekinmeyin.