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

5 678 4
Tài liệu Tài liệu Liferay VN ppt

Đang tải... (xem toàn văn)

Thông tin tài liệu

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="http://java.sun.com/portlet" 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. . 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. 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"

Ngày đăng: 24/01/2014, 00:20

Từ khóa liên quan

Mục lục

  • 1. Luôn dùng các hàm API mã hóa URL trong portlet

  • 2. Không "thêm đuôi" cho url sau hàm encodeURL

  • 3. Dùng namespace trong các script ở client-side

  • 4. Luôn xác định Content-Type cho Portlet Response

  • 5. Không gửi Cookie từ Portlet

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan