Tài liệu Liferay VN
Tham khảo tài liệu 'tài liệu liferay vn', công nghệ thông tin, tin học văn phòng phục vụ nhu cầu học tập, nghiên cứu và làm việc hiệu quả
Các bước cơ bản để phát triển Portlet theo chuẩn JSR-168 -
Phần 1
16/07/2007
JSR-168 là tập hợp các Java APIs để phát triển Portlet. Có nhiều lý do để thiết kế portlet theo chuẩn JSR-168. Một
trong các lý do đó là "Portalbility - Tính tương thích", tức là khả năng có thể sử dụng portlet trên các portal server khác nhau.
Bài này minh họa một số kỹ thuật thực tế trong việc phát triển portlet theo chuẩn JSR-168.
1. Luôn dùng các hàm API mã hóa URL trong portlet
Đối với file JSP thông thường, để chèn ảnh ta dùng đoạn code sau:
Tuy nhiên trong portlet, chúng ta lại phải dùng như sau:
2. Không "thêm đuôi" cho url sau hàm encodeURL
Tức là các URL đã được dùng làm tham số cho hàm RenderRequest's encodeUrl() là phải hoàn chỉnh. Chúng ta không thể "gắn
đuôi" các url sau khi gọi hàm encodeUrl().
Xét ví dụ sau:
Đúng:
Sai: (Thêm đuôi logo.gif sau khi đã gọi hàm encodeURL)
3. Dùng namespace trong các script ở client-side
Nếu không dùng namespace, cùng một portlet xuất hiện hai lần trong một trang sẽ xung đột nhau (tức là có 2 instances của
cùng một portlet cùng chạy).Giải pháp là sử dụng tag trước các tên hàm, tên biến. tag này sẽ xuất một
định dạng duy nhất đối với từng instance của portlet.
Ví dụ:
Sai:
function validate(foo) {
if (foo.bar.value=="") {
return false;
}
return true;
}
Đúng:
function validate(foo) {
if (foo.bar.value=="") {
return false;
}
return true;
}
4. Luôn xác định Content-Type cho Portlet Response
Theo chuẩn JSR-168, "A portlet must set the content type of the response using the setContentType method of the
RenderResponse interface."
Vì vậy, ta luôn xác định Content-Type như sau:
public class MyPortlet extends GenericPortlet {
public void doView(RenderRequest request, RenderResponse response)
throws PortletException, IOException {
response.setContentType("text/html");
PrintWriter writer = response.getWriter();
writer.println("I set my content type!");
}
}
5. Không gửi Cookie từ Portlet
Theo chuẩn JSR-168, hàm addCookie() của HttpServletResponse thực sự không có thiết lập Cookie. Vậy nếu bạn muốn lưu
các thông tin người dùng, nên sử dụng portlet's session, database hoặc file.
Vấn đề đa ngôn ngữ khi phát triển Portlet
08/07/2007
Bài viết trình bày thao tác cơ bản để viết các portlet đa ngôn ngữ trong Liferay Extension Environment
1 - Nguyên tắc cơ bản:
Không bao giờ viết các Key liên quan đến ngôn ngữ (title, message, label) một cách trực tiếp trong file jsp. Bạn hãy lưu tất cả
các Key này trong file Language-ext.properties (đối với ngôn ngữ là English)
Đối với các ngôn ngữ khác bạn cũng lưu trong các file Language-ext_countrycode.properties (Lưu ý: dấu gạch dưới,
underscore, chứ không phải dấu trừ, minus).
See also:ISO 3166 Codes (Countries)
Trong LR4.3, file Language_ext.properties >được lưu trữ trong thư mục ext\ext-impl\classes\content
Ví dụ cụ thể đối với một số ngôn ngữ thông dụng:
• tiếng Việt: Language-ext_vn.properties
• tiếng Đức: Language-ext_de.properties
Các file Language_ext.properties được lưu trữ trong thư mục: liferay\ext\ext-ejb\classes\content
2 - Format của file Language_ext.properties
Các file .properties có format vô cùng đơn giản như sau:
Key = value
Comment (ghi chú) bắt đầu bằng dấu thăng #
Ví dụ 1: File Language_ext.properties (English)
## This is the comment
## Portlet names
##
javax.portlet.title.EXT_1=Reports
## This is the comment
## Messages
##
view-reports=View Reports
product=Product
Ví dụ 2: File Language_ext_vn.properties (tiếng Việt)
## Đây là phần ghi chú
## Tên Portlet
##
javax.portlet.title.EXT_1=Báo cáo
## Đây là phần ghi chú
## Messages
##
view-reports=Xem báo cáo
product=Sản phẩm
Lưu ý: phần value không đặt trong dấu quote ("" hoặc '')
3 - Sử dụng (key,value) như thế nào trong file JSP:
Bây giờ chúng ta đã có danh sách các cặp (key,value) trong file .properties, mỗi lần cần lấy giá trị của Key trong file JSP, bạn
sử dụng lệnh sau:
Ví dụ 3: Tạo 1 Button View Report trong file JSP
Đặt Portlet trực tiếp trong template
Có những portlet mà bạn muốn đặt trực tiếp trong template, để những portlet này luôn xuất
hiện trong mọi trang, ví dụ như Search Portlet, hoặc Navigation Portlet.
• Để thực hiện điều này, trong file .vm bạn hãy dùng lệnh sau:
$taglibLiferay.runtime("PORTLET_NAME")
• Còn đối với template dùng .jsp, bạn dùng:
Web server, application server, web container, servlet container, portlet
container là gì ?
Đây quả thật là một câu hỏi không dễ trả lời. Nó liên quan đến rất nhiều khái niệm, và một
số khái niệm đôi khi được hiểu khác nhau trong các ngữ cảnh khác nhau.
Hồi xưa mình có làm một bài tập, viết một webserver đơn giản. Tức là một web server chỉ trả
lời các HTTP request từ browser. Ví dụ khi đánh địa chỉ http://localhost/index.html để yêu cầu
browser gửi request đến webserver, thì cái web server đơn giản của mình sẽ phân tích cái
request đó để xem browser cần gì. Ở đây là yêu cầu file index.html. Vậy là webserver sẽ đọc
file index.html và gửi trả lại nội dung file này đến browser bằng giao thức HTTP. Đó là cái
web server đơn giản nhất.
Vậy một web server cơ bản chỉ có xử lý HTTP Request & Response. Nếu webserver cung cấp nhiều dịch vụ
hơn theo tiêu chuẩn J2EE, ví dụ về bảo mật, transaction, lifecycle-management... thì họ gọi nó
là web container.
Bây giờ, nếu web container cung cấp các dịch vụ liên quan đến servlet. Ví dụ như khi ta gõ
http://localhost/viewreport thì webserver sẽ dựa vào cấu hình trong file web.xml để tìm xem, ứng
với cái url (viewreport) như trên thì sẽ thi hành các dịch vụ gì và trả lời browser những gì. Ở
đây công việc có thể là truy vấn dữ liệu trong database server, format dữ liệu theo mẫu (dùng
thư viện JasperReport chẳng hạn), trả về browser một dữ liệu theo format PDF hoặc HTML.
Một cái web container như vậy bây giờ được gọi là servlet container.
Giờ ta lại mở rộng cái servlet container thêm một chút, cung cấp các dịch vụ liên quan đến
portlet, như quản lý vòng đời, khởi tạo portlet, trả lời các request kiểu portlet (như
ActionRequest, RenderRequest) .... thì servlet container bây giờ sẽ trở thành một portlet container.
Application server hiểu nôm na là một web server đặt biệt, bao gồm
Còn application server là gì ?
nhiều tính năng và thành phần (component) như servlet container, EJB container, JSP engine....
Và những khái niệm trên, chỉ khi nào mà tự tay implement thì may ra mới hiểu cho thật thấu
đáo. Bây giờ thì cứ nắm sơ sơ như vậy thôi.