Template Engine-04-模板引擎 Velocity 入门例子+FreeMarker 和 Velocity 对比表格

拓展阅读

java 表达式引擎

logstash 日志加工处理-08-表达式执行引擎 AviatorScript+MVEL+OGNL+SpEL+JEXL+JUEL+Janino

QLExpress 阿里表达式引擎系统学习

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应用程序。

快速入门

Velocity 代码地址

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开发
相关推荐
@yanyu66620 分钟前
springboot实现查询学生
java·spring boot·后端
ascarl201025 分钟前
准确--k8s cgroup问题排查
java·开发语言
magic 24529 分钟前
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
java
爱敲代码的憨仔36 分钟前
分布式协同自动化办公系统-工作流引擎-流程设计
java·flowable·oa
纪元A梦1 小时前
分布式拜占庭容错算法——PBFT算法深度解析
java·分布式·算法
卿着飞翔1 小时前
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
java·rabbitmq·java-rabbitmq
fpcc1 小时前
跟我学c++中级篇——理解类型推导和C++不同版本的支持
开发语言·c++
陈阿土i1 小时前
SpringAI 1.0.0 正式版——利用Redis存储会话(ChatMemory)
java·redis·ai·springai
莱茵菜苗1 小时前
Python打卡训练营day46——2025.06.06
开发语言·python
爱学习的小道长1 小时前
Python 构建法律DeepSeek RAG
开发语言·python