Menu

Liferay: Vòng đời của Portlet - Phương thức serveResource()


Portlet có thể gửi các nội dung động từ máy trạm tới máy chủ trong pha phục vụ tài nguyên (serve resource). Chúng ta hãy xem pha này được thực hiện trong Liferay như thế nào nhé.

Các portlet được sử dụng để sinh ra các kết quả tổng hợp. Mỗi portlet sẽ sinh ra một phần nhỏ nội dung của một trang. Chúng ta đã biết rằng pha render được sử dụng để sinh ra nội dung của portlet. renderaction là hai pha ban đầu được định nghĩa trong mô tả kỹ thuật phiên bản 1.0 (JSR-168).
Nhưng sau này, các portlet được mong đợi có thể phục vụ các nội dung khác hơn là chỉ có HTML. Ví dụ, gửi một luồng các byte trực tiếp đến máy trạm (tải file ảnh, PDF, XLS, JSON, XML, vv) hoặc gửi các đầu ra động mà không cần làm mới (refresh) lại trang web (thông qua AJAX). Mô tả kỹ thuật của portlet ở phiên bản 1.0 thì không cung cấp trực tiếp cách phục vụ các tài nguyên động như vậy.
Để khắc phục điều này, mô tả kỹ thuật của portlet đã được cập nhật (thông số kỹ thuật của portlet mới được gọi là phiên bản 2.0 hay JSR-286) chứa các chức năng được thêm vào này. Một trong những chức năng chính được thêm vào trong mô tả kỹ thuật phiên bản 2.0 (JRS-286) là khả năng phục vụ các tài nguyên.
Trước JRS-286, servelet bên trong portlet đã được sử dụng để phục vụ các nội dung động.

Pha phục vụ tài nguyên

Trong pha phục vụ tài nguyên, portlet có thể gửi dữ liệu động mà không cần gọi pha render. Không giống như pha action, Liferay sẽ không gọi phương thức render sau khi hoàn thành pha phục vụ tài nguyên. Tài nguyên được yêu cầu sẽ được gửi trực tiếp tới máy trạm trong pha này.

Cài đặt pha phục vụ tài nguyên như thế nào?

Phương thức serveResource() thể hiện cho pha phục vụ dữ liệu của portlet. Phương thức này được định nghĩa trong giao diện ResourceServingPortlet. Nếu chúng tôi nói về Liferay MVC Portlet, nó sẽ có sơ đồ phân cấp lớp như sau:
  • GenericPortlet cài đặt 04 giao diện sua:
    • Portlet - Giao diện này định nghĩa các phương thức init, destroy, renderprocessAction. Các phương thức này thể hiện cho các pha khởi tạo, destroy, renderaction và nó được giới thiệu trong JSR-168.
    • EventPortlet - Giao diện này định nghĩa phương thức processEvent. Phương thức này thể hiện cho pha event của portlet và được thêm vào trong JSR-286 (phiên bản 2.0).
    • PortletConfig - Giao diện này định nghĩa các phương thức khác nhàu để lấy trạng thái của portlet (portlet context) và đọc các tham số khởi tạo của portlet, lấy tên portlet và các tài nguyên khác, ...
    • ResourceServingPortlet - Giao diện này định nghĩa phương thức serveResource(). Phương thức này thể hiện cho pha phục vụ dữ liệu của portlet và đã được thêm vào trong JSR-286.
  • GenericPortlet cung cấp cài đặt mặc định của các giao diện này.
  • Phương thức serveResource() được định nghĩa trong giao diện ResourceServingPortlet.
  • GenericPortlet cung cấp cài đặt mặc định của phương thức serveResource().
  • LiferayPortlet kế thừa từ GenericPortlet và ghi đè phương thức serveResource().
  • MVCPortlet kết thừa từ LiferayPortlet và lại ghi đè phương thức serveResource().
