原文链接
:http://coderj.org/blog/2011/08/19/velocity_overview/
一、概述
Velocity模板引擎处理机制分为五个基本步骤:
- 引擎初始化,通过设置的引擎属性初始化引擎,包括国际化支持,ResourceLoader设置,字符编码等。
- 获取并解析模板文件,首先通过资源加载器(ResourceLoader)将模板文件加载到内存(转化为InputStream),然后通过AST(Abstract Syntax Tree)解析器将InputStream解析为一个AST。
- 创建一个Context
- 将模板渲染所需的参数放入context
- 执行模板渲染,产生输出流。渲染过程中通过遍历该模板对应的AST,调用相应节点的处理器执行渲染。
整个处理流程如下图所示:
二、详细渲染流程
下面以一个简单的模板template.vm为例,详细解释渲染过程。
VelocityMergeTest.java
public class VelocityMergeTest {
public static void main(String[] args) {
VelocityEngine ve = new VelocityEngine();
ve.setProperty(Velocity.RESOURCE_LOADER, "class");
ve.setProperty("class.resource.loader.class",
"org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
try {
// 引擎初始化
ve.init();
// 加载解析模板
Template tp = ve.getTemplate("template.vm");
// 创建context
Context context = new VelocityContext();
// 设置Context中参数值
context.put("foo", "VV");
StringWriter writer = new StringWriter();
// 执行渲染
tp.merge(context, writer);
System.out.println(writer.toString());
} catch (Exception e) {
}
}
}
template.vm:
<html>
<body>
Hello $foo world!
</body>
</html>
2.加载解析模板
当执行ve.getTemplate(“template.vm”)时,首先通过ResourceLoader将tempalte加载为InputStream,然后通过Parser生成如下Token集合:
{[<html> <body> Hello], [$foo], [world! </body> </html> ]},
可以发现velocity根本不关系模板最终要渲染出来的是html还是什么的其他的东西,也就以为这所有的html标签对velocity来讲都是纯文本。
最终构建的AST如下
根节点下有三个子节点:
- [<html> <body> Hello]对应的ASTText节点;
- [$foo]对应的ASTReference节点;
- [world! </body> </html> ]对应的ASTText节点
Velocity引擎在这里有个优化策略,可以针对生成的语法树进行cache。
3.创建context并设置参数
Context context = new VelocityContext();
context.put(“foo”, “VV”);
创建一个context,并在其中放入一个foo=VV的参数。
4.执行渲染
当执行tp.merge(context,
writer);时,模板遍历其对应的AST树,执行每个节点的渲染过程。如ASTText节点只是简单的将文本写入writer。
ASTReference节点需要从context中获取引用的参数foo的值VV,将$foo替换,并写入到writer中。Velocity的AST
中有多种节点,如ASTIdentitor等,有些需要反射机制处理。当整个AST遍历结束,也就意味着模板渲染结束,渲染的结果位于writer流中。
三、关于AST解析
Velocity作为模板语言,其核心在与模板文件的解析,构建AST。Velocity的解析器是通过JavaCC构建
的,JavaCC(Java Complier
Complier)是一个用于生成解析器的工具,可以根据语法定义(.jj文件)生成用于校验一份文本是否符合该语法定义的java代码。JJTree是
JavaCC中提供的一种根据语法定义(.jjt文件)生成构建符合该语法定义的文本的语法树的java代码的工具。
Velocity源码包中提供了用于构建velocity语法解析的的jjt文件,位于src/parser/Parser.jjt。可以自己手动从源码构建Velocity的解析器。步骤如下:
1.下载安装JavaCC,到http://javacc.java.net/下载即可,velocity的解析器需要3.2版本以上。下载后解压即可。
2.使用JJTree生成节点定义:
$ javacc-5.0/bin/jjtree Parser.jjt
这一过程中会生成节点定义的Java文件和Parser.jj语法定义文件
3.使用JavaCC生成解析器
$ javacc-5.0/bin/javacc Parser.jj
最终会生成Parser.java解析器和个节点定义。
分享到:
相关推荐
** Velocity 源码分析与应用实例 ** Velocity 是一个基于 Java 的模板引擎,它允许开发者将业务逻辑和页面展示分离,使得Web开发更加高效。Velocity 提供了一种简单但强大的语言来创建动态内容,其核心设计思想是...
NULL 博文链接:https://twb.iteye.com/blog/265761
4. **velocity(1).rar** 和 **velocity.rar**:这两个RAR文件可能是Velocity的源码或相关示例项目的压缩包,供开发者下载研究。 **总结** Velocity作为一款强大的模板引擎,为Java开发提供了灵活的内容生成解决...
Velocity 是一个基于 Java 的模板引擎框架,提供的模板语言可以使用在 Java 中定义的对象和变量上。Velocity 是 Apache 基金会的项目,开发的目标是分离 MVC 模式中的持久化层和业务层。但是在实际应用过程中,...
在讨论Python在校园数据分析中的应用时,首先需要了解大数据的特点,也就是IBM提出的5V特点:大量(Volume)、高速(Velocity)、多样(Variety)、价值(Value)以及真实性(Veracity)。这些特点意味着在大数据...
源码分析可以帮助开发者更好地理解和定制Velocity以满足特定需求。此外,有一些工具可以帮助开发者更高效地使用Velocity,例如IDE插件、模板调试器等,它们可以提高开发效率并减少错误。 总的来说,Velocity是一个...
【Velocity项目源代码】是一个基于Java的模板引擎,它被广泛应用于Web开发中,用于生成动态内容。Velocity通过将业务逻辑与表示层分离,提高了Web应用程序的开发效率和可维护性。这个【描述】提到的"Velocity_...
Velocity是Apache软件基金会的一个开源项目,它是一款强大的模板引擎,主要用于生成动态Web内容。 Velocity的主要优点在于其简单易用和高度可扩展性,使得开发者能够将业务逻辑与表现层分离,提高代码的可读性和维护...
这通常通过配置Struts2的Result类型来完成,例如设置一个`velocity`类型的Result,指定对应的Velocity模板文件路径。在Action中,你可以将需要在模板中使用的数据放入ValueStack或者ActionContext,Velocity模板可以...
这个"IOS应用源码——动画.rar"压缩包很可能是包含了一个或多个示例项目,用于演示如何在iOS应用程序中实现各种类型的动画。通过研究这些源码,开发者可以学习到如何在Swift或Objective-C中运用Apple的UIKit框架来...
Velocity是Apache软件基金会的一个开源项目,它是一个基于Java的模板引擎,用于生成动态网站内容。Velocity被设计成一个轻量级的、快速的、非侵入式的模板语言,使得开发者能够将HTML页面的展示逻辑与业务逻辑分离,...
Velocity通过使用简单而功能强大的脚本语言——Velocity模板语言(Velocity Template Language,简称VTL)来实现这一点。VTL能够让开发者定义模板,模板中可以包含数据的占位符和控制结构。 Velocity在Web开发中...
### 源码分析 深入研究Velocity的源码有助于理解其工作原理,例如如何解析模板、如何执行指令、如何处理上下文对象等。这不仅可以帮助优化模板设计,还能为自定义扩展提供基础。 ### 学习资源 - 博文链接:...
《JSP源码分析——深度探索TOT-JSP-CMS系统》 JSP(JavaServer Pages)是一种基于Java技术的服务器端脚本语言,用于创建动态网页。TOT-JSP-CMS是一个使用JSP编写的网站内容管理系统,它为开发者提供了一个灵活、可...
标题“velocity和freemarker的比较”涉及到的是两个在Java Web开发中常用的模板引擎——Velocity和FreeMarker。它们都是用于将静态模板与动态数据结合,生成HTML或其他类型的文本输出,常用于MVC(模型-视图-控制器...
本课程从velocity engine也就是velocity引擎开始, 先讲解velocity的基本使用以及基础语法 , 然后再讲解velocity 的进阶内容velocity Tools , 以及velocity作为web项目的视图改如何使用 , 每一部分都会有一个综合案例...
通过这个"struts2+Velocity替换jsp项目源码",你可以学习到如何将一个传统的基于JSP的Web应用转换为使用Velocity作为视图层,从而提升项目的可维护性和性能。这是一个很好的实践案例,对于深入理解和掌握Struts2与...
- **高效性能**:Velocity在编译模板后生成Java源码,然后由JVM执行,这使得其运行速度快且资源消耗低。 - **可扩展性**:Velocity Tools和其他扩展可以增加更多功能,如国际化、表单处理等。 然而,需要注意的是,...
Velocity 是一款基于 Java 的模板引擎,它被广泛应用于 Web 开发中,特别是作为 Apache Struts 和 Spring MVC 框架的一部分。Velocity 插件则是为了在开发环境中提供对 Velocity 模板语言的支持,使得开发者可以在 ...
Velocity 提供了一种简单而强大的脚本语言——Velocity 模板语言 (VTL),让页面设计者能够在不涉及 Java 代码的情况下插入和处理动态内容。 VTL 的主要特点是通过引用 (references) 来访问和操作由 Java 代码定义的...