Menu

Liferay 6.2: Hook và tự viết taglib


English version
Hôm nay, mình sẽ thảo luận về việc làm thế nào để viết một jsp taglib. Tại sao cần phải tự viết taglib riêng? Vì các tag này được sử dụng lại trong nhiều dự án khác nhau và các taglib trong các thư viện có sẵn không đáp ứng được nhu cầu của bạn. Ví dụ: tạo một taglib để thể hiện thông tin của một sản phẩm trong các dự án thương mại điện tử hoặc thể hiện thông tin của một quyển sách trong cửa hàng sách online,...
Trong bài này, chúng ta sẽ tạo ra một taglib thể hiện thông tin của một cuốn sách, các thông tin gồm: tiêu đề (title), phiên bản (edition version), số ISBN (ISBN), các tác giả (authors), hình bìa (cover image), tổng số trang (number of pages), nhà xuất bản (publisher),...
Dưới đây là ba thành phần mà bạn phải quan tâm khi muốn tạo một taglib mới. Đó là:
  1. Một tệp tin a *.tld
  2. Các lớp Java
  3. Một vài tệp tin jsp

Tệp tin TLD

Đầu tiên, tệp tin *.tld sẽ mô tả thông tin của tag và các thuộc tính của nó. Vậy, có bao nhiêu tag và bao nhiêu thuộc tính? Với ví dụ trên, có hai tag là: tag book và tag author. Chúng ta sẽ xem chi tiết các tác này nhé.
  1. thẻ book:
    • title: tiêu đề của sách (for example: Introduce to Algorithms,..)
    • edition: thông tin phiên bản
    • ISBN: số ISBN
    • cover: đường dẫn đến ảnh bìa
    • numberOfPage: tổng số trang
    • publisherName: tên nhà xuất bản (NXB)
    • publisherURL: địa chỉ website của NXB
  2. thẻ author:
    • name: tên tác giả
    • institute: nơi công tác
    • url: blog hoặc site cá nhân
Sau đây là chi tiết tệp tin *.tld. Tệp tin này được đặt tên là bookstore.tld và được lưu trong thư mục WEB-INF/tld.


bookstore.tld là một tệp tin có định dạng xml. Nó định nghĩa thông tin về các thẻ và các thuộc tính của mỗi thẻ. Mình sẽ giải thích một vài dòng mình cho là cần thiết (hoặc bạn có thể click vào đây để xem chi tiết):
  • Dòng thứ 3: Gọi các thông tin gồm: xml-namespace (xmlns), schema reference attribute,...
  • Dòng thứ 4: Thông tin phiên bản.
  • Dòng thứ 5: Tên rút gọn của taglib.
  • Dòng thứ 6: url của taglib. url này được sử dụng khi các file jsp gọi nó.
  • Dòng thứ 7-67: Định nghĩa thẻ book
  • Dòng thứ 8: Tên của thẻ ("book")
  • Dòng thứ 9: Đường dẫn đầu đủ (package) đến một lớp Java. Lớp này sẽ quản lý và xử lý các dữ liệu của thẻ.
  • Dòng thứ 10: Kiểu nội dụng. Trong trường hợp này là JSP (các giá trị có thể có là {empty, JSP, scriptless, tagdependent}).
  • Dòng thứ 12-17: Định nghĩa thuộc tính title của thẻ book. 
  • Dòng thứ 14: Tên của thuộc tính ("title")
  • Dòng thứ 15: Thuộc tính này liệu có bắt buộc phải có hay không.
  • Dòng thứ 16: Giá trị được thay đổi trong thời gian thực
  • Dòng thứ 17: Kiểu dữ liệu của thuộc tính
  • Có rất nhiều các thuộc tính khác, nhưng mình chỉ liệt kê một và cái mình cho là quan trọng mà thôi. Các thành phần khác các bạn tự tìm hiểu.

Các lớp xử lý

Bây giờ ta sẽ xem xét lớp sử lý nhé. Mỗi thẻ sẽ có một lớp xử lý, ví dụ: thẻ book có lớp BookTag (com.blogspot.chingovan.taglib.bs.BookTag) và thẻ author có lớp AuthorTag (com.blogspot.chingovan.taglib.bs.AuthorTag). Hãy xem lớp BookTag;

Lớp BookTag kế thừa từ lớp BaseBookTag.

Chúng ta sẽ xem sét hai lớp. Lớp BaseBookTag kế thừa từ lớp IncludeTag (com.liferay.taglib.util.IncludeTag). Lớp này đã khai báo một vài trường và cá phương thức tiện ích. Chúng ta chỉ cần thêm vào các trường của mình vào lớp BaseBookTag. Ở đây, ta đã thêm cá trường như title, edition, isbn, cover, numberOfPage, publisherName và publisherURL. Bên cạnh đó, ta cũng thêm ba trường tĩnh là trường _ATTRIBUTE_NAMESPACE là tên duy nhất không trùng với bất cứ tên của thẻ nào, _END_PAGE và _START_PAGE là đường dẫn tương đối đến các tệp tin JSP cụ thể nào đó.
Phương thức  doStartTag được gọi tại lần đầu tiền khi lớp này được gọi và chúng ta sẽ ghi nhớ namespace bằng cách gọi phương thức setAttributeNamespace(_ATTRIBUTE_NAMESPACE);
Theo sau là các phương tức getter và setter. Phương thức getEndPage và getStartPage trả lại đường dẫn đến các trang JSP. Cuối cùng, phương thức setAttributes được sử dụng để ghi nhớ giá trị của các trường để truyền sang các tệp tin JSP.

Các tệp tin JSP

Mỗi thẻ sẽ có vài tệp tin như start.jsp, end.jsp, init.jsp,... thông thường, tệp tin init.jsp được sử để khai báo và gọi các thư viện liên quan. Ví dụ:

Ta sẽ giải thích vài dòng trong tệp tin này:
  • Dòng thứ 10: ta gọi các thư viện mặc định của framework Liferay
  • Dòng thứ 13-34: ta lấy các giá trị của các trường. Các giá trị này được truyền khi chúng ta sử dụng các thẻ.
Giờ hãy xem xét tệp tin start.jsp.

Dòng đầu tiên, gọi tệp tin init.jsp. Sau đó, chúng ta có thể sử dụng các giá trị được truyền vào từ ứng dụng sử dụng thẻ này. Tệp tin end.jsp tương tự như start.jsp.

Summary

Giờ bạn đã có một thẻ của mình. Việc sử dụng thẻ tương tự như các thẻ khác thôi (ví dụ: thẻ aui:select, thẻ liferay-ui:search-container,...) Bạn có thể xem ví dụ tại đây.
Đây là toàn bộ portlet. Cảm ơn đã đọc và chúc may mắn 

Không có nhận xét nào:

Đăng nhận xét