Tải bản đầy đủ (.doc) (5 trang)

Tài liệu Tài liệu Liferay VN ppt

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (150.43 KB, 5 trang )

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:
<img src="/<%= request.getContextPath()%>/images/logo.gif"/>


Tuy nhiên trong portlet, chúng ta lại phải dùng như sau:
<img src="<%= renderResponse.encodeURL(renderRequest.getContextPath()+
"/images/logo.gif") %>"/>




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:
<@= renderResponse.encodeURL(renderRequest.getContextPath()+"/images/logo.gif")@>

Sai: (Thêm đuôi logo.gif sau khi đã gọi hàm encodeURL)
<@= renderResponse.encodeURL(renderRequest.getContextPath()+"/images/")+"logo.gif"@>

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 <portlet:namespace/> 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:
<script>
function validate(foo) {
if (foo.bar.value=="") {
return false;
}
return true;
}
</script>


Đúng:
<%@taglib uri=" prefix="portlet"%>
<script>
function validate<portlet:namespace/>(foo) {
if (foo.bar.value=="") {
return false;
}
return true;
}
</script>

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("<p>I set my content type!</p>");
}
}

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:
<%=LanguageUtil.get(pageContext, "Ở đây bạn đặt KEY")%>
Ví dụ 3: Tạo 1 Button View Report trong file JSP
<input class="portlet-form-button" type="submit"
value="<%=LanguageUtil.get(pageContext,"view-report")%>">
Đặ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:
<liferay-portlet:runtime portletName="PORTLET_NAME" />
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.
Còn application server là gì ? Application server hiểu nôm na là một web server đặt biệt, bao gồm
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.

×