拓展阅读
logstash 日志加工处理-08-表达式执行引擎 AviatorScript+MVEL+OGNL+SpEL+JEXL+JUEL+Janino
Velocity
Velocity 是基于java的模板引擎。
它允许web页面设计人员引用Java代码中定义的方法。
Web设计人员可以与Java程序员并行开发基于模型-视图-控制器(MVC)模型的Web站点,这意味着Web页面设计人员可以只专注于创建一个设计良好的站点,
而程序员可以只专注于编写顶级代码。
Velocity将Java代码从web页面中分离出来,使web站点在长期运行中更易于维护,并提供了Java服务器页面(jsp)或PHP的可行替代方案。
Velocity可以用于从模板生成web页面、SQL、PostScript和其他输出。
它既可以作为生成源代码和报告的独立实用程序使用,也可以作为其他系统的集成组件使用。
完成后,Velocity将为涡轮机web应用程序框架提供模板服务。Velocity+涡轮机将提供一个模板服务,允许根据真正的MVC模型开发web应用程序。
快速入门
jar 引入
xml
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.7</version>
</dependency>
文件目录
.
├── java
│ └── com
│ └── github
│ └── houbb
│ └── tech
│ └── validation
│ └── velocity
│ ├── HelloWorld.java
└── resources
└── hello.vm
HelloWorld.java
java
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.runtime.RuntimeConstants;
import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.StringWriter;
import java.util.Properties;
public class HelloWorld {
public static void main(String[] args) {
Properties pro = new Properties();
pro.setProperty(Velocity.OUTPUT_ENCODING, "UTF-8");
pro.setProperty(Velocity.INPUT_ENCODING, "UTF-8");
pro.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");
pro.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());
VelocityEngine ve = new VelocityEngine(pro);
ve.init();
Template t = ve.getTemplate("hello.vm");
VelocityContext ctx = new VelocityContext();
ctx.put("name", "ryo");
//1. 输出到命令行
outputToConsole(t, ctx);
//2. 输出为文件
outputToFile(t, ctx);
}
/**
* 输出到命令行
*
* @param template 模板
* @param ctx 上下文
*/
private static void outputToConsole(Template template, VelocityContext ctx) {
StringWriter sw = new StringWriter();
template.merge(ctx, sw);
System.out.println(sw.toString());
}
/**
* 输出成为文件
*
* @param template 模板
* @param ctx 上下文
*/
private static void outputToFile(Template template, VelocityContext ctx) {
final String targetFile = "hello.txt";
try (FileOutputStream outStream = new FileOutputStream(targetFile);
OutputStreamWriter writer = new OutputStreamWriter(outStream, "UTF-8");
BufferedWriter sw = new BufferedWriter(writer)) {
template.merge(ctx, sw);
sw.flush();
System.out.println("目标文件生成完成:" + targetFile);
} catch (IOException e) {
e.printStackTrace();
}
}
}
FreeMarker 和 Velocity 对比表格
以下是 FreeMarker 和 Velocity 模板引擎的一些比较,包括语法、特性和使用场景等方面:
特性 / 比较项 | FreeMarker | Velocity |
---|---|---|
语法 | FreeMarker Template Language (FTL) | Velocity Template Language (VTL) |
数据模型 | 支持复杂的数据模型,Java对象、集合等 | 适用于简单数据模型,支持Java对象、Map等 |
模板继承 | 支持模板继承和覆盖 | 支持模板继承,使用 #extends 和 #block 指令 |
条件语句 | 支持 #if , #else , #elseif 等 |
支持 #if , #else , #elseif 等 |
循环语句 | 支持 #list , #foreach 等 |
支持 #foreach ,#break , #continue 等 |
内置指令和函数 | 提供丰富的内建指令和函数 | 提供一些内建指令和函数 |
性能 | 通常被认为比 Velocity 稍快 | 通常速度较慢,但在一些场景下性能足够 |
社区活跃度 | 活跃,有不断的更新和改进 | 较为稳定,社区活跃度相对较低 |
集成 | 与 Spring 等框架集成良好 | 与 Spring 等框架集成,但不如 FreeMarker 成熟 |
适用场景 | 适用于复杂的模板需求,Web和非Web场景 | 适用于简单的模板需求,特别是Web开发 |