ZK/入門指南/安裝和配置
在 Tomcat 上安裝 ZK
1. 從 http://tomcat.apache.org 下載 Tomcat 並安裝,如果您尚未安裝。(已測試透過連結 https:// 或 https://:8080 訪問)
2. 停止 Tomcat
3. 解壓縮 zk-*.zip 或 zk-*.tar.gz
4. 將 dist/lib/*.jar、dist/lib/zkforge/*.jar 和 dist/lib/ext/*.jar 複製到 $TOMCAT_HOME/shared/lib($TOMCAT_HOME 是您安裝 Tomcat 的位置)。不要在 $TOMCAT_HOME/shared/lib 資料夾內使用子資料夾結構。
5. 啟動 Tomcat
6. 瀏覽到 https:///manager 或 https://:8080/manager 並將 demo/bin/zkdemo.war 部署到 Tomcat,或者直接將其複製到 $TOMCAT_HOME/webapps。如果您更喜歡直接複製,則必須先停止 Tomcat。如果檔案丟失,請改為獲取 zksandbox.war。
7. 瀏覽到 https:///zkdemo/userguide、https://:8080/zkdemo/userguide 或 https://:8080/zksandbox/,具體取決於您為 Tomcat 配置的內容。
從 3.0 版本開始,ZK 與 Tomcat 4.1 無縫協作,因為它不再依賴於 JSP 2.0 技術。
如果您使用的是 3.0 之前的 ZK 舊版本,則必須將 jsp-api.jar 複製到 $TOMCAT_HOME/common/lib。jsp-api.jar 檔案可以在 Tomcat 的下載檔案中找到,或者在 Subversion 中找到。
ZK 的日誌記錄器不支援 Tomcat 5.0.30 版本。
感謝 Ed Clement
要解決:java.security.AccessControlException: access denied (java.util.PropertyPermission org.zkoss.util.resource.checkPeriod read) [後面跟著堆疊跟蹤]
1) 開啟 Tomcat Web 應用程式許可權檔案。在我的例子中,它位於 /etc/tomcat5.5/policy.d/04webapps.policy(不確定此位置或檔名會有多大差異)2) 我在檔案末尾添加了以下行
//added for zkdemo webapp
grant codeBase "file:${catalina.home}/webapps/zkdemo/-" {
permission java.security.AllPermission;
};
3) 儲存檔案並重新啟動 Tomcat(不確定是否需要,但我還是做了)
顯然,此解決方案應該適用於 zk web 應用程式,您只需要將“zkdemo”更改為您嘗試部署/執行的 Web 應用程式的名稱。
待定。
問題:Executions.getCurrent().getRemoteUser() 返回 null。
解決方案:啟用 Tomcat 身份驗證配置
web.xml
<security-constraint>
<web-resource-collection>
<web-resource-name>zkLoader</web-resource-name>
<url-pattern>*.zul</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<web-resource-collection>
<web-resource-name>auEngine</web-resource-name>
<url-pattern>/zkau/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<description>Authorized Users Group</description>
<role-name>test</role-name>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>NONE</transport-guarantee>
</user-data-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
</login-config>
<security-role>
<description>Test role</description>
<role-name>test</role-name>
</security-role>
tomcat-users.xml
<tomcat-users> <user name="testuser" password="testpassword" roles="test"/> </tomcat-users>
1. 從 http://caucho.com/download/index.xtp 下載 Resin 並安裝,如果您尚未安裝。
2. 停止 Resin
3. 解壓縮 zk-1.0.0.zip 或 zk-1.0.0.tar.gz
4. 將 dist/lib/*.jar 複製到 $RESIN_HOME/lib($RESIN_HOME 是您安裝 Resin 的位置)。
5. 將 dist/lib/ext/*.jar 複製到 $RESIN_HOME/lib
6. [可選] 將 dist/lib/zkforge/*.jar 複製到 $RESIN_HOME/lib(這取決於您是否需要來自 ZK Forge 的元件)
7. 透過將其直接複製到 $RESIN_HOME/webapps 將 demo/bin/zkdemo.war 部署到 Resin。
8. 啟動 Resin。
9. 瀏覽到 https:///zkdemo/userguide 或 https://:8080/zkdemo/userguide,具體取決於您的配置。
作者:Peter Manchev
1. 從 http://www.mortbay.org/jetty/index.html 下載 Jetty 並安裝,如果您尚未安裝。
2. 停止 Jetty。
3. 解壓縮 zk-1.x.x.zip 或 zk-1.x.x.tar.gz
4. 將 dist/lib/*.jar 複製到 $JETTY_HOME/lib
($JETTY_HOME is where you installed Jetty.)
5. 將 dist/lib/ext/*.jar 複製到 $JETTY_HOME/lib
6. [可選] 將 dist/lib/zkforge/*.jar 複製到 $JETTY_HOME/lib
(It depends whether you need component from ZK Forge)
7. 透過將其直接複製到 $JETTY_HOME/webapps 將 demo/bin/zkdemo.war 部署到 Jetty。
8. 啟動 Jetty。
9. 瀏覽到 https:///zkdemo/userguide 或 https://:8080/zkdemo/userguide,具體取決於您的配置。
1. 從 http://www.jboss.com/downloads/index 下載 Jboss 並安裝,如果您尚未安裝。
2. 使用連結 https://:port 測試 Jboss,如果正常,請停止伺服器。
3. 解壓縮 zk-2.2.0-RC.zip 或 zk-2.2.0-RC.tar.gz
4. 將 dist/lib/*.jar 和 dist/lib/*/*.jar 複製到 $JBOSS_HOME/server/default/lib
5. 將 zkdemo.war 複製到 $JBOSS_HOME/server/default/deploy
6. 啟動伺服器。
7. 瀏覽到 https:///zkdemo/userguide 或 https://:8080/zkdemo/userguide,具體取決於您為 Jboss 配置的內容。
作者:Juan Jose Buendia Mardones(智利)
1. 按照說明在 tomcat 4.1 上安裝 ZK Ajax。
2. 下載檔案
bsh-bsf-2.0b4.jar bsh-core-2.0b4.jar bsh-2.0b2.jar and copy them to the lib directory under default.
3. 更改 web.xml 以使其符合 servlet 2.3 規範。
4. 我們仍在解決一些問題,我將在獲得完整解決方案後更新此記錄。
當我嘗試 Mars Chen 給出的解決方案時,一些基於 Jboss 平臺構建的元件無法再工作。但是,當我執行我的解決方案時,其中一個 ZK 元件(上傳檔案)無法工作。但目前,我採取了一種變通方法,在後臺使用 tomcat 5.5。
作者:Yaniv Ran(美國)
2.1 我找到了另一個簡單的解決方案:將 ZK 分發的 bsh.jar 放入 JBoss lib 目錄以替換 bsh-core-version.jar。
請參考BeanShell官方網站。== http://www.beanshell.org/download.html == bsh-version.jar包含bsh-core-version.jar中的所有檔案。
作者:陳火星 (臺灣)
簡介:OC4J 10.1.3(版本 3)是Oracle Containers For Java的第一個生產版本,支援J2EE 1.4規範(Servlet 2.4)。之前的版本10.1.20.2、10.20.1.1僅支援J2EE 1.3(帶Servlet 2.3),ZK無法與這些版本一起使用。
1. 從http://www.oracle.com下載OC4J 10.1.3或更高版本並安裝。
2. 必須設定OC4J以便在命令列使用-userThreads引數執行(oc4j.cmd,在OPMN中,這在opmn.xml內完成<data id="oc4j-options" value="-userThreads" />)。
3. 解壓縮zk-1.2.0-2006-04-07.zip或更高版本。
4. 將dist/lib/*.jar和dist/lib/ext/*.jar複製到$OC4J_HOME/j2ee/home/applib。
5. 啟動OC4J伺服器,並在提示時輸入新的oc4jadmin密碼,或者如果伺服器已啟動則重新啟動伺服器。
6. 開啟“企業管理器”應用程式 - 只需瀏覽到https://:8888/em/。
7. 以oc4jadmin身份登入並轉到應用程式-->部署頁面。
8. 部署zkdemo.war(按照螢幕上的說明操作)。
9. 瀏覽到https://:8888/zkdemo/userguide。
- 將“/zkdemo”替換為您在部署期間在EM中輸入的上下文URI。
- 啟動OC4J伺服器
bin/oc4j -start
1. 從[1]下載Weblogic 9.1。
2. 啟動Weblogic安裝程式並接受所有預設設定。
3. 完成預設安裝後,透過單擊“開始” ->“程式” ->“BEA產品” ->“工具” ->“配置嚮導”建立Weblogic域。
4. 選擇“建立新的Weblogic域”並單擊“下一步”。
5. 在“選擇域源”中接受預設設定並單擊“下一步”。
6. 在“配置管理員使用者名稱和密碼”中輸入密碼並單擊“下一步”。
7. 在“配置伺服器啟動模式和JDK”中接受所有預設設定並單擊“下一步”。
8. 在“配置環境設定和服務”中選擇“否”並單擊“下一步”。
9. 在“建立Weblogic域”中接受所有預設設定並單擊“建立”。
10. 建立域後,選中“啟動管理伺服器”複選框並單擊“完成”。
11. 伺服器將啟動。
12. HTTP埠預設為7001,除非您更改它。
部署應用程式最簡單的方法是將您的war/ear(它可以是展開的格式)複製到weblogic安裝目錄下的autodeploy目錄。如果您按照上述說明操作,則該目錄位於C:\bea\user_projects\domains\base_domain\autodeploy。當您將war/ear檔案放入該目錄時,weblogic將檢測到它並進行熱部署。
如果要將ZK庫複製到域,請將其放在c:/bea/user_projects/domains/base_domain/lib下。
必須複製的庫包括bsh.jar commons-fileupload.jar commons-el.jar pxcommon.jar pxweb.jar zk.jar zul.jar zhtml.jar。
1.IBM提供了一個Websphere應用程式伺服器社群版,請訪問http://www-128.ibm.com/developerworks/downloads/ws/wasce/?S_TACT=105AGX10&S_CMP=WASCE下載。
2.按照說明下載,如果您還沒有帳戶,可能需要註冊一個帳戶。
3.在下載中,選擇伺服器和32位IBM SDK 1.4.2 SR4-1,繼續下載。
4.啟動安裝程式並接受所有預設設定。
5.安裝完成後,轉到“所有程式” ->“IBM Websphere” ->“應用程式伺服器” ->“配置檔案” ->“預設” ->“啟動伺服器”,這將啟動伺服器。
6. 瀏覽https://:9060/ibm/console/secure/logon.do以部署應用程式。
7.部署後,可以透過https://:9080/myapp訪問應用程式,有關其他文件和教程,請訪問http://publib.boulder.ibm.com/wasce/Front_en.html。
另請參閱:http://www.zkoss.org/smalltalks/eclipse/ek.html
- 您應該已將Eclipse設定為與ZK一起使用。詳細資訊在上面的簡短談話中。
- 執行Eclipse SDK。
- 從選單中選擇視窗/首選項...,然後彈出首選項對話方塊。
- 從左側側邊欄樹形選單中選擇XML/XML目錄,右側是XML目錄面板。
- 在XML目錄條目欄位中選擇使用者指定的條目,然後按新增...按鈕。
- 現在將彈出新增XML目錄條目對話方塊。
- 在URI欄位中,輸入 http://www.zkoss.org/2005/zul/zul.xsd。或者,輸入ZK_HOME/dist/WEB-INF/xsd/zul/zul.xsd(ZK_HOME是ZK的zip檔案解壓縮到的目錄)。
- 在鍵型別欄位中,選擇模式位置。
- 在鍵欄位中,輸入http://www.zkoss.org/2005/zul/zul.xsd。
- 按確定按鈕。
- 現在您應該在使用者指定的條目下看到一個新的條目http://www.zkoss.org/2005/zul/zul.xsd。
- 完成。
- 您應該已在Eclipse中設定了zul.xsd模式。
- 從Eclipse SDK選單中選擇檔案/新建/其他...,然後彈出新建對話方塊。
- 在選擇嚮導頁面中,從樹形選單中選擇XML/XML,然後按下一步>按鈕。
- 在建立XML檔案頁面中,選擇從XML模式檔案建立XML檔案,然後按下一步>按鈕。
- 在XML檔名頁面中,鍵入或選擇專案合適的父資料夾。它通常位於專案的WebContext資料夾下。然後鍵入要建立的ZUL檔名(例如helloworld.zul),然後按下一步>按鈕。
- 在選擇XML模式檔案頁面中,選擇選擇XML目錄條目選項。您應該在XML目錄列表中看到http://www.zkoss.org/2005/zul/zul.xsd。現在選擇該條目並按下一步>按鈕。
- 在選擇根元素頁面中
- 在根元素欄位中,選擇合適的根元素。在大多數ZK應用程式中,它通常是window或zk元素。
- 在內容選項欄位中,您可以保持原樣。
- 在名稱空間資訊欄位中,您可以選擇該條目並按編輯...按鈕以刪除字首或更改字首。
- 按完成按鈕。
- ZUL檔案已建立並在XML編輯器視窗中開啟。
- 現在您可以開始編輯ZUL檔案。按Alt-/以開啟內容輔助彈出視窗,以幫助您填寫合適的ZUL元素和屬性。
- 完成。
- 從Eclipse SDK選單中選擇視窗/首選項...,然後將彈出首選項對話方塊。
- 從左側側邊欄樹形選單中選擇常規和內容型別目錄,右側是內容型別面板。
- 在內容型別中選擇文字和XML,然後按新增...按鈕。
- 新增*.zhtml或諸如*.zul、*.jsp、*.html等。
- 最後,您可以按檔案上的右鍵單擊並在開啟方式選單中選擇XML編輯器。
- 完成。
- 從SDK選單中選擇視窗/首選項...,然後將彈出首選項對話方塊。
- 選擇工作臺/檔案關聯,然後單擊頂部的新增以新增檔案型別*.zhtml。
- 單擊下面的新增並選擇HTML源頁面編輯器,並將其設定為預設值。
- 完成
有多種方法可以做到這一點,一種方法是訪問Liferay並下載預捆綁的Liferay Tomcat捆綁包。這是最簡單的方法,但當然,如果您有預先存在的Tomcat伺服器,則不是理想的方法。
如果您已經擁有一個Tomcat伺服器,並且不想部署另一個伺服器,您可以下載Liferay war檔案。Liferay的安裝通常會從伺服器中刪除ROOT,但我個人不喜歡這樣做,所以我會在不丟失您的root的情況下進行解釋。
- 首先,如果您沒有Tomcat,請在您喜歡的作業系統上下載並安裝最新的穩定版Tomcat(您可以嘗試其他應用程式伺服器,但經驗告訴我,其他伺服器可能一開始會更棘手,因為配置通常更冗長)。
- 接下來,從Liferay下載非捆綁的Liferay war檔案(Liferay Portal Professional 4.2.1 WAR)。
- 還要下載名為Liferay Portal 4.2.1 Dependencies的附加檔案,並將其解壓縮到shared/lib目錄下。
- 為了保留您的ROOT,您需要將war檔案的內容提取到一個資料夾中,例如命名為“myportal”。
- 在WEB-INF資料夾下建立一個“classes”資料夾,在這個資料夾中建立一個名為“portal-ext.properties”的檔案,在檔案中新增以下內容(請注意,您可以根據您以後的配置更改portal.ctx和/或lucene和jackrabbit目錄)。
portal.release=professional portal.ctx=/myportal auto.deploy.dest.dir=../webapps portal.instances=1 lucene.dir=C:/home/liferay/lucene jcr.jackrabbit.repository.root=C:/home/liferay/jackrabbit omniadmin.users=
- 返回WEB-INF資料夾並編輯web.xml檔案,將root_path的param值更改為'/myportal',因此web.xml檔案頂部將如下所示。
<?xml version="1.0"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <context-param> <param-name>company_id</param-name> <param-value>liferay.com</param-value> </context-param> <context-param> <param-name>root_path</param-name> <param-value>/myportal</param-value> </context-param> <filter> <filter-name>Auto Login Filter</filter-name> <filter-class>com.liferay.portal.servlet.filters.autologin.AutoLoginFilter</filter-class> </filter> . . .
- 現在進入META-INF資料夾並新增一個名為“context.xml”的檔案,並新增以下內容(將其配置為您自己的特定內容,只需確保context path屬性為'/myportal',如果您不使用MySQL資料庫,只想讓Liferay使用hSQLdb,只需刪除第一個Resource元素)。
<Context path="/myportal" reloadable="true" >
<Resource
name="jdbc/LiferayPool"
auth="Container"
type="javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql:///lportal?useUnicode=true&characterEncoding=UTF-8"
username="liferay"
password="yarefil"
maxActive="100"
maxIdle="30"
maxWait="10000"
/>
<Resource
name="mail/MailSession"
auth="Container"
type="javax.mail.Session"
mail.transport.protocol="smtp"
mail.smtp.host="localhost"
/>
<Realm
className="org.apache.catalina.realm.JAASRealm"
appName="PortalRealm"
userClassNames="com.liferay.portal.security.jaas.PortalPrincipal"
roleClassNames="com.liferay.portal.security.jaas.PortalRole"
debug="99"
useContextClassLoader="false"
/>
</Context>
- 現在是真正的技巧,當您將上下文更改為ROOT以外的其他內容時,Liferay 4.2存在一個小錯誤。在html/portal資料夾中,您會找到一個名為load_render_portlet.jsp的檔案,開啟檔案並轉到第55-56行,它應該如下所示。
function <%= namespace %>loadPortlet() {
var path = "/c/portal/render_portlet";
但它應該如下所示。
function <%= namespace %>loadPortlet() {
var path = "/myportal/c/portal/render_portlet";
好的,我相信有更好的方法來做到這一點,但我寧願讓Liferay團隊自己來做。
- 如果您希望使用MySQL,您需要將context.xml修改為您自己的配置,您還需要下載liferay-mysql指令碼檔案並將其執行到您的資料庫中。
- 現在,在您的根資料夾(例如Windows的C:\,UNIX/LINUX的/)中,您需要建立一個“home”資料夾(如果不存在),並在其中建立一個“liferay”資料夾。確保Tomcat有許可權修改該資料夾。
- 現在您需要做的就是重新壓縮該資料夾並將zip檔案重新命名為myportal.war,將其放入Tomcat的webapps部署目錄中,(希望)您將擁有一個可執行的Liferay門戶。
在這裡,我假設您熟悉並已建立了一個ZK war檔案。
- 首先,您需要告訴Liferay您的portlet,因此建立一個如下所示的類。
/**
* Copyright (c) 2000-2006 Liferay, LLC. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
package za.co.mypackage.portlet;
import java.io.IOException;
import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.GenericPortlet;
import javax.portlet.PortletException;
import javax.portlet.PortletRequestDispatcher;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* @author Brian Wing Shun Chan
* @modified Glenn Keith
*/
public class JSPPortlet extends GenericPortlet {
public void init() throws PortletException {
editJSP = getInitParameter("edit-jsp");
helpJSP = getInitParameter("help-jsp");
viewJSP = getInitParameter("view-jsp");
}
public void doDispatch(RenderRequest req, RenderResponse res)
throws IOException, PortletException {
String jspPage = req.getParameter("jspPage");
if (jspPage != null) {
include(jspPage, req, res);
}
else {
super.doDispatch(req, res);
}
}
public void doEdit(RenderRequest req, RenderResponse res)
throws IOException, PortletException {
if (req.getPreferences() == null) {
super.doEdit(req, res);
}
else {
include(editJSP, req, res);
}
}
public void doHelp(RenderRequest req, RenderResponse res)
throws IOException, PortletException {
include(helpJSP, req, res);
}
public void doView(RenderRequest req, RenderResponse res)
throws IOException, PortletException {
include(viewJSP, req, res);
}
protected void include(String path, RenderRequest req, RenderResponse res)
throws IOException, PortletException {
PortletRequestDispatcher prd =
getPortletContext().getRequestDispatcher(path);
if (prd == null) {
_log.error(path + " is not a valid include");
}
else {
prd.include(req, res);
}
}
protected String editJSP;
protected String helpJSP;
protected String viewJSP;
private static Log _log = LogFactory.getLog(JSPPortlet.class);
}
- 接下來,在您的WEB-INF中建立一個名為“liferay-display.xml”的檔案,其內容如下所示。
<?xml version="1.0"?> <!DOCTYPE display PUBLIC "-//Liferay//DTD Display 4.0.0//EN" "http://www.liferay.com/dtd/liferay-display_4_0_0.dtd"> <display> <category name="category.test"> <portlet id="portletone" /> </category> </display>
- 現在,還在WEB-INF中建立一個名為“liferay-portlet.xml”的檔案,其內容如下所示。
<?xml version="1.0"?> <!DOCTYPE liferay-portlet-app PUBLIC "-//Liferay//DTD Portlet Application 4.1.0//EN" "http://www.liferay.com/dtd/liferay-portlet-app_4_1_0.dtd"> <liferay-portlet-app> <portlet> <portlet-name>portletone</portlet-name> <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>
- 現在,再次在WEB-INF中建立一個名為“portlet.xml”的檔案,其內容如下所示。
<?xml version="1.0"?> <portlet-app xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd" version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"> <portlet> <portlet-name>portletone</portlet-name> <display-name>Sample JSP Portlet</display-name> <portlet-class>za.co.mypackage.JSPPortlet</portlet-class> <init-param> <name>view-jsp</name> <value>/view.zul</value> </init-param> <expiration-cache>0</expiration-cache> <supports> <mime-type>text/html</mime-type> </supports> <portlet-info> <title>Sample JSP Portlet</title> <short-title>Sample JSP Portlet</short-title> <keywords>Sample JSP Portlet</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-app>
- 您會注意到此檔案中的/view.zul引用是portlet的“index”檔案,還要注意在所有這些檔案中,我都引用了“portletone”,您需要將其更改為您war檔案的名稱。
- 最後,在web.xml檔案的<web-app>之後新增以下內容(緊隨其後的典型ZK內容)。
. . . <display-name>sample-jsp-portlet</display-name> <context-param> <param-name>company_id</param-name> <param-value>liferay.com</param-value> </context-param> <listener> <listener-class>com.liferay.portal.kernel.servlet.PortletContextListener</listener-class> </listener> . . .
BJaouad
您會注意到我將company_id保留為liferay.com。我之所以這樣保留,是因為更改該值也意味著需要深入研究Liferay資料庫,找到所有需要修改值的位置並不難,所以如果您這樣做,則需要自行解決。
- 將生成的war檔案部署到/home/liferay/deploy目錄中。
- 訪問並登入您的門戶,點選“新增內容”連結,在“測試”類別下新增“示例JSP Portlet”。
瞧,一個帶有ZK portlet的門戶。
1)web.xml
在web.xml中定義portlet的定義。
<web-app> <display-name>ZK Portlets</display-name> <servlet> <description>ZK loader for ZUML pages</description> <servlet-name>zkLoader</servlet-name> <servlet-class>org.zkoss.zk.ui.http.DHtmlLayoutServlet</servlet-class> <init-param> <param-name>update-uri</param-name> <param-value>/zkau</param-value> </init-param> <load-on-startup>1</load-on-startup><!-- Must --> </servlet> <servlet-mapping> <servlet-name>zkLoader</servlet-name> <url-pattern>*.zul</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>zkLoader</servlet-name> <url-pattern>/zk/*</url-pattern> </servlet-mapping> <servlet> <description>The asynchronous update engine for ZK</description> <servlet-name>auEngine</servlet-name> <servlet-class>org.zkoss.zk.au.http.DHtmlUpdateServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>auEngine</servlet-name> <url-pattern>/zkau/*</url-pattern> </servlet-mapping> <servlet> <servlet-name>zkportlet</servlet-name> <servlet-class>org.apache.pluto.core.PortletServlet</servlet-class> <init-param> <param-name>portlet-name</param-name> <param-value>zkportlet</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>zkportlet</servlet-name> <url-pattern>/PlutoInvoker/zkportlet</url-pattern> </servlet-mapping> <session-config> <session-timeout>120</session-timeout> </session-config> <welcome-file-list> <welcome-file>index.zul</welcome-file> <welcome-file>index.zhtml</welcome-file> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> </welcome-file-list> <security-role> <role-name>tomcat</role-name> </security-role> </web-app>
2) portlet.xml
在portlet.xml中定義一個ZK portlet。
<portlet-app xmlns="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd" version="1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd http://java.sun.com/xml/ns/portlet/portlet-app_1_0.xsd"> <portlet> <description>ZKloader for ZUML pages</description> <portlet-name>zkportlet</portlet-name> <display-name>ZK Portlet Loader</display-name> <portlet-class>org.zkoss.zk.ui.http.DHtmlLayoutPortlet</portlet-class> <init-param> <name>zk_page</name> <value>/index.zul</value> </init-param> <expiration-cache>0</expiration-cache> <supports> <mime-type>text/html</mime-type> <portlet-mode>VIEW</portlet-mode> </supports> <supported-locale>en</supported-locale> <portlet-info> <title>ZK</title> <short-title>ZK</short-title> <keywords>ZK,ZUML</keywords> </portlet-info> <security-role-ref> <role-name>plutoTestRole</role-name> <role-link>tomcat</role-link> </security-role-ref> </portlet> </portlet-app>
此問題的原因是ZK無法從其會話中找到桌面。為什麼?ZK桌面儲存在Pluto的會話中,而不是ZK Web應用程式中,因為Pluto在Tomcat中進行跨上下文操作時將其會話傳遞給ZK Web應用程式。這違反了servlet的規範。到目前為止,還沒有好的解決方案。但這裡有一個解決方法,即ZK將桌面儲存在應用程式範圍內而不是會話範圍內,以避免此問題。請在您的zk.xml中新增以下行。
<system-config> <cache-provider-class>org.zkoss.zk.ui.impl.GlobalDesktopCacheProvider</cache-provider-class> </system-config>