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,如需转载请自行联系原作者

目录
相关文章
|
19天前
|
存储 Java API
Android 浅度解析:mk预置AAR、SO文件、APP包和签名
Android 浅度解析:mk预置AAR、SO文件、APP包和签名
76 0
|
5天前
|
SQL 缓存 JavaScript
深入解析JavaScript中的模板字符串
深入解析JavaScript中的模板字符串
13 1
|
11天前
|
C++
【期末不挂科-C++考前速过系列P6】大二C++实验作业-模板(4道代码题)【解析,注释】
【期末不挂科-C++考前速过系列P6】大二C++实验作业-模板(4道代码题)【解析,注释】
【期末不挂科-C++考前速过系列P6】大二C++实验作业-模板(4道代码题)【解析,注释】
|
12天前
|
弹性计算 运维 Shell
|
12天前
项目管理工具计划模板解析:项目管理工具的双重功能与创建方法
本文介绍了项目计划模板的含义和重要性。项目计划模板是用于规划项目结构的可编辑文档,帮助团队明确任务、分配责任和管理时间。模板有助于跟踪项目进度、避免任务冲突,并简化会议安排。创建模板通常涉及选择合适的项目管理工具,如Zoho Projects或Microsoft Excel,然后分解任务、定义日期并持续调整。在Zoho Projects中,用户可以按步骤创建模板,包括命名、添加任务和设置相关细节。
21 0
|
13天前
|
分布式计算 Java 大数据
MaxCompute产品使用合集之大数据计算MaxCompute外部表映射了oss中的csv文件,看到"\N"被解析为"N",是什么原因
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
15天前
|
移动开发 数据可视化 Linux
Linux 中的文件与目录管理解析
当谈到Linux系统,文件与目录管理是其中最基本和重要的部分之一。Linux提供了一种强大而灵活的方式来组织和管理文件和目录,让用户能够轻松地访问和操作系统中的各种数据。上一节我们说到文件的属性,本文将详细介绍Linux中的文件与目录管理的各个方面。
|
15天前
|
Linux Go 数据安全/隐私保护
Linux 中的文件属性解析
在 Linux 系统中,每个文件和目录有一组属性控制其操作和访问权限。了解这些属性对有效管理文件至关重要。文件属性包括:文件类型(如 `-` 表示普通文件,`d` 表示目录),权限(如 `rwx` 表示所有者权限,`r-x` 表示组和其他用户权限),所有者,组,硬链接数,文件大小和最后修改时间。通过 `chown` 和 `chmod` 命令可更改文件所有者、所属组及权限。此外,还有特殊权限(如 SUID、SGID)和 ACL(访问控制列表)提供更精细的访问控制。
|
1天前
PandasTA 源码解析(二十三)
PandasTA 源码解析(二十三)
7 0
|
1天前
PandasTA 源码解析(二十二)(3)
PandasTA 源码解析(二十二)
5 0

推荐镜像

更多