Nếu bạn muốn cài đặt pha phục vụ dữ liệu, bạn cần phải ghi đè phương thức serveResource() trong lớp của bạn (trong trường hợp này là lớp MVCPortlet)

Phương thức serveResource() được gọi như thế nào?

Phương thức serveResource() được gọi khi resourceURL của portlet được nhấn vào. resourceURL sẽ trỏ đến portlet mà đã tạo ra nó. Nó có thể trỏ tới cùng một portlet hoặc portlet khác dựa trên các tham số được đặt trong resourceURL.

Luồng thực hiện của phương thức serveResource 

Sơ đồ tuần tự bên dưới thể hiện luồng thực hiện của phương thức serveResource().

Luồng thực hiện

  • Khi người dùng nhấn vào một resourceURL, nó sẽ truyền tới Liferay Portal.
  • Liferay sẽ tiếp nhận yêu cầu này và chuyển nó tới portlet container.
  • Portlet container sẽ tìm portlet thích hợp để gọi phương thức serveResource() của nó.
  • Sau đó, portlet container gửi đầu ra của phương thức serveResource() tới Liferay Portal và cuối cùng Liferay Portal sẽ gửi các nội dung đó trực tiếp đến máy trạm.
  • Bạn có thể thấy rằng portlet container sẽ không thực hiện gọi bất kỳ pha nào khác sau khi hoàn thành pha phục vụ tài nguyên (sau khi kết thúc phương thức serveResource()).
  • Nó ít nhiều giống với một servlet cái mà sẽ gửi kết quả đầu tra đến máy trạm một cách trực tiếp.
  • Trong trường hợp của phương thức render, sau khi hoàn thành pha render, Liferay Portal sẽ tổng hợp các kết quả đầu ra của mọi portlet lên một trang và gửi tới máy trạm.
  • Nhưng trong trường hợp của pha phục vụ dữ liệu, pha render không được gọi bởi vậy Liferay Portal sẽ không sinh nội dung của các portlet. Nó đơn giả chỉ gửi đầu ra từ phương thức serveResource() tới máy trạm. Bởi vậy, bạn luôn luôn cần phải gọi resourceURL trong AJAX.

Tổng kết

  • Pha phục vụ tài nguyên được giới thiệu trong mô tả kỹ thuật của portlet 2.0 (JSR-286)
  • Trong pha phục vụ tài nguyên, portlet có thể gửi các nội dung động một cách trực tiếp đến máy trạm. Nó có thể là văn bản HTML, JSON, XML hoặc các luồng byte như gửi một file.
  • Phương thức serveResource() thể hiện trong pha phục vụ dữ liệu của portlet. Bạn cần phải ghi đè phương thức này và đặt các xử lý logic trong nó để phục vụ các nội dung động trực tiếp đến máy trạm.
  • Sau khi hoàn thành phương thức serveResource(), Liferay Portal sẽ gửi kết quả của phương thức serveResource() trực tiếp đến máy trạm. Nó sẽ không tạo ra toàn bộ nội dung của một trang. Do đó, bạn chỉ nên gọi phương thức serveResource() trong AJAX.
  • Bạn có thể đọc bài viết gốc tại đây: http://www.opensource-techblog.com/2015/06/portlet-serve-resource-phase-lifecycle.html

1 nhận xét:

  1. Công ty xử lý chất thải công nghiệp chuyên vận chuyển chất thải rắn công nghiệp thông thường cho các doanh nghiệp tại tphcm và thu mua phế liệu công nghiệp

    CÔNG TY MÔI TRƯỜNG THÁI AN

    Địa Chỉ: 279 Vườn Lài, Phường An Phú Đông, Quận 12, TP. Hồ Chí Minh (TP.HCM)

    Điện Thoại: 0945 667 887

    Email: xulychatthaithaian@gmail.com

    Web: https://chatthaicongnghiep.org/

    google maps: https://goo.gl/maps/Lg2prKjXrQPq71TMA

    #chatthaicongnghiep.org

    #chatthaicongnghiep

    Trả lờiXóa