国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
liferay二次開發(fā)指南
2.6.2 portlet.xml
portlet.xml用來定義Portlet的諸如部署名稱、初始化參數、支持模式、resource bundle等普通的初始化信息,包括:portlet-name、display-name、portlet-class、init-param、expiration-cathe、supports、portlet-info、security-role-ref等等。其正式的規(guī)范請參考:http://java.sun.com/xml/ns/Portlet/Portlet-app_1_0.xsd 。根目錄為portlet-webapp。
portlet-name:Portlet的規(guī)范名稱,在Portlet應用中必須唯一,主要用在Portlet部署和映射中。
display-name:供部署工具調用的Portlet簡稱,在Portlet應用中必須唯一。
portlet-class:Portlet對應的類,這個類必須直接或者間接的繼承javax.Portlet.GenericPortlet。
init-param:初始化參數,有成對的<name>和<value>子元素。通常定義Portlet相應模式下可用的JSP頁面。
expiration-cathe:定義Portlet加載允許最長的過期時間,以秒為單位。-1代表用不過期。
supports:定義Portlet支持的模式。所有的Portlet都必須支持瀏覽模式。
當Web 應用中有多個的Portlet時,可以統(tǒng)一的在Portlet。xml中定義一組的<portlet>元素。
       <portlet>
              <portlet-name>TestPortlet</Portlet-name>
              <display-name>TestPortlet</display-name>
              <portlet-class>com.educhina.portal.FirstPortlet</Portlet-class>
              <init-param>
                     <name>view-jsp</name>
                     <value>/view.jsp</value>
              </init-param>
              <init-param>
                     <name>edit-jsp</name>
                     <value>/edit.jsp</value>
              </init-param>
              <expiration-cache>0</expiration-cache>
              <supports>
                     <mime-type>text/html</mime-type>
              </supports>
              <supports>
                     <mime-type>text/html</mime-type>
                     <Portlet-mode>edit</Portlet-mode>
              </supports>
              <portlet-info>
                     <title>educhina Test Portlet</title>
                     <short-title> educhina Test Portlet </short-title>
                     <keywords> educhina Test Portlet </keywords>
              </portlet-info>
              <security-role-ref>
                     <role-name>guest</role-name>
              </security-role-ref>
       </portlet>
 
2.6.3 liferay-Portlet.xml
定義Portlet默認可用的用戶組、默認模板、是否支持多個實例等,規(guī)范由http://www.liferay.com/dtd/liferay-Portlet-app_3_5_0.dtd 定義。
liferay-portlet.xml主要包含單獨或者成組的<portlet>、<role-mapper>。其中,<portlet>下包含<portlet-name>、<struts-path>、<use-default-template>、<instanceable>等子元素,<portlet-name>在應用中必須唯一,且要跟portlet.xml相同;<role-mapper>下包含成對的<role-name>、<role-link>子元素。具體的元素含義請查看上述dtd定義。
<liferay-portlet-app>
       <portlet>
              <portlet-name> TestPortlet </portlet-name>
              <struts-path> TestPortlet </struts-path>
              <use-default-template>true</use-default-template>
              <instanceable>true</instanceable>
       </portlet>
       <role-mapper>
              <role-name>administrator</role-name>
              <role-link>Administrator</role-link>
       </role-mapper>
       <role-mapper>
              <role-name>guest</role-name>
              <role-link>Guest</role-link>
       </role-mapper>
       <role-mapper>
              <role-name>power-user</role-name>
              <role-link>Power User</role-link>
       </role-mapper>
       <role-mapper>
              <role-name>user</role-name>
              <role-link>User</role-link>
       </role-mapper>
</liferay-portlet-app>
2.6.4 liferay-display.xml
定義Portlet默認的所屬類別。Liferay Portal對Portlet實行按類別管理和劃分用戶權限。正如我們在用戶策略中提到的,可以制定某個類別可用的用戶組、用戶和角色,方便權限控制。Liferay-display.xml規(guī)范由http://www.liferay.com/dtd/liferay-display_3_5_0.dtd 定義。
Liferay-display.xml中,<display>下成組的<category>描述了可用的類別,其中portlet元素的id必須與liferay-portlet.xml的portlet-name保持一致,且在應用中唯一。
<display>
       <category name="category.test">
              <portlet id="TestPortlet" />
       </category>
