velocity模板引擎
Velocity 是一个基于Java的模板引擎 , 能够将静态模板文件 , 动态的生成内容 . 将模板文件与Java代码结合使用 , 最终得到理想的输出数据.
# 语法
# 引用变量
语法 : $
变量引用
通过占位符替换 (假设填充替换name)
$name
${name}
$!name
$!{name}
$user.name
提示
- 占位符也可对象属性引用
- 携带有
!
判断操作 , 不存在空白填充 , 否则引用变量值
引用变量
- $name
- ${name}
- $!name
- $!{name}
- $!{name2}
#*
引用变量
- 柏竹
- 柏竹
- 柏竹
- 柏竹
-
*#
# 非解析变量
不进行对内容解析操作
语法 : #[[$name]]#
# 注释
行注释
##
块注释
#*<注释内容>*#
# 方法引用
Java对象都会有方法也可在当中引用
假如 : names为 "张三、李四、王五"字符串
$names.split("、")
$names.split("、").length
$names.split("、").max()
#*
[张三, 李四, 王五]
$names.split("、").length
$names.split("、").max()
*#
不能嵌套引用
# 定义变量
基础语法 : #set($str=<值>)
变量设置
1.数值
#set($num=100)
=> $num
2.字符串
#set($str="hello world")
=> $str
3.数组
#set($arr=["a","b","c"])
=> $arr
4.布尔值
#set($bool=true)
=> $bool
#*
变量设置
1.数值
=> 100
2.字符串
=> hello world
3.数组
=> [a, b, c]
4.布尔值
=> true
*#
# 逻辑判断
语法 : #if(<表达式>) <控制语句1> #else <控制语句2> #end
#set($bool=true)
#if ($bool)
bool is true
#else
bool is false
#end
支持嵌套
#set($num=10)
#if ($num>10)
num is greater than 10
#elseif ($num>5)
num is greater than 5
#else
num is less than 5
#end
# 循环
语法 : #foreach($item in $arr) <循环代码> #end
内置属性
引用 | 说明 |
---|---|
$foreach.index | 获取循环遍历的索引 (从0开始) |
$foreach.count | 获取循环遍历的总计数 |
#set($arr=["a","b","c"])
#foreach($item in $arr)
=> {item:$item, index:$foreach.index, count:$foreach.count}
#end
#*
=> {item:a, index:0, count:1}
=> {item:b, index:1, count:2}
=> {item:c, index:2, count:3}
*#
跳出循环
语法 : #break
(在循环中使用)
跳出循环
#set($arr=["a","b","c"])
#foreach($item in $arr)
=> {item:$item, index:$foreach.index, count:$foreach.count}
#if($foreach.index>=1)
#break
#end
#end
#*
跳出循环
=> {item:a, index:0, count:1}
=> {item:b, index:1, count:2}
*#
# 引入模板
引入模板有三种指令形式
指令 | 说明 |
---|---|
#include | 引入外部模板 , 不对其解析 |
#parse | 引入外部模板 , 并对其解析 |
#define | 引入复用模板 , 不携带参数 |
#macro | 引入复用模板 , 携带参数 |
# 外部模板
#include
在相同资源目录再一个模板直接引用即可
#include("vm/test.vm")
不解析里面的占位符信息
#parse
引入模板并的对其解析
#parse("vm/test.vm")
内外不定义的变量是互通的
点击展开 代码示例
index.vm
引入模板
#set($truename="tom1")
#include("vm/test.vm")
=> $truename
引入模板携带解析
#set($truename="tom2")
#parse("vm/test.vm")
=> $truename
#*
引入模板
模板2测试
$truename
#set($truename="tom2")
=> tom1
引入模板携带解析
模板2测试
tom2
=> tom3
*#
test.vm 外部
模板2测试
$truename
#set($truename="tom3")
# #define
语法 : #define(<模板名>)
声明模块
#define($module)
- 模块应用
#end
$module
$module
$module
#*
声明模块
- 模块应用
- 模块应用
- 模块应用
*#
模块中定义变量与能互通应用
模块互通变量测试
#define($module1)
#set($username="tom")
#end
#define($module2)
$username
#end
$module1
$module2
=> $username
#*
模块互通变量测试
tom
=> tom
*#
# #macro
语法
#macro(宏名称 [$ages])
...
#end
## 调用
#宏名称([$ages])
示例
宏指令
#macro(macroModule $name,$age)
用户信息
- $name
- $age
#end
#macroModule("张三",13)
#macroModule("李四",23)
#macroModule("王五",33)
#macroModule("赵六",43)
#*
宏指令
用户信息
- 张三
- 13
用户信息
- 李四
- 23
用户信息
- 王五
- 33
用户信息
- 赵六
- 43
*#
# 计算指令
#evaluate
计算指令
#set($bool=true)
#evaluate("#if($bool) bool is true #else bool is false #end")
#*
计算指令
bool is true
*#
# Java应用
依赖
<!--velocity代码生成模板引擎-->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
</dependency>
示例
public static void main(String[] args) throws IOException {
// 1. 设置 velocity 资源加载器
Properties properties = new Properties();
properties.put("file.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
Velocity.init(properties);
// 2. 创建 velocity 容器 , 并写入数据
VelocityContext context = new VelocityContext();
context.put("name","老王");
SysUser user = new SysUser();
user.setUserName("柏竹");
context.put("user",user);
context.put("names","张三、李四、王五");
// 3. 加载模板
Template template = Velocity.getTemplate("vm/index.vm", "UTF-8");
String path = "D:\\Drill\\GitTemp\\RuoYi-Vue-Plus\\bozhu-demo\\src\\main\\resources\\vm\\index.html";
FileWriter writer = new FileWriter(path);
// 4. 合并数据到模板
template.merge(context, writer);
writer.close();
}