当前位置: 首页 > news >正文

Liferay 模板文件的解析

 大家都知道Liferay的内核框架由一组Velocity模板文件组成的,它们位于$LIFERAY_HOME\liferay-portal-6.1.0-ce-ga1\tomcat-7.0.23\webapps\ROOT\html\themes\classic\templates 目录下,今天有同事问我,这些模板中的变量在哪里定义的。

 

为了解决这个问题,我们找到了portal-impl.jar中的VelocityVariableImpl 类文件,于是一目了然。因为 portal-normal.vm中的第一行会解析其他文件,被解析的文件在变量init中,如下:

 
  
  1. <!DOCTYPE html> 
  2.  
  3. #parse ($init) 
  4.  
  5. <html class="#language("lang.dir")" dir="#language("lang.dir")" lang="$w3c_language_id"> 
  6.  
  7. <head> 
  8.     <title>$the_title - $company_name</title> 
  9.  
  10.     $theme.include($top_head_include) 
  11. </head> 
  12. ...
     

 

见03行,而被解析的这个文件,就定义了绝大多数模板中用到的变量,那么这个文件在哪里呢?我们可以参见VelocityVariableImpl中的定义:

 
  
  1. velocityContext.put( 
  2.     "init",  
  3.     themeDisplay.getPathContext() +  
  4.     "_SERVLET_CONTEXT_" +  
  5.     "/html/themes/_unstyled/templates/init.vm"); 
  6.  
  7.   velocityContext.put( 
  8.     "portletGroupId"new Long(themeDisplay.getScopeGroupId())); 
  9.  
  10. Theme theme = (Theme)request.getAttribute("THEME"); 

所以,被parse的init变量 代表的文件是在 ROOT 应用下的/html/themes/_unstyled/templates/init.vm,我们打开看下,果然这里面都是变量定义:

 

因为这个文件很长,所以这里略去

 
  
  1. ## ---------- Common variables ---------- ## 
  2.  
  3. #set ($theme_display = $themeDisplay) 
  4. #set ($portlet_display = $portletDisplay) 
  5.  
  6. #set ($theme_timestamp = $themeDisplay.getTheme().getTimestamp()) 
  7. #set ($theme_settings = $themeDisplay.getThemeSettings()) 
  8.  
  9. ... 

 

结论:

在Liferay框架中的模板文件中的变量,大多数是在init.vm中定义的,少量是直接定义在VelocityVariableImpl类中的

 

 

实战:

比如,同事问我,在portal-normal.vm的第47-53行中的 $content_include变量定义在哪里:

 
  
  1. #if ($selectable) 
  2.     $theme.include($content_include
  3. #else 
  4.     $portletDisplay.recycle() 
  5.  
  6.     $portletDisplay.setTitle($the_title) 
  7.  
  8.     $theme.wrapPortlet("portlet.vm"$content_include
  9. #end 

 

我们在init.vm中进行查找,不难发现这个变量定义为:

 
  
  1. #set ($bottom_include = "$dir_include/common/themes/bottom.jsp"
  2. #set ($bottom_ext_include = $bottom_include) 
  3. #set ($content_include = "$dir_include$tilesContent"
  4. #set ($top_head_include = "$dir_include/common/themes/top_head.jsp"
  5. #set ($top_messages_include = "$dir_include/common/themes/top_messages.jsp"

是 $dir_include$tilesContent,所以我们还需要递归的继续解析下去:

 

我们在init.vm中继续查找,不难找到$dir_include的变量定义:

 
  
  1. #if ($is_portlet_page && $theme_display.isWapTheme()) 
  2.                 #set ($dir_include = "/wap"
  3. #else 
  4.                 #set ($dir_include = "/html"
  5. #end 

所以,因为我们的官方默认例子不是被wap的,所以$dir_include为/html

 

接下来我们找$tilesContent的定义。很可惜,它没有被定义在init.vm中,所以我们回到VelocityVariableImpl类中,再这里,我们找到了定义:

 
  
  1. String tilesContent = (String)componentContext.getAttribute("content"); 
  2.  
  3. themeDisplay.setTilesContent(tilesContent); 
  4.  
  5. velocityContext.put("tilesContent", tilesContent); 

所以,$tilesContent 是一个程序运行期间动态传递过来的变量:

 

综上所述:同事问我的portal-normal.vm文件中$content_include的变量的值,是在程序运行中动态解析的,默认情况下,它是 “/html” 与程序运行时候动态获取content属性值,然后这2个值拼接起来得到的值。




本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/887082,如需转载请自行联系原作者

相关文章:

  • 艾伟:[原创]谈谈WCF中的Data Contract(2):WCF Data Contract对Generic的支持
  • NeHe OpenGL第三十四课:地形
  • ansible-playbook批量部署zabbix
  • 艾伟_转载:C#来创建和读取XML文档
  • 一例HP ADG数据恢复成功(8×73GB SCSI)
  • 艾伟_转载:LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例
  • php经典面试题
  • JavaScript控制图片横向滚动代码
  • 关于服务器缓存的思考
  • 伸向开源世界的“橄榄枝”
  • 运营中心:网站分析、网络广告注释
  • Fedora8上Apache Httpd与Tomcat6初集成
  • 转贴:下辈子,无论爱与不爱,都不会再见
  • 塔式,机架,刀片服务器
  • 静态网页和动态网页
  • [case10]使用RSQL实现端到端的动态查询
  • Angular Elements 及其运作原理
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • CSS 专业技巧
  • css布局,左右固定中间自适应实现
  • JS+CSS实现数字滚动
  • Laravel5.4 Queues队列学习
  • Linux Process Manage
  • Lucene解析 - 基本概念
  • mysql常用命令汇总
  • PhantomJS 安装
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • Shell编程
  • 分布式任务队列Celery
  • 汉诺塔算法
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 前端技术周刊 2019-02-11 Serverless
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 使用SAX解析XML
  • 为视图添加丝滑的水波纹
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • gunicorn工作原理
  • puppet连载22:define用法
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • ​比特币大跌的 2 个原因
  • !!java web学习笔记(一到五)
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • %check_box% in rails :coditions={:has_many , :through}
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • .jks文件(JAVA KeyStore)
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .NET委托:一个关于C#的睡前故事
  • @entity 不限字节长度的类型_一文读懂Redis常见对象类型的底层数据结构
  • @GetMapping和@RequestMapping的区别