</display>
2.6.5 liferay-layout-templates.xml
定義Portal可用的布局。正如我們在布局與品質中提到的那樣,Portal采用tpl文件來規(guī)劃桌面的布局。liferay-layout-templates。xml采用成組的layout-template來構建一個可用的布局列表。此xml的規(guī)范由http://www.liferay.com/dtd/liferay-layout-templates_3_6_0.dtd 來定義。
本文采用Liferay Portal默認的布局,暫時不需要定義自己的布局,故不準備深入討論。讀者有興趣可以自己查看相關資料。
<layout-templates>
       <layout-template id="1_column" name="1 Column">
              <template-path>/html/layouttpl/1_column。tpl</template-path>
       </layout-template>
       <layout-template id="2_columns_i" name="2 Columns (50/50)">
              <template-path>/html/layouttpl/2_columns_i。tpl</template-path>
       </layout-template>
       <layout-template id="3_columns" name="3 Columns">
              <template-path>/html/layouttpl/3_columns。tpl</template-path>
       </layout-template>
       <layout-template id="1_2_1_columns" name="1-2-1 Columns">
              <template-path>/html/layouttpl/1_2_1_columns。tpl</template-path>
       </layout-template>
</layout-templates>
2.6.7 liferay-look-and-feel。xml
定義Portal可用品質的模板、圖片、樣式表等等,定義完畢后,Portal可以通過“布局與品質”管理工具來進行品質的切換。Liferay-look-and-feel.xml規(guī)范由http://www.liferay.com/dtd/liferay-look-and-feel_3_5_0.dtd 定義。
本文采用Liferay Portal默認的品質,不準備對品質的自定義深入探討。有興趣的讀者可以查看相關資料。
第二部分 Liferay Portal 二次開發(fā)
本部分主要內容
GenericPortlet 自定義Portlet類 部署描述文件
第三章 開發(fā)自己的Portlet
在了解了Liferay Portal的基礎架構,初步體會Liferay Portal良好的個性化定制之后,本章將開始Liferay Portal二次開發(fā)之旅,講述并擴展Portlet的超類GenericPortlet,創(chuàng)建或者修改部署描述文件,構建屬于自己的Portlet。
第一節(jié)  重要的基類:GenericPortlet
像Servlet一樣,編寫的Portlet也必須直接或者間接的擴展基類GenericPortlet,這個是由JCP針對Portal提出的JSR168規(guī)范定義的。只要擴展自規(guī)范的GenericPortlet,所有的Portlet都可以在支持JSR168規(guī)范的Portal服務器上運行。
GenericPortlet統(tǒng)一定義了可供Portal容器識別和調用的方法,包括:
public Init():初始化;
public Init(PortletConfig) :初始化;
public getInitParameter(String):取得在Portlet。xml中定義的初始化參數;
public getInitParameterNames():取得在Portlet。xml中定義的全部初始化參數;
public getPortletConfig():取得包含初始化參數的配置對象PortletConfig實例;
public getPortletContext():取得Portlet上下文;
public getPortletName():取得在Portlet。xml中定義的Portlet名稱。
public getResourceBundle(Locale) :取得Portlet國際化的Resource Bundle;
protected getTitle(RenderRequest) :取得Portlet的標題;
protected doView(RenderRequest,RenderResponse) :Portlet瀏覽模式的處理方法;
protected doEdit(RenderRequest,RenderResponse) :Portlet編輯模式的處理方法;
protected doHelp(RenderRequest,RenderResponse) :Portlet幫助模式的處理方法;
protected doDispatch(RenderRequest,RenderResponse) :Portlet行為分發(fā);
protected processAction(RenderRequest,RenderResponse) :Portlet處理Action Request的方法;
protected render(RenderRequest,RenderResponse):Portal處理Render Request的方法;
public destroy():Portlet銷毀,終止其生命周期。
在Portlet Portal運行的時候,doView、doEdit、doHelp三個方法分別被調用,用以生成Portlet標記。同樣也可以調用Servlet生成Portlet標記,或者不調用JSP或者Servlet,直接在方法中得到PrintWriter然后用最簡單的pw.println()打印出內容。這個過程類似Servlet,如下:
PrintWriter pw = renderResponse.getWriter();
pw.println(“Hello,world!”);
與Servlet類似,可以使用getInitParamter(String s)得到配置文件中Portlet的初始值,只不過Servlet在web.xml中,而Portlet在portlet.xml中。
portlet.xml:
<init-param>
<name>jspView</name>
<value>/jsp/view。jsp</value>
</init-param>
針對如上portlet.xml中的初始化信息,可以采用如下的調用方式:
SimplePortlet.java:
String jspName = getPortletConfig()。getInitParameter("jspView");
第二節(jié)  Portlet標簽
跟Servlet一樣,Portlet也自定義了很多靈活的標簽。通過這些標簽,可以調用Portlet內部的參數比如renderResponse、renderRequest、PortletConfig等,在JSP中跟Portlet通信。當然,在使用之前,除了要在web。xml中聲明標簽庫外,還要在JSP的頭部聲明標簽庫調用:<%@ taglib uri="http://java。sun。com/Portlet" prefix="Portlet" %>
3.2.1  defineObjects標簽
在使用Portlet典型標簽之前,要見聲明<portlet:defineObjects/>,這樣才可以使用其他的標簽。defineObjects中間不允許定義任何屬性和包含任何內容。
3.2.2  renderURL標簽
屬性 值類型 對應值
windowState String minimized
normal
maximized。
PortletMode String view, edit , help
var String
secure
String true
false
創(chuàng)建一個當前RenderURL,當訪問它時將使Portlet窗口變?yōu)樽畲蠡癄顟B(tài),模式變?yōu)闉g覽。<portlet:param/>子元素會在生成的RenderURL中增加number、page兩個參數和值。
3.2.3  actionURL標簽
屬性 值類型 對應值
windowState String minimized
normal
maximized。
portletMode String view, edit , help
var String
secure
String true
false
<portlet:actionURL windowState="normal" PortletMode="edit">
<portlet:param name="action" value="login"/>
</portlet:actionURL>
創(chuàng)建一個當前ActionURL,當訪問它時將使Portlet窗口變?yōu)檎顟B(tài),模式變?yōu)榫庉嫛?lt;Portlet:param/>子元素會在生成的ActionURL中增加action參數和值。
renderURL和actionURL兩個標簽在諸如生成form表單的action等方面特別有用。
3.2.4  param標簽
屬性 值類型
name String
用在renderURL和actionURL標簽內部,用來在生成的URL中增加參數和值。param標簽不運行body內容存在。
3.2.5  namespace標簽
為目前的Portlet產生一個唯一的Value,防止與其他Portlet或者Portal上面的Value沖突。
上述標簽的具體屬性及其約束,請參閱{PORTAL_HOME}/liferay/WEB-INF/tld/liferay-portlet.tld 。
第三節(jié)  Portal的對象
JSR168給Portal定義了幾個特別的對象,用來操作Portal特有的信息。這些對象跟Servlet的對象有點類似,又有點不同。這些對象都封裝在{PORTAL_HOME}/common/lib/ext/portlet.jar包中,具體支持實現要視Portal服務器而定。
3.3.1  Request對象
Portlet中的Request與Servlet的Request一樣接受客戶端發(fā)送的請求,但是與Servlet不同,Portlet的Request分為Action Request及Render Request兩種類型,因此Portlet接口中定義了兩種方法用來處理不同的Request。分別是processAction(ActionRequest request,ActionResponse response) 和render(RenderRequest request,RenderResponse response),分別用以處理Action Request和Render Request。某種意義上來講,render方法類似Servlet中的service方法,doView,doEdit,doHelp方法又類似doGet,doPost方法。
①、RenderRequest和ActionRequest
PortletRequest分為RenderRequest和ActionRequest兩種,分別由renderURL和actionURL來觸發(fā)。renderURL是actionURL的一種優(yōu)化。Portlet的開發(fā)過程中盡量使用renderURL而避免actionURL。actionURL適用于有確實的Action(行為)的情況下。比如說,表單form提交后Persistent狀態(tài)的改變、session的改變、perference的修改等等。renderURL通常用來處理Portlet的導航。舉個例子:
使用actionURL:
<%
PortletURL pu = renderResponse.createActionURL();
pu.setParameter("ACTION","LOGIN");
<form name="usrform" method="post" action="<%=pu.toString()%>">
%>
說明:表單提交最好使用Post方法而不是Get方法,因為某些Portal服務器可能會將內部狀態(tài)編碼到URL的Query字符串中。
使用renderURL:
<%
PortletURL pu=renderResponse.createRenderURL();
Pu.setParameter("PAGE",Number);
%>
<a href="<%=pu%>">下一頁</a>
②、renderURL和actionURL的處理方式
當客戶端請求是由一個renderURL觸發(fā)的時候,Portal服務器會調用該Portal頁面所有Portlet的render方法。
而當客戶端請求是由一個actionURL觸發(fā)的時候,Portal服務器會先按用該頁面所有Portlet的processAction方法再調用render方法。所以,要明確自己到底使用那種URL來出發(fā)客戶端請求。
③、RenderRequest和ActionRequest的parameter參數作用范圍
當客戶端請求由一個actionRequest觸發(fā)時,所有parameter參數的取得都必須在processAction方法中進行。比如:
public void processAction(ActionRequest req,ActionResponse res){
String str = req.getParameter("ACTION");
//response.setRenderParameter("ACTION",action);
}
public void doView(ActionRequest req,ActionResponse res){
String str = req.getParameter("ACTION");
}
如上processAction方法中,getParameter方法將能成功得到表單中的參數ACTION所對應的值,因為我們知道,當目標Portlet的processAction方法運行完后,Portlet Container將調用Portal頁面中所有Portlet的render方法.但是實際上doView方法中使用getParameter不會得到任何值.但是如果把processAction方法中注釋了的一行解除注釋的話,你就可以在doView方法中的得到參數ACTION對應的值. 這說明action request的參數,render方法中不可以直接取到.必須使用了setRenderParameter方法,再次傳遞一次.
3.3.2  Response對象
與Request對象一樣,Response對象也有兩種:RenderResponse和ActionResponse,分別用來封裝對應的RenderRequest和ActionRequest的返回信息,比如重定向、窗口狀態(tài)、Portlet模式等。他們兩者的父類PortletResponse擁有serPorperty和getPorperty兩個方法,用來傳遞信息給Portal容器。
ActionResponse主要用來處理以下功能:
a、 重定向
b、 改變窗口狀態(tài)、Portlet模式
c、 傳遞parameter參數到RenderRequest中去
RenderResponse主要用來提供以下功能:
a、 設置ContentType
b、 得到OutputStream和Writer對象,用來輸出頁面內容
c、 Buffering緩沖
d、 設定Portlet的標題,但是必須在Portlet輸出前調用,否則將被忽略
3.3.3  PortletConfig對象
和ServletConfig對象類似,PortletConfig對象提供對Portlet初始化信息以及PortletContext對象存取的方法。
和ServletConfig對象不同的是,PortletConfig對象提供對Portlet的標題等資源的I18N支持,可以通過設定不同的Resource Bundle文件以提供多種語言支持。
3.3.4  Session對象
由于容器不同,Portal的Session對象與Servlet的Session對象略有不同。
由于Portlet處于Portal服務器的緣故,Portlet的Session分為Application Scope和Portlet Scope。兩者的區(qū)別在于:
①、Application Scope范圍的Session中保存的對象,對于同一個Portlet應用范圍內的所有Portlet都是可用的。
②、Portlet Scope范圍的Session中保存的對象,只對本Portlet可用,其他Portlet即使在同一個應用中,也不可用。
但是對于Portlet應用來說,可以通過HttpSession來訪問。畢竟Portlet應用也是Web應用。在使用Session對象的時候,最好能明確指出使用的是那個Scope范圍的Session。比如:
<portlet:actionURL windowState="NORMAL" PortletMode="view" var="pu1">
<portlet:param name="ACTION" value="ApplicationScope"/>
</portlet:actionURL>
<portlet:actionURL windowState="NORMAL" PortletMode="view" var="pu2">
<portlet:param name="ACTION" value="PortletScope"/>
</portlet:actionURL>
這個JSP創(chuàng)建了兩個ActionURL,分別產生了兩種PortletSession對象。
PortletSession ps = req.getPortletSession();
if(ps.getAttribute("PortletSession.AS",PortletSession.APPLICATION_SCOPE)!=null){
app=ps.getAttribute("PortletSession.AS",PortletSession.APPLICATION_SCOPE).
toString();
}
if(ps.getAttribute("PortletSession.PS",PortletSession.PORTLET_SCOPE)!=null){
Portlet=ps.getAttribute("PortletSession.PS",PortletSession.PORTLET_SCOPE).
toString();
}
以上代碼根據需要取得不同Scope范圍的Session對象值。
同一個應用下,可以直接通過ServletSession取得PortletSession。APPLICATION_SCOPE范圍下的Session對象值。
HttpSession se = request.getSession();
if(se.getAttribute("PortletSession.AS")!=null){
app=se.getAttribute("PortletSession.AS");
}
3.3.5  Preference對象
Preference對象被設計用來實現用戶的個性化設置,可以幫助用戶對Portlet進行符合用戶需求的顯示定制和行為定制,可以替代部分的數據庫功能。需要指出的是,Preference對象只是用來存取簡單的配置信息,并不能完全替代數據庫應用。
Preference對象對于配置信息采用鍵-值的形式存取,用戶可以將需要的信息暫時保存在Preference中。
PortletPreference p= req.getPortletPreferences();
p.setValue("educhina.username","educhina");
p.store();
Preference對象用來存取用戶的個性化信息,所以不同用戶的Preference對象不能共享,這點跟Session不同。
可以在Portlet.xml中配置Preference信息,如下:
<Portlet-preferences>
  <preference>
    <name>educhina。username</name>
    <value>educhina</value>
    <read-only>true</read-only>
  </preference>
