§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>>
.
validate
metodu 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 null
olmayan 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 email
da 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:
Form
nesneleri immutable’dır.bind()
ya dafill()
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.