Play Framework Series: [Part 02] Form And Validation

Hãy cùng trở lại với Play Framework, sau đây xin được gọi là PF. Tất cả những lập trình viên web đều biết đến những thứ rất cơ bản là form và validation form. Vậy cách tạo ra form và validation nó như thế nào trong PF, tôi sẽ giới thiệu cho mọi người biết ở nội dung dưới đây. 1. Tạo Form Cách tạo form với thẻ form trong HTML thật hết sức đơn giản nhưng trong PF đã có hẳn plugin helper giúp bạn điều đó, chỉ cần thêm code sau vào view template:

@helper.form(action = routes.Application.anyAction(), 'id-> "myFormId") {
.... some thing
}

Nó cũng giúp bạn tạo ra các loại input:

@helper.inputText(myForm("email"), 'id -> "email", 'size -> 30)
@helper.inputPassword(myForm("password"))
.........

Bạn có thể xem chi tiết tại https://www.playframework.com/documentation/2.6.x/JavaFormHelpers#form-template-helpers

2. Validation Form Ở bài viết này tôi sẽ không trình bày về validation form phía client mà chỉ để cập tới việc handle nó phía backend. Việc đầu tiên phải tạo 1 model class

public class User {

    protected String email;
    protected String password;

    public void setEmail(String email) {
        this.email = email;
    }

    public String getEmail() {
        return email;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getPassword() {
        return password;
    }
}

Sử dụng FormFactory trong Controller để xử lý: Form<User> userForm = formFactory.form(User.class);

Ta có thể binding dữ liệu từ object vào form theo cách:

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

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

hoặc binding từ request: User user = userForm.bindFromRequest().get();

Chú ý: trong trường hợp bạn không muốn binding mà muốn lấy request param để tự xử lý thì có thể dùng đến DynamicForm:

 DynamicForm requestData = formFactory.form().bindFromRequest();
 String firstname = requestData.get("firstname");
 String lastname = requestData.get("lastname");
 return ok("Hello " + firstname + " " + lastname);

Giờ muốn validation form ta phải tạo constraints trong model class, PF đã implement constraints tuân theo chuẩn SR-303 (Bean Validation 1.0) annotations: http://beanvalidation.org/1.0/spec/ Ví du: khi tôi muốn người dùng phải nhập giá trị email, mình chỉ cần khai báo constraints tương ứng:

public class User {

    @Required
    protected String email;
    protected String password;
......

}

Tùy vào yêu cầu check cụ thể mà bạn tạo constraints tương ứng như Required, maxlength ...

Phía controller sẽ xử lý:

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

Đương nhiên trong view template bạn cũng cần thêm đoạn code sau để hiển thị nội dung thông báo lỗi:

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

Hy vọng qua đoạn giới thiệu ngắn trên có thể giúp các bạn thao tác với form. Chúc các bạn thành công trong việc học và sử dung PF. Link tham khảo cho Play version 2.6: https://www.playframework.com/documentation/2.6.x/JavaForms