Chương 2 MỘT SỐ FRAMEWORK WEB MÃ NGUỒN MỞ
2.5. SO SÁNH, ĐÁNH GIÁ CÁC FRAMEWORK
2.5.1. So sánh một số tính năng
2.5.1.1. UI binding
Gắn kết giao diện người dùng động không chỉ chuyển dữ liệu đến view hoặc template khi tải trang mà còn tự động cập nhật view khi dữ liệu của model cơ bản thay đổi. Sau đây là ý tưởng về sự cải thiện rất lớn được cung cấp bởi sự gắn kết giao diện người dùng động trên việc binding dữ liệu tĩnh phía máy chủ truyền thống.
Bind dữ liệu trong Spring MVC xảy ra trong các tham số của các phương thức xử lý của các web-tier components - Controllers.
Cơ chế bind dữ liệu trong Grails chuyển đổi các tham số request thành thuộc tính của một đối tượng thuộc các loại khác nhau. Người phát triển có thể tùy chỉnh việc bind dữ liệu mặc định theo những cách khác nhau. Ví dụ nhƣ sử dụng chú thích
@DataBinding.
Cơ chế bind dữ liệu trong Vaadin đƣợc thực hiện thông qua Vaadin Data Model, nó là một trong những khái niệm cốt lõi của thƣ viện cho phép view (các
55
component giao diện người dùng) truy cập vào model dữ liệu của một ứng dụng trực tiếp. Model cho phép bind các component giao diện người dùng trực tiếp vào dữ liệu mà chúng hiển thị và có thể cho phép chỉnh sửa. Có ba mức phân cấp lồng nhau trong model dữ liệu: property, item, và container.
Tính năng bind dữ liệu trong JSF khá linh hoạt, nó cung cấp khả năng gắn kết component trong view. Việc gắn kết component thường được sử dụng kết hợp với JavaBeans. Vì vậy các nhà phát triển ứng dụng thường đặt các bean được quản lý mà đƣợc trỏ tới bởi biểu thức gắn kết component trong phạm vi "request".
2.5.1.2. Khả năng tái sử dụng mã
Trong trường hợp phát triển nhiều hơn một ứng dụng, người phát triển sẽ có thể muốn tái sử dụng mã.
Spring MVC: Mã có thể tái sử dụng, không cần sao chép. Sử dụng các đối tƣợng nghiệp vụ hiện có nhƣ lệnh hoặc các đối tƣợng form thay vì nhân bản nó để mở rộng lớp cơ sở framework cụ thể.
Grails: Vì Grails dựa trên công nghệ mã nguồn mở nhƣ Spring, nên Grails cũng có hỗ trợ việc tái sử dụng nhƣ Spring.
Vaadin: Các theme có thể tái sử dụng trong việc phát triển các ứng dụng khác nhau. Thư mục Vaadin là một kho lưu trữ các component cung cấp các component hiện có mà người dùng đã triển khai và đóng góp cho người dùng khác sử dụng lại.
JSF: Thay vì sử dụng các component giao diện người dùng cá nhân để xây dựng các trang, người phát triển có thể sử dụng các khối building để xây dựng các phần của một trang hoặc toàn bộ trang. Các khối building chứa các component giao diện người dùng được sử dụng thường xuyên hoặc phổ biến để tạo ra nội dung tái sử dụng để sử dụng trong một hoặc nhiều trang của ứng dụng. Tùy thuộc vào ứng dụng xây dựng mà có thể sử dụng chỉ một loại khối building, hoặc tất cả các loại trong một hoặc nhiều trang. Và có thể chia sẻ một số khối building giữa các ứng
56
dụng. Khi sửa đổi các khối building, các trang JSF sử dụng nội dung tái sử dụng đƣợc tự động cập nhật.
2.5.1.3. Hỗ trợ xác nhận (Validation)
Khi chấp nhận đầu vào người dùng trong ứng dụng web bất kỳ, việc xác nhận chúng trở nên cần thiết. người lập trình có thể xác nhận đầu vào người dùng ở phía client sử dụng JavaScript nhƣng cũng cần thiết để xác nhận chúng ở phía server để đảm bảo rằng người lập trình đang xử lý dữ liệu hợp lệ trong trường hợp người dùng vô hiệu hóa Javascript.
Spring MVC hỗ trợ kỹ thuật JSR-303 theo mặc định và tất cả người lập trình cần là thêm JSR-303 và việc thực hiện nó phụ thuộc ứng dụng Spring MVC. Spring cũng cung cấp chú thích @Validator và lớp BindingResult qua đó mà người lập trình có thể nhận đƣợc các lỗi đƣợc nêu ra bởi việc thực hiện Validator trong phương thức xử lý request controller.
Với Spring MVC, người lập trình có thể tạo ra các thực hiện validator tùy chỉnh bằng hai cách - cách đầu tiên là tạo ra chú thích để xác nhận với kỹ thuật JSR- 303 và thực hiện các lớp Validator của nó. Cách thứ hai là thực hiện giao diện org.springframework.validation.Validator và thêm cài đặt nó nhƣ là validator trong lớp Controller sử dụng chú thích @InitBinder.
Khả năng validation của Grails đƣợc xây dựng trên Validator API và khả năng ràng buộc dữ liệu của Spring. Tuy nhiên Grails cải thiện hơn nữa khả năng này và cung cấp một cách thống nhất để định nghĩa validation "constraints" với cơ chế ràng buộc của nó.
Constraints trong Grails là cách khai báo các luật validation xác định. Phổ biến nhất là chúng đƣợc áp dụng cho các lớp domain, tuy nhiên các ánh xạ URL và các đối tƣợng command cũng hỗ trợ constraints.
Vaadin cũng hỗ trợ kỹ thuật JSR-303 nhƣ Spring MVC.
57
JSF hỗ trợ cả hai phương tiện khai báo và khẩn cấp của validation. Phương tiện khai báo gồm: sử dụng các bộ xác nhận chuẩn của JSF và sử dụng Bean validation - JSR 303 tương tự như Spring MVC và Vaadin. Phương tiện khẩn cấp gồm: Phương thức Validation trong backing bean và validator tuỳ chỉnh bằng cách thực hiện javax.faces.validator.Validator và việc chú thích class với
@FacesValidator.
2.5.1.4. Hỗ trợ AJAX
AJAX làm cho các trang web động tương tác nhiều hơn. cả bốn framework hỗ trợ AJAX bằng cách cung cấp tag đặc biệt hoặc các component. Không có cấu hình bổ sung cần thiết trong bất kỳ framework nào cho AJAX để làm việc đúng cách.
Spring MVC hỗ trợ cho Ajax từ xa với JSON đƣợc cung cấp nhƣ một phần của Spring MVC. Điều này bao gồm hỗ trợ để tạo ra các response JSON và ràng buộc các request JSON sử dụng mô hình lập trình @Controller Spring MVC. Spring MVC cũng hỗ trợ jQuery và Dojo.
Grails là một nền tảng rất tốt để lập trình các ứng dụng AJAX. Nó hỗ trợ 5 tag cơ bản:
remoteLink - tạo ra một liên kết dựa trên AJAX.
remoteFunction - tạo ra mã javascript mà phát sinh request AJAX.
remoteField - tạo ra một trường điều khiển văn bản mà phát sinh ra request AJAX khi giá trị thay đổi (giá trị đƣợc gửi lại cho máy chủ để xử lý).
formRemote và submitToRemote – tạo ra các form đƣợc submit sử dụng request AJAX.
Vaadin sử dụng Google Web Toolkit để hiển thị giao diện người dùng trong trình duyệt web và xử lý các nhiệm vụ cấp thấp của tương tác người dùng trong trình duyệt. Điều này làm cho kiến trúc ứng dụng web dựa trên AJAX đơn giản hơn nhiều.
58
JSF cũng mã hóa Ajax bằng tag. Việc mã hóa này rất dễ dàng, nó chỉ giống như mã hóa thẻ HTML thông thường.