Phương thức vòng đời render chịu trách nhiệm cho việc sinh ra nội dung (được hiển thị trên trình duyệt) của portlet. Nó được gọi khi portlet được thực thi trong pha sinh nội dung.
Trong pha này, portlet sẽ sinh ra các nội dung dựa vào trạng thái hiện tại của nó (ví dụ như: Normal, Minimize, Maximize, ...). Phương thức / pha render của tất cả các portlet trên cùng một trang sẽ đượcc gọi bất cứ khi nào trang đó được refresh hoặc người dùng chuyển hướng đến renderURL của một portlet nhất định (kích hoạt phương thức render bởi Render URL) hoặc bất kỳ một portlet nào trong trang mà trang đó hoàn thành một pha hành động (action) hoặc một sự kiện.
Chúng ta sẽ thao tác trên cùng một Project Liferay (portlet) mà ta đã tạo ra trong bài trước (Liferay: Vòng đời của Portlet - Phương thức init()). Trong lớp controller của portlet, chúng ta sẽ ghi đè phương thức render(). Phương thức này được định nghĩa trong lớp GenericPortlet.
Phương thức ghi đè trong lớp PhaseAndLifecyclePortlet và đặt vài dòng ghi log như đoạn code dưới đây:
Giải thích
Phương thức render() được ghi đè từ lớp GenericPorrtlet
Trong phương thức này, ngs ta đặt các dòng log. Nó sẽ được hiển thị khi phương thức render() được gọi.
Cuối phương thức, ta thực gọi super.render(request, response). Nó sẽ gọi phương thức render() của lớp GenericPortlet để thực hiện vài thao tác xử lý ở phía back-end (ví dụ như gửi nội dung của portlet đến file JSP được định nghĩa trong portlet.xml như tham số khởi tạo view-template).
Nếu không gọi super.render() thì phương thức ghi đè của chúng ta sẽ không làm việc một cách chính xác. Phương thức này sẽ lấy các đối tượng (object) kiểu RenderRequest và RenderResponse làm tham số.
RenderRequest và RenderResponse là khác so với ServletRequest và ServletResponse. Portlet không truy cập trực tiếp vào ServletRequest và ServletResponse. RenderRequest và RenderResponse được mở rộng từ giao diện PortletResquest và PortletResponse như hình dưới đây:
Lưu lớp PhaseAndLifecyclePortlet và triển khai nó lên server. Bạn sẽ thấy phương thức init() được gọi trong quá trình triển khai portlet. Portlet container sẽ xoá tất cả các thể hiện đã có của portlet và tạo ra các thể hiện mới. Đây là lúc phương thức init() sẽ được gọi.
Phương thức vòng đời render sẽ được gọi theo ba kịch bản sau:
- Kịch bản 01: Phương thức render() được gọi khi trang (Liferay page) được làm tươi (refresh).
Triển khai (deploy) portlet và refresh lại trang nơi mà portlet được đặt (nếu chưa có thì bạn kéo portlet vào), bạn sẽ thấy được các dòng log được ghi ra trên màn hình console của server giống như hình dưới:
Quan sát các dòng log, chúng ta thấy rằng mỗi khi trang được refresh thì phương thức render() sẽ được gọi. Để hiểu được sâu hơn, bạn có thể viết vài portlet tương tự và đặt nó vào cùng trang với portlet hiện tại. Đặt các dòng log vào từng phương thức render() của từng portlet.
Refresh lại trang, bạn sẽ quan sát thấy tất cả các phương thức render() của tất cả các portlet đều được gọi. Tuy nhiên, không có gì đảm bảo về thức tự gọi phương thức render của các portlet trên cùng một trang. Điều đó có nghĩa là phương thức render của portlet nào được gọi đầu tiên là không thể dự đoán được. - Kịch bản 02: Phương thức render được gọi khi renderURL được gọi.
renderURL là gì?
Các servlet được gọi bở các bảng ánh xạ url của nó (được định nghĩa trong web.xml). Portlet không thể được ánh xạ bởi url trực tiếp giống như servlet. Portlet container cung cấp các thẻ / lớp tiện ích nhận định, chúng sẽ được sử dụng bởi portlet để sinh ra các url. Các url được sinh ra bởi portlet sẽ chỉ (point) đến bản thân nó. Nói các khác, url này sẽ tham chiếu tới portlet tạo ra nó và được gọi là PortletURL. Sau đây là các loại PortletURl khác nhau:
+ renderURL (sẽ gọi phương thức render của portlet)
+ actionURL (sẽ gọi phương thức processAction của portlet)
+ resourceURL (sẽ gọi phương thức serveResource của portlet)
Phương thức vòng đời render() của portlet được gọi khi renderURL của portlet đó được click vào. renderURL chỉ ra portlet nào tạo ra nó. Nó có thể trỏ đến cùng portlet hoặc các portlet khác dựa vào các tham số được đặt trong renderURL. Sau đây là các cách khác nhau để tạo ra renderURL. Chi tiết được giải thích cụ thể trong các bài viết tương ứng:
+ Lựa chọn 01: tạo ra renderURL bằng thẻ portlet trong JSP
+ Lựa chọn 02: tạo ra renderURL bằng Java API trong lớp controller và JSP
+ Lựa chọn 03: tạo ra renderURL bằng thẻ của Liferay
+ Lựa chọn 04: tạo ra renderURL bằng javascript - Kịch bản 03: phương thức render() được gọi khi phương thức action() của bất kỳ portlet nào trên cùng trang được hoàn thành.
Nhiều portlet có thể được đặt trên cùng một trang (trong Liferay). Khi bất kỳ một portlet nào hoàn thành phương thức processAction() thì phương thức render() của tất cả các portlet khác trên trang đó sẽ được gọi. Trong trường hợp này, người dùng không đã không tương tác một cách trực tiếp với các portlet khác nhưng chúng vẫn sinh ra nội dung. Chúng ta sẽ nhìn thấy điềy này nhiều hơn trong các bài viết cụ thể.
Kết luận
Phương thức vòng đời render() thể hiện cho pha sinh nội dung portlet. Trong pha này, nội dung của portlet sẽ được sinh ra dựa vào trạng thái hiện tại của nó.
Phương thức này được gọi khi trang chứa nó được refresh hoặc một portlet khác trên cùng trang đó thức hiện xong một hành động (action) hoặc portlet được gọi bởi renderURL từ chính portlet đó hay tư portlet khác.
Để hiển rõ hơn về hai pha (render và action), bạn hãy đọc ở link này.
Để hiển rõ hơn về hai pha (render và action), bạn hãy đọc ở link này.
Không có nhận xét nào:
Đăng nhận xét