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开发
相关推荐
2401_8574396933 分钟前
SSM 架构下 Vue 电脑测评系统:为电脑性能评估赋能
开发语言·php
SoraLuna1 小时前
「Mac畅玩鸿蒙与硬件47」UI互动应用篇24 - 虚拟音乐控制台
开发语言·macos·ui·华为·harmonyos
xlsw_1 小时前
java全栈day20--Web后端实战(Mybatis基础2)
java·开发语言·mybatis
神仙别闹2 小时前
基于java的改良版超级玛丽小游戏
java
Dream_Snowar2 小时前
速通Python 第三节
开发语言·python
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭2 小时前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
暮湫3 小时前
泛型(2)
java
超爱吃士力架3 小时前
邀请逻辑
java·linux·后端
南宫生3 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
转码的小石3 小时前
12/21java基础
java