第四節 ?編寫自己的Portlet類
Liferay Portal內部集成了78個Portlet,包括直接用PrintWriter輸出的、調用JSP輸出的、調用Servlet輸出的,數據來源有直接從數據庫取得的、通過Web Service取得的等等。這里,我們只講述直接用PrintWriter輸出的和調用JSP輸出的,目的在于講述如何編寫自己的Portlet類。其他的與此類似,不贅述。
3.4.1 ? 開發環境
IDE:Eclipse V
JDK:V
ANT:V
Tomcat:V5.0(集成在Liferay Portal中)
Liferay Portal:liferay-portal-pro-
3.4.2 ? 準備工作
①、安裝JDK V
②、安裝ANT,在系統環境變量中增加變量ANT_HOME,指向ANT安裝目錄。
③、下載并啟動Eclipse V
④、下載并解壓縮liferay-portal-pro-
⑤、在Eclipse中新建一個Java項目,命名為TestPortal,路徑為D:\TestPortal,將{PORTAL_HOME}\common\ext\portlet.jar以外部jar的形式添加到庫中。下文中,D:\TestPortal將以{APP_HOME}代稱。在{APP_HOME}下創建文件夾webapp、deploy、bak。項目缺省輸出文件夾為{APP_HOME}\webapp\WEB-INF\classes 。
⑥、在{APP_HOME}\webapp\WEB-INF目錄下創建web.xml,內容如下:
??????
⑦、在{APP_HOME}\webapp\WEB-INF下創建tld文件夾,將{PORTAL_HOME}\liferay\WEB-INF\tld/liferay-portlet.tld拷貝到創建的tld文件夾下,備用。
⑧、新建一個Java包com.educhina.portal 。
3.4.3 ? HelloWorldPortlet
HelloWorldPortlet類計劃用單純的PrintWriter輸出Portlet標記片斷。在包com.educhina.portal下新建Java類HelloWorldPortlet,這個類必須擴展自javax.Portlet.GenericPortlet類。設計讓HelloWorldPortlet支持瀏覽和編輯兩種模式,所以HelloWorldPortlet重寫doView和doEdit方法。簡單的代碼如下:
package com.educhina.portal;
import java.io.IOException;
import javax.Portlet.GenericPortlet;
import javax.Portlet.PortletException;
import javax.Portlet.RenderRequest;
import javax.Portle.RenderResponse;
public class HelloWorldPortlet extends GenericPortlet{
?????? public void doView(RenderRequest req, RenderResponse res)
throws IOException, PortletException {
????????????? res.setContentType("text/html");
????????????? res.getWriter().println("HelloWorld!");
?????? }
?????? public void doEdit(RenderRequest req,RenderResponse res)
throws IOException,PortletException {
????????????? res.setContentType("text/html");
????????????? res.getWriter().println("HelloWorld!");
?????? }
}
doView和doEidt方法從RenderRequest取得PrintWriter對象,直接輸出一個String字符“HelloWorld!”。這個String字符將作為HelloWorldPortlet的片斷內容。
3.4.4 ? HelloJSPPortlet
HelloJSPPortlet類計劃調用外部JSP輸出。同樣的,HelloJSPPortlet也要擴展自GenericPortlet類。HelloJSPPortlet調用getPortletConfig().getInitParameter("..")方法,取得在Portlet。xml中配置的view-jsp和edit-jsp參數值,以此確定JSP頁面的具體位置。然后調用PortletRequestDispatcher的include方法,將JSP頁面加載到RenderResponse。代碼如下:
package com.educhina.portal;
import java.io.IOException;
import javax.Portlet.GenericPortlet;
import javax.Portlet.PortletException;
import javax.Portlet.PortletRequestDispatcher;
import javax.Portlet.RenderRequest;
import javax.Portlet.RenderResponse;
public class HelloJSPPortlet extends GenericPortlet{
public void doView(RenderRequest req, RenderResponse res)
throws IOException, PortletException {
res.setContentType("text/html");
String jspName = getPortletConfig().getInitParameter("view-jsp");
PortletRequestDispatcher rd = getPortletContext().getRequestDispatcher(jspName);
rd.include(req,res);
}
public void doEdit(RenderRequest req,RenderResponse res)
throws IOException,PortletException {
res.setContentType("text/html");
String jspName = getPortletConfig().getInitParameter("edit-jsp");
PortletRequestDispatcher rd = getPortletContext().getRequestDispatcher(jspName);
rd.include(req,res);
}
}
在{APP_HOME}/webapp目錄下創建view.jsp和edit.jsp,view.jsp代碼如下,edit.jsp類似:
?????? ????????????? ????????????? This is a Sample JSP Portlet used in viewing model。 Use this as a quick way to include JSPs。 ????????????? ??????
JSP文件不能包含關于HTML的、、的信息,只能包含原來位于內部的HTML內容。那些、、信息由Portal頁面來提供。
只有在JSP頁面中使用<%@ taglib uri="http://java.sun.com/portlet" prefix="portlet" %>和
第五節? 修改Web部署描述文件
正如
??????
??????
??????
??????
?????????????
?????????????
?????????????
????????????????????
????????????????????
?????????????
?????????????
??????
??????
?????????????
?????????????
??????
??????
?????????????
?????????????
?????????????
????????????????????
????????????????????
?????????????
?????????????
??????
??????
?????????????
?????????????
??????
??????
?????????????
?????????????
??????
其中,
第六節? 創建Liferay Portal部署描述文件
修改完web.xml之后,還要創建2.6所說的三個Portlet部署描述文件:portlet.xml、liferay-portlet.xml、liferay-display.xml。
①、portlet.xml
portlet.xml定義Portlet的初始化信息。這里,我們在portlet.xml中增加兩個Portlet節點,分別代表HelloWorldPortlet和HelloJSPPortlet。其中,HelloWorldPortlet支持PringWriter輸出,HelloJSPPortlet支持JSP輸出;兩者都支持瀏覽和編輯兩種模式。HelloJSPPortlet需要定義兩個init參數,告訴系統JSP文件的位置。
??????
?????????????
?????????????
?????????????
?????????????
?????????????
????????????????????
?????????????
?????????????
????????????????????
????????????????????
?????????????
?????????????
????????????????????
????????????????????
????????????????????
?????????????
?????????????
????????????????????
?????????????
?????????????
????????????????????
?????????????
?????????????
????????????????????
?????????????
??????
??????
?????????????
?????????????
?????????????
?????????????
????????????????????
????????????????????
?????????????
?????????????
????????????????????
????????????????????
?????????????
?????????????
?????????????
????????????????????
?????????????
?????????????
????????????????????
????????????????????
?????????????
?????????????
????????????????????
????????????????????
????????????????????
?????????????
?????????????
????????????????????
?????????????
?????????????
????????????????????
?????????????
?????????????
????????????????????
?????????????
??????
②、liferay-Portlet.xml
Liferay-Portlet.xml主要定義Portlet的模板、實例總數、是否允許重復定義等。同樣的,我們增加了兩個
3.5.0//EN" "http://www.liferay.com/dtd/liferay-Portlet-app_3_5_0.dtd">
??????
?????????????
?????????????
?????????????
?????????????
??????
??????
?????????????
?????????????
?????????????
?????????????
??????
??????
?????????????
?????????????
??????
??????
?????????????
?????????????
??????
??????
?????????????
?????????????
??????
??????
?????????????
?????????????
??????
③、liferay-display.xml
liferay-display.xml定義Portlet所屬類別。Liferay Portal默認定義了一個category.test類別,這里,我們將HelloWorldPortlet和HelloJSPPortlet歸屬到category.test。
3.5.0//EN" "http://www.liferay.com/dtd/liferay-display_3_5_0.dtd">
??????
?????????????
?????????????
??????
至此,一個簡單的Portlet就開發完成了。接下來,我們把它部署到Liferay Portal上。