</Portlet-preferences>
另外,還可以配套使用PreferencesValidator對象,對Portlet的Preference在存儲之前進行驗證,以確保Preference的正確性。
具體規(guī)范可以參照http://java.sun.com/xml/ns/Portlet/Portlet-app_1_0.xsd 的<complexType name="preferenceType">部分。
第四節(jié)  編寫自己的Portlet類
Liferay Portal內部集成了78個Portlet,包括直接用PrintWriter輸出的、調用JSP輸出的、調用Servlet輸出的,數據來源有直接從數據庫取得的、通過Web Service取得的等等。這里,我們只講述直接用PrintWriter輸出的和調用JSP輸出的,目的在于講述如何編寫自己的Portlet類。其他的與此類似,不贅述。
3.4.1  開發(fā)環(huán)境
IDE:Eclipse V3.0.1
JDK:V1.4.2_06
ANT:V1.6.2
Tomcat:V5.0(集成在Liferay Portal中)
Liferay Portal:liferay-portal-pro-3.6.0-tomcat
3.4.2  準備工作
①、安裝JDK V1.4.2_06,在系統(tǒng)環(huán)境變量中增加變量JAVA_HOME,指向JDK安裝目錄。
②、安裝ANT,在系統(tǒng)環(huán)境變量中增加變量ANT_HOME,指向ANT安裝目錄。
③、下載并啟動Eclipse V3.0.1.
④、下載并解壓縮liferay-portal-pro-3.6.0-tomcat.zip到某一文件夾,該文件夾即為{PORTAL_HOME}。
⑤、在Eclipse中新建一個Java項目,命名為TestPortal,路徑為D:/TestPortal,將{PORTAL_HOME}/common/ext/portlet.jar以外部jar的形式添加到庫中。下文中,D:/TestPortal將以{APP_HOME}代稱。在{APP_HOME}下創(chuàng)建文件夾webapp、deploy、bak。項目缺省輸出文件夾為{APP_HOME}/webapp/WEB-INF/classes 。
⑥、在{APP_HOME}/webapp/WEB-INF目錄下創(chuàng)建web.xml,內容如下:
<?xml version="1。0"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc。//DTD Web Application 2。3//EN" "http://java。sun。com/dtd/web-app_2_3。dtd">
<web-app>
<display-name>TestPortal</display-name>
</web-app>
⑦、在{APP_HOME}/webapp/WEB-INF下創(chuàng)建tld文件夾,將{PORTAL_HOME}/liferay/WEB-INF/tld/liferay-portlet.tld拷貝到創(chuàng)建的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目錄下創(chuàng)建view.jsp和edit.jsp,view.jsp代碼如下,edit.jsp類似:
<table cellpadding="8" cellspacing="0" width="100%">
<tr>
<td>
<font class="Portlet-font" style="font-size: x-small;">
This is a <b>Sample JSP Portlet</b> used in viewing model。 Use this as a quick way to include JSPs。
</font>
</td>
</tr>
</table>
JSP文件不能包含關于HTML的<head>、<body>、<html>的信息,只能包含原來位于<body></body>內部的HTML內容。那些<head>、<body>、<html>信息由Portal頁面來提供。
只有在JSP頁面中使用<%@ taglib uri="http://java.sun.com/portlet" prefix="portlet" %>和<portlet:defineObjects/>,JSP頁面才可以直接操作Portlet的一些變量,比如:renderResponse、renderRequest、portletConfig。
第五節(jié)  修改Web部署描述文件
正如2.6.1所指出的那樣,要保證Portlet能夠在Liferay Portal成功部署,必須對web.xml進行必要的修改,添加Portlet監(jiān)聽器、Servlet映射、Portlet標簽庫。在先前web.xml的<display>節(jié)點下增加如下內容:
<listener>
<listener-class>com.liferay.portal.servlet.PortletContextListener</listener-class>
</listener>
<servlet>
<servlet-name>HelloWorldPortlet</servlet-name>
<servlet-class>com.liferay.portal.servlet.PortletServlet</servlet-class>
<init-param>
<param-name>Portlet-class</param-name>
<param-value>com.educhina.portal.HelloWorldPortlet</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorldPortlet</servlet-name>
<url-pattern>/HelloWorldPortlet/*</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>HelloJSPPortlet</servlet-name>
<servlet-class>com.liferay.portal.servlet.PortletServlet</servlet-class>
<init-param>
<param-name>Portlet-class</param-name>
<param-value>com.educhina.portal.HelloJSPPortlet</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>HelloJSPPortlet</servlet-name>
<url-pattern>/HelloJSPPortlet/*</url-pattern>
</servlet-mapping>
<taglib>
<taglib-uri>http://java.sun.com/Portlet</taglib-uri>
<taglib-location>/WEB-INF/tld/liferay-Portlet.tld</taglib-location>
</taglib>
其中,<listener>節(jié)點是增加一個監(jiān)聽器,以便Liferay Portal監(jiān)聽所有針對Portlet的操作。<servlet>以及<servlet-mapping>是將上述兩個Portlet類加入Servlet容器中。Portlet類實質上也是Servlet。<tablib>是將Liferay Portal標簽庫加入列表中,以便JSP調用。
 
第六節(jié)  創(chuàng)建Liferay Portal部署描述文件
修改完web.xml之后,還要創(chuàng)建2.6所說的三個Portlet部署描述文件:portlet.xml、liferay-portlet.xml、liferay-display.xml。
①、portlet.xml
portlet.xml定義Portlet的初始化信息。這里,我們在portlet.xml中增加兩個Portlet節(jié)點,分別代表HelloWorldPortlet和HelloJSPPortlet。其中,HelloWorldPortlet支持PringWriter輸出,HelloJSPPortlet支持JSP輸出;兩者都支持瀏覽和編輯兩種模式。HelloJSPPortlet需要定義兩個init參數,告訴系統(tǒng)JSP文件的位置。
<portlet>
<portlet-name>HelloWorldPortlet</portlet-name>
<display-name>HelloWorldPortlet</display-name>
<portlet-class>com.educhina.portal.HelloWorldPortlet</portlet-class>
<expiration-cache>0</expiration-cache>
<supports>
<mime-type>text/html</mime-type>
</supports>
<supports>
<mime-type>text/html</mime-type>
<Portlet-mode>edit</Portlet-mode>
</supports>
<portlet-info>
<title>HelloWorldPortlet</title>
<short-title>HelloWorldPortlet</short-title>
<keywords>HelloWorldPortlet</keywords>
</portlet-info>
<security-role-ref>
<role-name>guest</role-name>
</security-role-ref>
<security-role-ref>
<role-name>power-user</role-name>
</security-role-ref>
<security-role-ref>
<role-name>user</role-name>
</security-role-ref>
</portlet>
<portlet>
<portlet-name>HelloJSPPortlet</portlet-name>
<display-name>HelloJSPPortlet</display-name>
<portlet-class>com。Educhina.portal.HelloJSPPortlet</portlet-class>
<init-param>
<name>view-jsp</name>
<value>/view。jsp</value>
</init-param>
<init-param>
<name>edit-jsp</name>
<value>/edit。jsp</value>
</init-param>
<expiration-cache>0</expiration-cache>
<supports>
<mime-type>text/html</mime-type>
</supports>
<supports>
<mime-type>text/html</mime-type>
<Portlet-mode>edit</Portlet-mode>
</supports>
<portlet-info>
<title>HelloJSPPortlet</title>
<short-title>HelloJSPPortlet</short-title>
<keywords>HelloJSPPortlet</keywords>
</portlet-info>
<security-role-ref>
<role-name>guest</role-name>
</security-role-ref>
<security-role-ref>
<role-name>power-user</role-name>
</security-role-ref>
<security-role-ref>
<role-name>user</role-name>
</security-role-ref>
</portlet>
②、liferay-Portlet.xml
Liferay-Portlet.xml主要定義Portlet的模板、實例總數、是否允許重復定義等。同樣的,我們增加了兩個<Portlet>節(jié)點,代表HelloWorldPortlet和HelloJSPPortlet。
<?xml version="1。0"?>
<!DOCTYPE liferay-Portlet-app PUBLIC "-//Liferay//DTD Portlet Application 3。5。0//EN" "http://www。liferay。com/dtd/liferay-Portlet-app_3_5_0。dtd">
<liferay-portlet-app>
<portlet>
<Portlet-name>HelloWorldPortlet</Portlet-name>
<struts-path>HelloWorldPortlet</struts-path>
<use-default-template>true</use-default-template>
<instanceable>true</instanceable>
</portlet>
<portlet>
<Portlet-name>HelloJSPPortlet</Portlet-name>
<struts-path>HelloJSPPortlet</struts-path>
<use-default-template>true</use-default-template>
<instanceable>true</instanceable>
</portlet>
<role-mapper>
<role-name>administrator</role-name>
<role-link>Administrator</role-link>
</role-mapper>
<role-mapper>
<role-name>guest</role-name>
<role-link>Guest</role-link>
</role-mapper>
<role-mapper>
<role-name>power-user</role-name>
<role-link>Power User</role-link>
</role-mapper>
<role-mapper>
<role-name>user</role-name>
<role-link>User</role-link>
</role-mapper>
</liferay-portlet-app>
③、liferay-display.xml
liferay-display.xml定義Portlet所屬類別。Liferay Portal默認定義了一個category.test類別,這里,我們將HelloWorldPortlet和HelloJSPPortlet歸屬到category.test。
<?xml version="1。0"?>
<!DOCTYPE display PUBLIC "-//Liferay//DTD Display 3。5。0//EN" "http://www。liferay。com/dtd/liferay-display_3_5_0。dtd">
<display>
<category name="category。test">
<Portlet id="HelloWorldPortlet" />
<Portlet id="HelloJSPPortlet" />
</category>
</display>
至此,一個簡單的Portlet就開發(fā)完成了。接下來,我們把它部署到Liferay Portal上。
第三部分 Liferay Portal部署
本部分主要內容
Portlet部署  ANT  管理Portlet
第四章 部署自己的Portlet
Liferay Portal跟Tomcat5.0集成在一起,從本質上講,liferay-portal-pro-3.6.0-tomcat.zip是一個Tomcat壓縮包,只是其中將liferay作為默認應用,并將跟Portlet有關的操作都交給liferay應用處理而已。因此,Liferay Portal支持所有針對Tomcat5.0的部署方式,包括:手動部署、Ant部署,并且支持熱部署。
第一節(jié)  手動部署
手動部署可以采用拷貝文件夾、war部署、編寫部署文件三種方式:
①、拷貝文件夾:與單純的Tomcat一樣,我們可以將{APP_HOME}/webapp目錄拷貝到{PORTAL_HOME}/webapps/下,該webapp目錄名為TestPortal。啟動Liferay Portal(雙擊{PORTAL_HOME}/bin/startup。bat)即可。
②、war部署:或者將{APP_HOME}/webapp打包成TestPortal.war,拷貝war到{PORTAL_HOME}/webapps/下,啟動Liferay Portal,讓Tomcat自動解壓。在命令行模式下切換到{APP_HOME}/webapp目錄,執(zhí)行 jar cvf TestPortal.war * 。
③、編寫部署文件:
{PORTAL_HOME}/conf/Catalina/localhost目錄下,創(chuàng)建TestPortal.xml文件,內容如下:
<Context path="/TestPortal" docBase="D:/TestPortal/webapp" debug="0" reloadable="true" crossContext="true">
</Context>
部署成功后,登錄Liferay Portal,可以在桌面底部的下拉列表中看到HelloWorldPortlet和HelloJSPPortlet兩個Portlet。將它們添加到桌面中。
第二節(jié)  Ant自動部署
確保之前已經安裝Apache Ant,并正確添加ANT_HOME到系統(tǒng)環(huán)境變量。
①、拷貝之前打包的TestPortlet.war到{APP_HOME}/deploy目錄;
②、從http://prdownloads。sourceforge。net/lportal/Portlet-deployer-3。6。0。xml 下載Portlet-deployer-3.6.0.xml 到{APP_HOME}/deploy,改名為build。xml以便Ant自動加載;
③、確保JDK1.4.2和Ant 1.6安裝成功,并配置到系統(tǒng)環(huán)境變量;
④、確保Tomcat或者其他服務器已經正確安裝,或者Liferay Portal正常安裝。
編輯build.xml,使其只想你的應用服務器或者Servlet容器。比如,如果你安裝JBoss+Jetty到/opt/liferay目錄,那么編輯build.xml,確保只有JBoss+Jetty部分沒有被注釋,修改app.server屬性為/opt/liferay。
Build.xml默認是開啟JBoss+Jetty部分,本文采用的是Tomcat集成包,所以將JBoss+Jetty部分注釋掉,開始Tomcat部分。修改app.server.dir屬性,指向{PORTAL_HOME}。如下圖:
⑤、命令行切換到到{APP_HOME}/deploy目錄,執(zhí)行 ant deploy ,系統(tǒng)會自動將TestPortal。war解壓,必要時修改web.xml、portlet.xml等部署文件,將解壓后的TestPortal文件夾拷貝到{PORTAL_HOME}/webapps目錄下。
啟動Liferay Portal之前,建議先確認修改后的web.xml、portlet.xml等部署文件是否正確。
第三節(jié)  加入Liferay Portal自有列表
之前我們提到過,Liferay Portal集成了78個默認的Portlet應用。這些應用都通過{PORTAL_HOME}/liferay/WEB-INF/目錄下的portlet.xml、liferay-portlet.xml、liferay-display。xml描述。我們只要更改這些描述文件,就可以將我們自己的應用加入到Liferay Portal的Portlet列表中了,效果跟手動部署和Ant自動部署一樣。
①、拷貝{APP_HOME}/webapp目錄的內容到{PORTAL_HOME}/liferay/html/Portlet目錄下,更改文件夾名稱為TestPortal。
②、將TestPortal/WEB-INF/classes文件夾剪切到{PORTAL_HOME}/liferay/WEB-INF目錄下。
③、將TestPortal/WEB-INF/web。xml中<servlet>、<servlet-mapping>的內容合并到{PORTAL_HOME}/liferay/WEB-INF/web.xml中。刪除TestPortal/WEB-INF/web.xml。
④、將TestPortal/WEB-INF/Portlet.xml中關于HelloWorldPortlet和HelloJSPPortlet的<portlet>的內容合并到{PORTAL_HOME}/liferay/WEB-INF/portlet.xml中。刪除TestPortal/WEB-INF/ portlet.xml。
⑤、將TestPortal/WEB-INF/liferay-portlet.xml中關于HelloWorldPortlet和HelloJSPPortlet的<portlet>的內容合并到{PORTAL_HOME}/liferay/WEB-INF/liferay-portlet.xml中。刪除TestPortal/WEB-INF/liferay-portlet.xml。
⑥、將TestPortal/WEB-INF/liferay-display.xml中關于HelloWorldPortlet和HelloJSPPortlet的<portlet>的內容合并到{PORTAL_HOME}/liferay/WEB-INF/liferay- display.xml中。刪除TestPortal/WEB-INF/ liferay- display.xml。
這個方法比較復雜,而且不容易擴展和調試,通常不建議采用。
第四節(jié)  普通Java Web應用轉化為Portlet應用
隨著開發(fā)的深入,我們希望能夠將原來的Java Web應用遷移到Liferay Portal,構建真正的企業(yè)門戶。Liferay Portal靈活的二次開發(fā)機制,允許用戶將各種各樣的內容集成到Portal平臺上來,消除信息孤島。將一個Java Web應用轉化為Portlet應用的步驟如下:
①、撰寫擴展自GenericPortlet的Portlet和JSP頁面。這個Portlet可以使用PrintWriter輸出或者調用JSP頁面輸出方式。通常,如果Java Web應用是采用MVC三層模式,那么只需要更改View層就可以了。
②、修改web.xml,增加2。6。1所述的Portlet監(jiān)聽器和Portlet標簽庫,增加針對上步驟所寫的servlet和servlet映射。
<servlet>
<servlet-name>yourPortlet</servlet-name>
<servlet-class>com.liferay.portal.servlet.PortletServlet</servlet-class>
<init-param>
<param-name>Portlet-class</param-name>
<param-value>full.name.of.yourPortlet</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>yourPortlet</servlet-name>
<url-pattern>/yourPortlet/*</url-pattern>
</servlet-mapping>
③、創(chuàng)建portlet.xml,增加相應的Portlet定義信息,規(guī)范參考2.6.2。
④、創(chuàng)建liferay-portlet.xml,增加相應的Portlet定義信息,規(guī)范參考2.6.3。
⑤、創(chuàng)建liferay-display.xml,增加相應的Portlet類別定義信息,規(guī)范參考2.6.4。
⑥、拷貝portlet.jar和liferay-Portlet.tld到當前應用。其中,portlet.jar是Portlet API包,作用類似servlet-api.jar,位于{PORTAL_HOME}/common/lib/ext/liferay-portlet.tld是Liferay Portal提供的Portlet標簽庫。
⑦、選擇適當的部署方式,將修改后的Java Web應用部署到Portlet平臺上。
第四部分 附錄
本部分主要內容
資源網站 Portlet范例 參考資料 后序
第五章 相關資源
作為一個開源的門戶產品,Liferay Portal已經比較成熟,有比較齊全的文檔。隨著應用的深入,開源免費的中文化文檔也在陸續(xù)出現。
第一節(jié) 資源網站
Liferay Portal 官方網站:http://www.liferay.com 
Liferay Portal 中文網站:http://www.liferay.cn 
Liferay Portal 論壇:http://forums.liferay.com 
Tracker : http://support.liferay.com 
郵件列表:http://sourceforge.net/mailarchive/forum.php?forum=lportal-development 
JavaLobby專題:http://www.javalobby.org/articles/liferay/
OSQS專題:http://cstsolaris.cst.nait.ab.ca/ist410/gerry/liferay/index.jsp 
Leonardsoko1專題:http://www.leonardsokol.com/liferay/
Developer專題:http://www.developer.com/java/web/article.php/10935_3372881_1
第二節(jié)  示例
Liferay Portal隨程序包提供了豐富的documentation,其中的Portlet Examples對Portal內置的Hello World、IFrame、Calendar、Message Boards、Mail五個Portlet進行了比較詳細的解說。啟動Liferay Portal后,瀏覽這里:
http://localhost/web/guest/documentation/development/Portlet
另外,Liferay Portal還在官方網站上提供了Sample Layout Template、Sample Portlet、Sample Themes供下載。其中,Sample Portlet包括Sample JSP Portlet、Sample Struts Portlet、Sample JSF SUN Portlet、Sample JSF MyFaces Portlet。瀏覽這里:
http://localhost/web/guest/downloads/sample_Portlet

第六章 參考資料
①、文檔
《JSR168 PORLET標準手冊漢化整理》 作者:Jini等
《Portlet應用開發(fā)(JSR168)》 作者:Terry Lee
《(原創(chuàng)翻譯)Liferay-Portal架構》                   作者:eamoi
②、網站
http://www.liferay.com
http://www.liferay.cn
后序
研究Liferay Portal屬于半路出家。從開始到本文完成,倆月有余。作為一個開源的Portal產品,Liferay的確值得稱許,雖然還有不少bug。在本文截稿的時候,Liferay Portal V3.6.1已經發(fā)版,新版本在拖拉Portlet、Spring遠程傳輸和布局熱部署方面有比較大的提升。本文不會就此終結,暫稱V1.0,作為前段工作的總結。本文的用戶策略部分參考了同事Kevin的文檔,特此感謝。
PS:寫文章真的很費腦筋。
本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現有害或侵權內容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
關于Liferay的配置文件 —— 基于Struts開發(fā)Portlet
Liferay簡單Struts Portlet開發(fā)
為Liferay開發(fā)Portlet - 玻璃瓶中的光明
Apache 門戶項目組介紹
基于 Struts 2 構建 WebSphere Portal 上的 Portlet 應用
tomcat web.xml配置
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯系客服!

聯系客服