Struts 2 là một framework mã nguồn mở mạnh mẽ, được sử dụng rộng rãi trong việc phát triển các ứng dụng web Java. Được phát triển ban đầu bởi Craig McClanahan và hiện được hỗ trợ bởi Apache Software Foundation, Struts 2 kế thừa và cải tiến từ Webwork, mang đến một giải pháp đơn giản và hiệu quả hơn so với Struts 1.
Struts 2 tuân theo kiến trúc MVC (Model-View-Controller), một mô hình thiết kế phần mềm phổ biến giúp phân tách ứng dụng thành ba thành phần chính:
- Model: Đại diện cho dữ liệu của ứng dụng. Trong Struts 2, Model thường là các lớp Java đơn giản (POJO – Plain Old Java Object) chứa các thuộc tính và các phương thức getter/setter tương ứng.
- View: Là giao diện người dùng, thường được xây dựng bằng các trang JSP (*.jsp). Struts 2 sử dụng OGNL (Object-Graph Navigation Language) và các thẻ tùy chỉnh (custom tags) để truy xuất và hiển thị dữ liệu từ Model lên View.
- Controller: Xử lý logic của ứng dụng. Trong Struts 2, Controller được gọi là Action. Mỗi Action là một lớp Java, chứa tham chiếu đến Model và thực hiện các thao tác xử lý dữ liệu. Sau khi xử lý, Action cập nhật Model và chuyển hướng đến View tương ứng để hiển thị kết quả cho người dùng.
Mô hình MVC trong Struts 2 giúp phân tách ứng dụng thành các thành phần dễ quản lý và bảo trì
Ưu điểm nổi bật của Struts 2
- Đơn giản và dễ sử dụng: So với Struts 1, Struts 2 được đánh giá là dễ học và dễ sử dụng hơn, nhờ kiến trúc rõ ràng và các tính năng hỗ trợ mạnh mẽ.
- Hỗ trợ Annotation: Struts 2 hỗ trợ cấu hình dựa trên Annotation, giúp đơn giản hóa việc tạo và quản lý các Action và các thành phần khác của ứng dụng.
- Kiến trúc POJO: Lớp Action trong Struts 2 là một đối tượng POJO chuẩn, giúp đơn giản hóa việc kiểm thử mã.
- Interceptors: Struts 2 cung cấp các API để cấu hình Interceptors, giúp giảm thiểu sự phụ thuộc (coupling) giữa các thành phần của ứng dụng. Interceptors cho phép bạn thực hiện các tác vụ tiền xử lý và hậu xử lý yêu cầu một cách linh hoạt.
- Hỗ trợ nhiều View: Struts 2 hỗ trợ nhiều loại View khác nhau, bao gồm Velocity, FreeMarker, và JSP, cho phép bạn lựa chọn công nghệ phù hợp nhất với nhu cầu của dự án.
Kiến trúc chi tiết của Struts 2
Kiến trúc của Struts 2 dựa trên framework Webwork2 và sử dụng các công nghệ JEE chuẩn như Java Filters, JavaBeans, ResourceBundles, Locales, và XML.
Vòng đời của một yêu cầu trong Struts 2 diễn ra như sau:
- Yêu cầu từ Client: Khi người dùng gửi một yêu cầu từ trình duyệt (Client), yêu cầu này sẽ được chuyển đến ActionMapper.
- ActionMapper: ActionMapper quyết định Action nào sẽ được gọi để xử lý yêu cầu. Sau đó, nó chuyển kết quả đến FilterDispatcher.
- FilterDispatcher: FilterDispatcher tiếp nhận kết quả từ ActionMapper và chuyển quyền điều khiển cho ActionProxy.
- ActionProxy: ActionProxy đọc các file cấu hình (ví dụ:
struts.xml) để xác định thông tin về Action cần gọi. ActionProxy tạo một thể hiện của lớp ActionInvocation và chuyển quyền điều khiển cho lớp này. - ActionInvocation: ActionInvocation chịu trách nhiệm thực hiện các lệnh được cài đặt. Nó gọi các Interceptors nếu cần thiết, sau đó gọi Action.
- Action: Action thực hiện logic nghiệp vụ của ứng dụng và trả về một mã kết quả (result code).
- Result Mapping: ActionInvocation xác định View thích hợp dựa trên mã kết quả được ánh xạ trong file cấu hình (
struts.xml). - Interceptors (lần 2): Các Interceptors được thực thi một lần nữa theo thứ tự ngược lại, trước khi trả về đáp ứng cho Filter (thường là FilterDispatcher).
- Phản hồi về Client: Kết quả được chuyển đến Servlet container và gửi trả lại cho Client.
Ứng dụng của Struts 2
Struts 2 là một framework mạnh mẽ và linh hoạt, phù hợp cho việc phát triển nhiều loại ứng dụng web khác nhau, từ các ứng dụng đơn giản đến các ứng dụng phức tạp. Nhờ kiến trúc MVC rõ ràng, khả năng mở rộng cao và cộng đồng hỗ trợ lớn, Struts 2 tiếp tục là một lựa chọn phổ biến cho các nhà phát triển Java.
Trong bài viết này, chúng ta đã tìm hiểu về các thành phần cơ bản, ưu điểm và kiến trúc của Struts 2. Struts 2 còn rất nhiều tính năng và thành phần khác mà chúng ta sẽ có cơ hội khám phá trong các bài viết tiếp theo.
