Pha action (hoạt động) của portlet được thực hiện trong phương thức processAction(). Nó được thực hiện bằng cách gọi một URL action. Người dùng sẽ tương tác với portlet trong pha này.
Pha action được sử dụng để thực hiện một thoa tác nào đó trên một portlet. Chỉ duy nhất một portlet của một trang có thể thực hiện pha này trong một thời điểm. Ví dụ, nếu có 10 portlet được kéo ra trên cùng một trang, thì pha action có thể được gọi bởi một portlet tại một thời điểm mà thôi. Trong pha action, ta có thể thay đổi các trạng thái của portlet hoặc thực hiện các thao tác CRUD (Create - Read - Update - Delete).
Thông số kỹ thuật của portlet (JSR-168 và 286) đã định nghĩa pha render. Câu hỏi được đặt ra trong đầu là cái gì cần giới thiệu trong pha action của portlet? Ta sẽ đi trả lời câu hỏi này bằng cách thực hiện ví dụ dưới đây.
Trước khi giải thích thêm, hãy để tôi nhắc lại portlet được thiết kế để sinh ra các kết quả tổng hợp. Nói cách khác, nhiều hơn một portlet trên một trang có thể sinh ra toàn bộ nội dung của trang. (Mỗi portlet sẽ sinh ra một phần nhỏ nội dung của các trang). Pha render được gọi khi trang chứa nó được làm mới hoặc renderURL của bất kỳ portlet nào trên trang đó được nhấn vào.
Bây giờ chúng ta sẽ thực hiện một ví dụ theo kịch bản sau đây:
- Hai portlet (Portlet1 và Portlet2) được đặt trên cùng một trang.
- Portlet1 đang thực hiện một thao tác CRUD. Giải sử rằng, không có bất kỳ pha action nào trong Portlet1 và do đó, thao tác CRUD sẽ được đặt trong phương thức render().
- Khi người dùng nhấn vào renderURL của Portlet1, thao tác CRUD sẽ được thực hiện trong phương thức render().
Vấn đề xuất hiện khi người dùng nhấn vào renderURL của Portlet2. Hãy để tôi giải thích tại sao?
- Nếu phương thức render() của bất kỳ portlet nào trên một trang được gọi thì phương thức render() của tất cả các portlet khác trên trang đó cũng sẽ được gọi.
- Khi người dùng click vào renderURL của Portlet2 thì phương thức render() của Portlet1 cũng sẽ được gọi và do đó thao tác CRUD cũng sẽ được thực hiện một cách không cần thiết.
- Người dùng đã không tương tác trực tiếp với Portlet1 nhưng thao tác CRUD của Portlet1 vẫn được thực hiện. Đây là việc cần phải tránh.
- Tại sao điều này xảy ra? Bởi vì, portlet không biết về portlet khác sẽ được đặt trên cùng một trang trong quá trình phát triển.
Thông số kỹ thuật của portlet đã giới thiệu pha action để tránh hạn chế này. Pha action của portlet có thể được gọi bởi actionURL và được gọi bởi một portlet tại một thời điểm trên một trang cho trước. Pha render của portlet thì sẽ được gọi ngay sau khi pha action hoàn thành.
Một thao tác lý tưởng không nên được lặp đi lặp lại và phải được định nghĩa trong pha action. Nói cách khác, pha action là nơi tốt nhất để viết bất kỳ đoạn mã nào mà không được lặp lại một cách vô ý (ví dụ các thao tác CRUD như chúng ta đã thấy ở trên).
Pha action của portlet
- Phương thức action của portlet thực hiện pha action.
- Sơ đồ trình tự sau đây sẽ thể hiện việc làm thế nào pha render và action làm việc trong portlet.
- Bước 1: Người dùng thực hiện một yêu cầu từ Page1. Portlet-A và Portlet-B được đặt trong trang Page1 này.
- Bước 2: Liferay sẽ thực hiện yêu cầu đó và truyền nó đến portlet container.
- Bước 3: Portlet container sẽ gọi phương thức render của Portlet-A.
- Bước 4: Portlet container sẽ nhận các kết của từ Portlet-A.
- Bước 5: Portlet container sẽ gọi phương thức render của Portlet-B.
- Bước 6: Portlet container sẽ nhận các kết của từ Portlet-B.
- Bước 7: Portlet container sẽ tổng hợp các kết của từ Portlet-A và Portlet-B.
- Bước 8: Liferay sẽ gửi lại các kết quả.
Pha render sẽ theo sau pha action.
- Bước 9: Bây giờ người dùng sẽ thực hiện một thao tác CRUD trên Portlet-A.
- Bước 10: Liferay sẽ gọi pha action của portlet.
- Bước 11: Portlet container sẽ gọi phương thức action của Portlet-A.
- Bước 12: Theo mô tả kỹ thuật của portlet, pha render sẽ được gọi ngay sau khi pha action hoàn thành. Trong bước này, portlet container sẽ gọi phương thức render của Portlet-A.
- Bước 13: Portlet container sẽ lấy kết quả từ Portlet-A.
- Bước 14: Theo thông số kỹ thuật của portlet, khi phương thức render được gọi từ bất kỳ portlet nào trong một trang thì tất cả các phương thức render của các portlet khác trên trang đó cũng được gọi. Trong bức này, portlet container sẽ gọi phương thức render của Portlet-B.
- Bước 15: Portlet container sẽ lấy kết quả từ Portlet-B.
- Bước 16: Portlet container sẽ tổng hợp các kết quả lấy từ Portlet-A và Portlet-B và gửi lại.
- Bước 17: Kết quả cuối cùng sẽ được gửi lại cho người dùng.
actionURL được sử dụng để gọi phương thức action. Bạn có thể xem ở bài viết sau đây để biết làm thế nào để tạo ra một actionURL và hoàn thành luồng như hình vẽ trên.
Bạn có thể xem bài viết how action method internally invoked for Liferay Portlet để hiểu làm thế nào Liferay portal xử lý yêu cầu của phương thức action.
Tổng kết
- Phương thức action của portlet thực hiện pha action của nó.
- Bất kỳ đoạn mã hoặc xử lý logic nào mà không cần lặp lại phải được thực hiện trong pha action.
- Một khi pha action của portlet hoàn thành, portlet container sẽ gọi phương thức render của chính portlet đó.
- actionURL được sử dụng để gọi phương thức action của portlet.
- Bạn có thể đọc bài viết gốc tại địa chỉ: http://www.opensource-techblog.com/2015/03/portlet-action-phase.html
Không có nhận xét nào:
Đăng nhận xét