ZK/入门指南/安装和配置
在 Tomcat 上安装 ZK
1. 从 https://tomcat.net.cn 下载 Tomcat 并安装,如果您尚未安装。(已测试通过链接 https://127.0.0.1 或 https://127.0.0.1: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://127.0.0.1/manager 或 https://127.0.0.1:8080/manager 并将 demo/bin/zkdemo.war 部署到 Tomcat,或者直接将其复制到 $TOMCAT_HOME/webapps。如果您更喜欢直接复制,则必须先停止 Tomcat。如果文件丢失,请改为获取 zksandbox.war。
7. 浏览到 https://127.0.0.1/zkdemo/userguide、https://127.0.0.1:8080/zkdemo/userguide 或 https://127.0.0.1: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://127.0.0.1/zkdemo/userguide 或 https://127.0.0.1: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://127.0.0.1/zkdemo/userguide 或 https://127.0.0.1:8080/zkdemo/userguide,具体取决于您的配置。
1. 从 http://www.jboss.com/downloads/index 下载 Jboss 并安装,如果您尚未安装。
2. 使用链接 https://127.0.0.1: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://127.0.0.1/zkdemo/userguide 或 https://127.0.0.1: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://127.0.0.1:8888/em/。
7. 以oc4jadmin身份登录并转到应用程序-->部署页面。
8. 部署zkdemo.war(按照屏幕上的说明操作)。
9. 浏览到https://127.0.0.1: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://127.0.0.1:9060/ibm/console/secure/logon.do以部署应用程序。
7.部署后,可以通过https://127.0.0.1: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://127.0.0.1/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>