论坛首页 Java企业应用论坛

Liferay 4.2 Velocity 模板 render探索 (兼Java remote debug方法)

浏览 5438 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-12-22  
在 Liferay 4.2 parallel rendering 探索 http://pikachu.iteye.com/blog/39937中我们分析了portal render时的基本过程,但是其中的一个环节
Velocity.evaluate(vc, sw, RuntimePortletUtil.class.getName(), content)

让人很疑惑

这次我们要打开这里的谜团,看看Velocity中的content到底是什么。

这次我决定用动态的代码trace来帮助我们的trace

首先要下载到liferay的源代码,并加载到eclipse中。
然后修改liferay 的 bin/catalina.bat文件

set JAVA_OPTS=-Xms128m -Xmx512m -Dfile.encoding=UTF8 -Duser.timezone=GMT -Djava.security.auth.login.config=%CATALINA_HOME%/conf/jaas.config

->
set JAVA_OPTS=-Xms128m -Xmx512m -Dfile.encoding=UTF8 -Duser.timezone=GMT -Djava.security.auth.login.config=%CATALINA_HOME%/conf/jaas.config -Xdebug -Xrunjdwp:transport=dt_socket,address=4321,server=y,suspend=n

新增的参数是告诉jdk,请在4321端口上监听我的调试命令。
其他的java程序也可以用类似的方法进行调试
startup启动liferay

如果没有异常,我们在Eclipse|Run|Debug|Remote Java Application下新增一个调试配置。将port设置为4321

debug
没有反应??
切换到Debug Perspect
Bingo!!


既然调试器已经连接到liferay上了,我们就可以设置断点

在portal-ejb/src下,找到com.liferay.portlet.layoutconfiguration.util.RuntimePortletUtil
在Velocity.evaluate设置断点

然后用浏览器打开liferay页面,稍等片刻

马上watch content这个变量

很神奇,竟然是一套模板的内容
仔细查看其中的内容有
$processor.processColumn("column-1")

终于和上次我们的跟踪到的TemplateProcessor.processColumn联系起来了。

那么这套content是从哪里来的呢?
把trace 倒退几层就找到了

打开html\portal\layout\view\portlet.jsp
找到了
	String content = LayoutTemplateLocalUtil.getContent(layoutTypePortlet.getLayoutTemplateId(), false, theme.getThemeId());

	RuntimePortletUtil.processTemplate(application, pageContext, request, response, content);


原来content就是Layout Template的内容
另外搜索有$processor.processColumn("column-1")的文件也会发现,这些文件都在layouttpl目录下


最后我们终于把整个环串了起来
LayoutAction->(forward)portal.layout->
(tiles定义)->
html/common/themes/portal.jsp->
(include)portal_normal.jsp->
(include)/portal/layout.jsp->
(include)/portal/layout/view/portlet.jsp(加载template文件)->
RuntimePortletUtil.processTemplate->
Velocity.evaluate(使用template内容作为Velocity模板render)->
TemplateProcessor.processColumn->
PortletColumnLogic.processContent->
带出 /html/portal/load_render_portlet.jsp;
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics