Thứ Hai, 26 tháng 9, 2005

Portlet là gì ?

Bài viết cố gắng trình bày cho bạn những khái niệm căn bản nhất về portlet ( trong Java ) ? Bài viết được lược dịch từ What Is a Portlet của tác giả Sunil Patil tại OnJava trong đó có sự bổ xung của anh Tuấn Nguyễn , tác giả eXo Portal. Để đọc bài viết này, bạn nên xem lại nội dung của bài viết trước.

10 nhận xét:

  1. Portlet là gì ?
    Tương tự như servlet, portlet là một web component được dùng để triển khai vào trong một portlet container và tạo ra nội dung động. Về mặt công nghệ, portlet là một class viết theo chuẩn giao diện của javax.portlet.Portlet interface và được đóng gói, triển khai trong một file .war và trong một portlet container.
    Portlet có mấy điểm giống servlet là :
    1. Được quản lí bởi một container chuyên dụng.
    2. Khả năng xử lý request và sinh ra nội dung động.
    3. Vòng đời được quản lí bởi container
    4. Làm việc với client thông qua mô hình request/response.
    Có một vài điểm khác đó là:
    1.Portlet chỉ tạo ra những mảnh nội dung chứ không tạo ra một trang web hoàn chỉnh.
    2. Portlet không có URL trực tiếp.
    3. Portlet không bị bó buộc vào nội dung tạo ra. Nội dung tạo ra có thể là html/text hoặc WML.
    Portlet cung cấp thêm một số hàm chức năng sau:
    Persistent storage for preferences : Portlet cung cấp một đối tượng PortletPreferences dành cho việc lưu trữ những dư liệu của người sử dụng. Một ví dụ về dữ liệu mà portlet có thể lưu lại là look and feel của một portlet cho từng user. Những dữ liệu này sẽ được lưu trữ và kho dữ liệu đồng bộ. Chúng không bị mất đi khi khởi động lại server. Là một nhà phát triển bạn không cần phải suy nghĩ về cách lưu trữ của chúng.
    Request processing : So với servlet thì portlet có một bộ xử lý request phức tạp hơn. Nếu trong servlet, vòng đời của một request được gói gọn trong method service (…) thì vòng đời của một request trong một portlet được chia ra làm hai giai đoạn (phases). Giai đoạn một là xử lý request và giai đoạn hai là trả lại kết quả.
    Giai đoạn một : Vì trong một trang web portal, chúng ta có thể có nhiều portlet nên hệ điều hành portal sẽ phải tìm ra portlet nào mà người sử dụng gửi request tới và gọi phương thức processAction. Tất các các business logic của một portlet thường được xử lí trong giai đoạn này. Kết quả trả về được chứa trong portlet session hay actionResponse.
    Giai đoạn hai: Portal sẽ đi qua từng portlet trong trang web portal và gọi phương thức render. Ở giai đoạn này, một portlet thường lấy kết quả chứa trong portlet session hay response và chuyển kết quả này thành những mảng html mà người sử dụng có thể đọc hiểu.
    Portlet modes: Để đơn giản hóa công việc phát triển portlet cho nhà lập trình cũng như việc sử dụng portlet cho người dùng, chuẩn portlet chia portlet content ra nhiều trạng thái (mode) . Mỗi một trạng thái sẽ được làm những công việc nhất định. Ví dụ khi một người sử dụng chuyển tới một portlet và họ không biết sử dụng họ có thể chuyển qua mode trợ giúp (help) và đọc những hướng dẫn sử dụng. Sau đó quay trở lại mode view để sử dụng. Trong chuẩn portlet chúng ta thường tìm thấy 3 modes bắt buộc mà nhà phát triển portal phải hỗ trợ đó là : mode view, mode help, mode edit.
    Mode help: Đưa ra những hướng dẫn sử dụng cho người dùng.
    Mode view: Hiển thị nội dung ứng dụng của portlet.
    Mode edit: Cho phép người dùng cấu hình portlet làm việc theo ý muốn của họ. Ví dụ, khi người sử dụng chuyển tới mail portlet, họ phải nói cho portlet biết họ muốn lấy mail message từ mail server nào và user name, password ra sao. Tất cả những thông tin như vậy thường được làm trong portlet edit mode và lưu lại trong Portlet References.
    Ngoài ra chuẩn portlet còn khuyến khích các nhà phát triển portal nên hỗ trợ những mode như admin/config, mode này chỉ cho phép những power user như moderator, admin truy nhập. Một ví dụ cho mode này là user portlet, trong đó người sử dụng bình thường có thể vào view mode để tìm ra những thông tin của một user khác . Nhưng môt admin hay moderator có thể vào admin mode của user portlet để xóa hay sửa những thông tin.
    Một portal hỗ trợ admin mode sẽ đơn giản công việc lập trình cho một lập trình viên rất nhiều vì họ không phải lo lắng về việc quản lý người dùng cho portlet. Nhưng những lập trình viên cũng cần phải lưu ý trong việc sử dụng những mode mở rộng này vì có thể portal không hỗ trợ. Việc này đồng nghĩa với việc thị phần cho portlet của họ sẽ bị thu hẹp.
    Window state : Là trạng thái cửa sổ xác định không gian xuất hiện của nội dung được tạo ra bởi portlet trong một trang của portal. Nếu như bạn click vào nút maximize, portlet sẽ hiển thị toàn bộ và khi đó không gian làm việc của bạn sẽ chỉ có một portlet . Nếu bạn click vào nút minimized, portlet sẽ chỉ hiển thị thanh tiêu đề. Là một nhà phát triển, bạn sẽ tùy biến nội dung hiển thị thích hợp với bạn.
    User information: Thông thường, portlet cung cấp nội dung có tính cá nhân do những yêu cầu từ người sử dụng. Để làm việc này, chúng cần đòi hỏi những truy cập vào những thông số của người sử dụng như tên, email, số điện thoại,…Portlet API cung cấp khái niệm user attributes đề làm việc này. Lập trình viên có thể truy cập vào những thông tin này theo những cách chuẩn và trách nhiệm của quản trị là đưa những thông số đó vào kho thông tin thực của người sử dụng (thường là một LDAP server).
    Trên đây là sơ lược một số những đặc trưng cơ bản của portlet.

    Trả lờiXóa
  2. Xây dựng và triển khai một Portlet đơn giản
    Bây giờ chúng ta hãy cùng xây dựng một portlet đơn giản có tên là HelloWorld.
    1.Tạo một Web project có tên là HelloWorld . Tương tự như việc tạo một servlet, nó sẽ có tập tin /WEB-INF/web.xml dùng chó việc thiết lập những mô tả về project này.

    2.Thêm thư viện portlet-api-1.0.jar. Bạn có thể đặt classpath hay đưa vào kho thư viện của server hoặc jre. Thư viện này dùng để biên dịch portlet, có thể không cần triển khai thư viện này bởi tất cả các portal đều có sẵn.

    3.Tạo trong thư mục source của bạn một file là HelloWorld.java với source nguồn như dưới đây :
    2. public class HelloWorld extends GenericPortlet{
    3. protected void doView(RenderRequest request,
    4. RenderResponse response) throws
    5. PortletException, IOException {
    6. response.setContentType("text/html");
    7. response.getWriter().println("Hello Portlet");
    8. }
    9. }
    Mọi Portlet sẽ cài đặt Portlet interface. Interface này sẽ định nghĩa những phương thức của toàn bộ vòng đời của portlet. Nếu như bạn không muốn cài đặt tất cả những phương thức này, bạn cần cài đặt nó từ một lớp cha là GenericPortlet, lớp này đã cài đặt tất cả những phương thức của Portlet interface. Nó cung cấp những cài đặt mặc định của tất cả những phương thức trong toàn bộ vòng đời của portlet , khi đó chúng ta chỉ cần cài đặt những hàm cần thiết trong portlet của chúng ta.
    Nếu như bạn muốn portlet của bạn chỉ đóng vai trò hiển thị, bạn sẽ override phương thức doView của lớp GenericPortlet. Phương thức này sẽ nhận đầu vào là PortletRequest và PortletRespose. Gọi response.setContentType() đầu tiên trong hàm doView để thông báo cho portlet container về loại tài liệu sẽ được xuất tới client. Một đối tuợng thuộc lớp IllegalStateException sẽ được tạo ra nếu gặp lỗi. Để bắt đầu tạo ra nội dung trả về cho máy khách, bạn cần lấy lại một đối tượng thuộc lớp PrintWriter từ response object.
    4. Mọi portlet đều có một portlet.xml trong thư mục /WEB-INF, chúng sẽ chứa những mô tả triển khai của portlet. Tạo một portlet.xml giống như sau:
    10. <portlet>
    11. <description>HelloWorldDescription
    12. </description>
    13. <portlet-name>HelloWorld
    14. </portlet-name>
    15. <display-name>Hello World
    16. </display-name>
    17.
    18. <portlet-class>com.test.HelloWorld
    19. </portlet-class>
    20. <expiration-cache>-1
    21. </expiration-cache>
    22. <supports>
    23. <mime-type>text/html</mime-type>
    24. <portlet-mode>VIEW
    25. </portlet-mode>
    26. </supports>
    27. <supported-locale>en
    28. </supported-locale>
    29.
    30. <portlet-info>
    31. <title>Hello World</title>
    32. <short-title>Hello World
    33. </short-title>
    34. <keywords>Hello,pluto</keywords>
    35. </portlet-info>
    36.</portlet>
    Thẻ <portlet-name> khai báo tên của portlet, thẻ <portlet-class> chỉ rõ tên đầy đủ (bao gồm cả package) của lớp portlet. Thẻ <expiration-cache>chỉ rõ số giây mà nội dung của portlet được lưu trữ lại. Tuy nhiên , nếu như bạn có một vài kích hoạt trên portlet, nội dung mới sẽ được tạo ra bất luận chưa hết thời gian cache.
    Thẻ <supports> chỉ rõ các mode sẽ hỗ trợ những loại nội dung nào thông qua thẻ <mime-type>. Trong ví dụ này, hàm doView() sẽ xuất ra nội dung dưới dạng text/html khi đó chỉ có dạng văn bản sẽ là text/html chỉ có ở trạng thái view. Nếu như bạn có thêm những trạng thái khác bạn có thể tạo thêm thẻ <support> với nội dung tương tự. Mặc dù có đủ ba trạng thái của portlet là VIEW, EDIT, HELP nhưng chỉ có VIEW mới hỗ trợ MIME type là WML.
    Bạn cũng có thể chỉ rõ locale cho portlet bằng cách sử dụng thẻ <supported-locale>. Thẻ <title> được sử dụng để chứa tiêu đề cho portlet. Nếu bạn sử dụng tiêu đề có tính quốc tế, bạn có thể chỉ rõ resources (thường là file properties) nằm trong thẻ <resource-bundle>. Trong trường hợp này container sẽ chọ file .properties thích hợp dựa trên locale của người sử dụng.
    5.Mọi portlet là một ứng dụng web, do đó chúng cần có một file là web.xml cùng với file portlet.xml.
    37. <web-app>
    38. <display-name>Hello World Portlet
    39. </display-name>
    40. <welcome-file-list
    41. <welcome-file>index.jsp
    42. </welcome-file>
    43. </welcome-file-list>
    44.</web-app>
    6.Bước cuối cùng là biên dịch file java và đóng gói vào file.war.

    Trả lờiXóa
  3. Bằng cách nào mà một trang Portal được tạo.

    Hầu hết portal server đều dựa trên việc triển khai một ứng dụng web trong một ứng dụng server như Tomcat, sử dụng servlet để sử lí những request tới portal server. Exo Portal cũng không nằm ngoài qui luật đó, bạn có thể tìm thấy Exo-Tomcat trong thư mục của Exo Portal Server sau khi giải nén.
    Chúng ta có thể nói một trang portal được tạo ra bởi hai loại nội dung. Một được tạo ra bởi những trang portlet riêng lẻ, một được tạo ra bởi portal server.
    Trong Exo Portal, bất cứ khi nào người sử dụng gửi một request, sẽ được điều khiển tới servlet. Phụ thuộc vào request của trang, nó sẽ xác định rõ danh sách những portlet cần để hiển thị. Một khi đã có được danh sách này, nó sẽ chuyển đổi những portlet đó vào trong những thread khác nhau và sau đó tập hợp lại những nội dung do chúng tạo ra.
    Kết luận
    Portlet API đáng dấu vào bước thành công lớn của công nghệ servlet, bởi vì có khả năng sử dụng những cơ sở hạ tầng của ứng dụng server tồn tại. Bạn có thể gọi EJB từ portlet, có thể bắt đầu và tham gia vào những giao dịch toàn diện trên server. Trong trường hợp khác, portlet có thể làm mọi thứ mà servlet có thể làm, đó là cách tập trung những nghiệp vụ xử lí.

    Trả lờiXóa
  4. mình đang làm đề tài về WSRP (Webservice for Remote portlet), bác có tài liệu nào về đề tài này thì chia sẻ cho em với, mail của em là habk77dhbk@yahoo.com, thanks bac nhiêu

    Trả lờiXóa
  5. xin lỗi vì mình không có tài liệu nào, lâu rồi không làm về cái này nữa.

    Trả lờiXóa
  6. minh dang nghien cuu viet portlet cho liferay voi myeclipse nhung khong biet viet nhu the nao
    Bac co the huong dan giup cach viet mot porlet helloworld a->z duoc khong.tu khi dang nhap myeclipse den khi dich va chay thu lun.
    Thanks Bac nhieu.

    Trả lờiXóa
  7. Xin lỗi, mình đã không làm về portal nữa.

    Trả lờiXóa
  8. Chán, share phải đến cùng chứ.

    Trả lờiXóa
  9. anh thuận ơi ! anh viết tiếp về cái này đi . đang đọc đến đây thì hết . buồn quá . Em đang học về cái này nhưng không có ai hướng dẫn , lan man mà mãi không đi được tới đâu :( !

    Trả lờiXóa

nhudinhthuan@gmail.com