Liferay 的 portal 渲染过程好像很神奇,特别是当前4.2版还增强了渲染,实现了parallel rendering。也就是当打开portal页面时首先可以看到整个portal布局,每个portlet会先显示为一个进度条,过会portlet才 会被显示出来。
现在不妨随我trace一下liferay 的代码, 看看liferay是怎么渲染出整个页面,并且了解如何实现parallel rendering。
首先发现一个现象,liferay中的所有url都是/c/portal/layout开头的。说明什么?
liferay portal建立在strtus tiles上,所以我们首先要关注一下strtus-config.xml
<action type="com.liferay.portal.action.LayoutAction" path="/portal/layout"></action>
xml 代码
- <action path="/portal/layout" type="com.liferay.portal.action.LayoutAction">
- <forward name="portal.layout" path="portal.layout" />
- </action>
<forward name="portal.layout" path="portal.layout"></forward>
果然,这个url会forward到portal.layout上。找一下tiles的定义文件,和tiles 的定义文件
<definition name="portal" path="/common/themes/portal.jsp"></definition>万里长征第一步,找到目标了,接着看portal.jsp中有什么
<liferay-theme:include page="portal_normal.jsp"></liferay-theme:include>
看上去被include了一个页面,portal_normal.jsp
搜一下整个liferay目录,portal_noraml.jsp是分布在各个theme下的,从这里我们得到第一个结论,可以用portal_normal.jsp控制theme的render结果,包括head,navigation和foot。
但是我们还没有找到渲染portlet的部分,相反,我们在portal_noraml.jsp中找到了很奇怪的一行
<liferay-util:include page="<%= Constants.TEXT_HTML_DIR + tilesContent %>"></liferay-util:include>
这个明显是include另一个页面,但是tilesContent 是什么东西?寻遍整个文件,都没有其他地方有tilesContent字样的代码,似乎断了线索。
xml 代码
- <definition name="portal" path="/common/themes/portal.jsp">
- <put name="title" value="" />
- <put name="selectable" value="false" />
- </definition>
-
-
- <definition name="portal.layout" extends="portal">
- <put name="content" value="/portal/layout.jsp" />
- <put name="selectable" value="true" />
- </definition>
且慢,portal_noraml.jsp头部有一句,<!---->,此文件大有含义,立马打开查看
<tiles:useattribute id="tilesContent" name="content" ignore="true" classname="java.lang.String"></tiles:useattribute>
再联系刚才的tiles定义里有
<put name="content" value="/portal/layout.jsp"></put>
立马清楚了。
跟随这这条路下去,会发现
/portal/layout/view/portlet.jsp->
RuntimePortletUtil.processTemplate
跟踪到此没了头绪。有一个TemplateProcessor,好像是处理模板的,但是被Velocity.evaluate封装了。
所谓条条大路通罗马,我们从另一个方向开始trace。
打开页面时每个portlet都会先显示出一个进度条。如果手够快的话:)可以找到进度条的图片文件名称 loading_animation.gif。
我们先在整个工程中查找 "loading_animation.gif" 字样,看看哪个部分引用了这个文件。很顺利,找到几个引用这个文件的页面,同portal有关的有porlte_js.jsp和load_render_portlet.jsp
先来看看portlet_js.jsp,从内容上看,这是个操作portlet的js文件,同render没有直接关系。不是这个
再看看load_render_portlet.jsp,打开这个文件,眼前为之一亮!!
var portletDiv = document.getElementById("p_load<!---->");
addPortletHTML(xmlHttpReq.responseText, portletDiv.parentNode, portletDiv);
portletDiv.parentNode.removeChild(portletDiv);
众里寻她千百度!终于找到了parallel rendering的核心了,原来liferay 使用ajax手法,在下载真正的portlet之前先显示出loading_animation.gif这幅
图象,然后发起一个ajax请求,最后将进度条替换为真正的portlet内容。
现在还差最后的任务了,怎么把我们找到的两条线搭扣起来?继续刚才的手法,工程里再找引用load_render_portlet.jsp的部分。
PortletColumnLogic.processContent
再接再厉PortletColumnLogic是被TemplateProcessor.processColumn调用的。
还记得刚才我们的线索是哪里断的么?RuntimePortletUtil.processTemplate里也有一个TemplateProcessor!
这个环终于合起来了
我们重头开始整理一下,当打开一个portal页面时,url会映射到
<action type="com.liferay.portal.action.LayoutAction" path="/portal/layout"></action>
<forward name="portal.layout" path="portal.layout"></forward>
之后就是
LayoutAction->(forward)portal.layout->(tiles定义)-> html/common/themes/portal.jsp->(include)portal_normal.jsp->(include)/portal/layout.jsp->(include)/portal/layout/view/portlet.jsp->RuntimePortletUtil.processTemplate->
Velocity.evaluate->TemplateProcessor.processColumn->PortletColumnLogic.processContent ->带出 /html/portal/load_render_portlet.jsp;
通过这次探索,我们还知道,Liferay 4.2中parallel rendering是用ajax实现的。
并且我们学会了两种trace代码的方法,一种是正向的分析方法,一种是反向的搜索方法。
但是这次探索还不令人完全满意,遗留有几个未完之处
1 我只是追踪到PortletColumnLogic.processContent,但是这个函数并没有最终的render功能,load_render_portlet.jsp最终是如何被显示的需要各位朋友们自己探索了。权当一个小练习吧。
2 Velocity.evaluate的过程很模糊,虽然最终我们是在这里把扣搭上的,但还是很让人迷糊。特别是
Velocity.evaluate(vc, sw, RuntimePortletUtil.class.getName(), content);中的参数content,总让人觉得大有玄机。
3 整个过程只是探寻了portal的渲染,对于portlet的显示过程完全没有涉及。
如果说我们到这步算是完成了二万五千里长征,那么离全面胜利还有很艰难的一段要走,各位朋友不妨暂待后文。当然更欢迎各位亲自动手,弄清楚liferay的整个后台机制。
分享到:
相关推荐
**标题:“Liferay 4.2 和Openfire的组合使用”** 在IT行业中,集成不同的软件和服务以构建高效的企业级解决方案是一项常见的任务。本话题主要关注如何将Liferay Portal 4.2与Openfire即时通讯服务器相结合,以提供...
在本文中,我们将深入探讨如何配置Liferay 4.2.0版本,这是一个知名的开源企业级门户平台。根据描述,虽然官方文档可能是针对4.3.5版本的,但据称4.2.0版本与之仅有微小差异。我们将重点关注如何在Eclipse集成环境中...
环境搭建 一、资源准备 以上资源内容可以在Liferay的官方网站下载, 1 liferay-plugins-sdk-6.1.1...经过上面的三步,在Liferay IDE(Eclipse 4.2)的下方的server面板处,可以看到Liferay 6.1 CE Server,现在点击运行
Liferay Portal Liferay IDE
Liferay是一款开源的企业级门户平台,它提供了丰富的功能和高度可定制性,广泛应用于构建企业网站、内部系统、协作平台等。在这个“liferay详细讲解 liferay项目完全讲解”的资料包中,我们可以期待深入了解到关于...
### Liferay环境搭建详解 #### 一、简介 Liferay是一款功能强大的开源企业级门户平台,主要用于...掌握这些基本操作后,您可以进一步探索Liferay的高级特性,如主题开发、服务构建等。希望本文档对您的学习有所帮助!
标题 "Liferay扩展环境 Liferay Ext" 涉及到的是Liferay门户平台的一个关键概念,Liferay Ext是用于扩展和定制Liferay功能的核心工具。Liferay是一个开源的企业级内容管理平台,它允许用户根据需求构建自定义的数字...
### Liferay快速入门知识点详解 #### 一、Liferay Portal简介与快速启动 ...无论是对于希望快速搭建企业门户的用户,还是想要深入探索Liferay开发的开发者,这份快速入门指南都是一个不可或缺的资源。
7. **集成与API**:探索Liferay的API和Service Builder,了解如何与其他系统进行集成。 8. **扩展与插件**:了解Marketplace中的可用插件,以及如何开发自己的插件来扩展Liferay的功能。 **最佳实践** 在使用...
【Liferay 6 入门教程】 Liferay是一款开源的企业级门户平台,广泛用于构建企业网站、社交网络和协作工具。Liferay 6是其一个重要的版本,提供了丰富的功能和改进,包括更好的用户体验、增强的社区参与度以及更强大...
Liferay是一款开源的企业级门户平台,它提供了丰富的功能来构建和管理数字体验,包括网站创建、内容管理、社交协作以及工作流程。以下是对这8本Liferay经典书籍的知识点总结,旨在帮助读者深入理解并掌握Liferay的...
总之,"liferay经典的例子源码"是一个宝贵的教育资源,对于想要学习和掌握Liferay开发的开发者来说,它提供了一个直观且实用的起点,通过这个例子,我们可以逐步揭开Liferay的神秘面纱,进一步探索其强大的功能和...
Liferay是一款开源的企业级门户平台,它提供了丰富的功能和高度的可扩展性。Struts则是一个经典的MVC(模型-视图-控制器)框架,用于构建Java Web应用程序。将Liferay与Struts整合,可以充分利用Struts的业务逻辑...
这个名为"Liferay合集.zip"的压缩包包含了多本关于Liferay的重要书籍,如《Liferay in Action》、《Liferay Portal Systems Development》和《Liferay User Interface Development》,以及一些中文文档,这些资源...
《Liferay开发文档集合》是针对企业级门户平台Liferay的一系列技术指南,涵盖了从基础安装到高级定制的全方位知识。这些PDF文档旨在帮助开发者、系统管理员和IT专业人员更好地理解和利用Liferay Portal来构建和管理...
Liferay 是一个开源的企业级门户平台,它提供了一个强大的框架,用于构建和管理Web应用程序、内容和工作流程。本超学习文档将深入探讨Liferay的核心特性、开发环境、Java技术的应用以及Hibernate在Liferay中的整合。...