Hi liferay Rockers,
I really feel nice to write this blog because i am also new to zk-zul framework.
I just started hands on this framework and i want to integrate with liferay.
So finally i have created very simple portlet using zk framework and
Steps are given below :
- Create simple MVC portlet (if you are new to create portlet, just check http://www.liferaysolution.com/2012/05/create-simple-plugin-portlet-liferay.html)
- Now you may need to include necessary zk-zul libraries in portlet lib folder. ZK libraries can be downloaded from ZK Download and then save it to a proper location.
- Unzip zk-bin-x.x.x.zip (the x.x.x is the latest version)
- Copy JAR files under following list to zk-test-portlet\docroot\WEB-INF\lib
- Now create web.xml file under zk-test-portlet\docroot\WEB-INF directory and put below code in web.xml:
- Now open liferay-portlet.xml file and put below code :
- Now create hello.zul file under zk-test-portlet\docroot\zul folder :
- Now open portlet.xml and put below code :
- Now create MainPortletController class as shown below :
- Now deploy your portlet and see the magic of zk framework.(See below screenshot)
ZK-Learning-Portlet Used to cleanup when a session is destroyed ZK Session cleaner org.zkoss.zk.ui.http.HttpSessionListener The ZK loader for ZUML pages zkLoader org.zkoss.zk.ui.http.DHtmlLayoutServlet update-uri /zkau 1 The asynchronous update engine for ZK auEngine org.zkoss.zk.au.http.DHtmlUpdateServlet zkLoader *.zul zkLoader *.zhtml auEngine /zkau/* http://java.sun.com/portlet_2_0 /WEB-INF/tld/liferay-portlet.tld
zk-test /icon.png true /css/main.css /zkau/web/js/zk.wpd /js/main.js zk-test-portlet administrator Administrator guest Guest power-user Power User user User
Hello World!
zk-test zk-test com.cignexdatamatics.zktest.zk.MainPortletController view-jsp /zul/hello.zul 0 text/html zk-test zk-test zk-test administrator guest power-user user
package com.cignexdatamatics.zktest.zk; import java.io.IOException; import javax.portlet.PortletException; import javax.portlet.PortletRequest; import javax.portlet.PortletRequestDispatcher; import javax.portlet.PortletResponse; import javax.portlet.RenderRequest; import javax.portlet.RenderResponse; import org.zkoss.zk.ui.Session; import org.zkoss.zk.ui.http.DHtmlLayoutPortlet; import com.liferay.portal.kernel.log.Log; import com.liferay.portal.kernel.log.LogFactoryUtil; import com.liferay.portal.kernel.util.GetterUtil; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.kernel.util.Validator; import com.liferay.portal.util.PortalUtil; public class MainPortletController extends DHtmlLayoutPortlet{ @Override public void init() throws PortletException { // TODO Auto-generated method stub _log.info("init called............."); super.init(); jspPath = getInitParameter("jsp-path"); if (Validator.isNull(jspPath)) { jspPath = StringPool.SLASH; } else if (jspPath.contains(StringPool.BACK_SLASH) || jspPath.contains(StringPool.DOUBLE_SLASH) || jspPath.contains(StringPool.PERIOD) || jspPath.contains(StringPool.SPACE)) { throw new PortletException( "jsp-path " + jspPath + " has invalid characters"); } else if (!jspPath.startsWith(StringPool.SLASH) || !jspPath.endsWith(StringPool.SLASH)) { throw new PortletException( "jsp-path " + jspPath + " must start and end with a /"); } aboutJSP = getInitParameter("about-jsp"); configJSP = getInitParameter("config-jsp"); editJSP = getInitParameter("edit-jsp"); editDefaultsJSP = getInitParameter("edit-defaults-jsp"); editGuestJSP = getInitParameter("edit-guest-jsp"); helpJSP = getInitParameter("help-jsp"); previewJSP = getInitParameter("preview-jsp"); printJSP = getInitParameter("print-jsp"); viewJSP = getInitParameter("view-jsp"); clearRequestParameters = GetterUtil.getBoolean( getInitParameter("clear-request-parameters")); copyRequestParameters = GetterUtil.getBoolean( getInitParameter("copy-request-parameters")); } @Override protected void doView(RenderRequest renderRequest, RenderResponse renderResponse) throws PortletException, IOException { // TODO Auto-generated method stub _log.info("doView called............."); include(viewJSP, renderRequest, renderResponse); super.doView(renderRequest, renderResponse); } @Override protected boolean process(Session sess, RenderRequest renderRequest, RenderResponse renderResponse, String path, boolean flag) throws PortletException, IOException { // TODO Auto-generated method stub _log.info("process called............."); return super.process(sess, renderRequest, renderResponse, path, flag); } protected void include( String path, RenderRequest renderRequest, RenderResponse renderResponse) throws IOException, PortletException { include( path, renderRequest, renderResponse, PortletRequest.RENDER_PHASE); } protected void include( String path, PortletRequest portletRequest, PortletResponse portletResponse, String lifecycle) throws IOException, PortletException { PortletRequestDispatcher portletRequestDispatcher = getPortletContext().getRequestDispatcher(path); if (portletRequestDispatcher == null) { _log.error(path + " is not a valid include"); } else { checkJSPPath(path); portletRequestDispatcher.include(portletRequest, portletResponse); } if (clearRequestParameters) { if (lifecycle.equals(PortletRequest.RENDER_PHASE)) { portletResponse.setProperty("clear-request-parameters", "true"); } } } protected void checkJSPPath(String path) throws PortletException { if (!path.startsWith(jspPath) || path.contains(StringPool.DOUBLE_PERIOD) || !PortalUtil.isValidResourceId(path)) { throw new PortletException( "Path " + path + " is not accessible by this portlet"); } } protected String aboutJSP; protected boolean clearRequestParameters; protected String configJSP; protected boolean copyRequestParameters; protected String editDefaultsJSP; protected String editGuestJSP; protected String editJSP; protected String helpJSP; protected String jspPath; protected String previewJSP; protected String printJSP; protected String viewJSP; private static Log _log = LogFactoryUtil.getLog(MainPortletController.class); }