Liferay 4.2 parallel rendering 探索

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 代码
  1. <action path="/portal/layout" type="com.liferay.portal.action.LayoutAction">  
  2.    <forward name="portal.layout" path="portal.layout" />  
  3.   </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="&lt;%= Constants.TEXT_HTML_DIR + tilesContent %&gt;"></liferay-util:include>
这个明显是include另一个页面,但是tilesContent 是什么东西?寻遍整个文件,都没有其他地方有tilesContent字样的代码,似乎断了线索。

xml 代码
  1. <definition name="portal" path="/common/themes/portal.jsp">  
  2.   <put name="title" value="" />  
  3.   <put name="selectable" value="false" />  
  4.  </definition>  
  5.   
  6.   
  7. <definition name="portal.layout" extends="portal">  
  8.   <put name="content" value="/portal/layout.jsp" />  
  9.   <put name="selectable" value="true" />  
  10.  </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的整个后台机制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值