velocity简介
- velocity介绍
Velocity是一个基于Java的模板引擎,可以通过特定的语法获取在java对象的数据,填充到模板中,从而实现界面和java代码的分离
- 应用场景
- Web应用程序:作为为应用程序的视图,展示数据。
- 源代码生成 :velocity可用于基于模板生成Java源代码
- 自动电子邮件:网站注册,认证等的电子邮件模板
- 网页静态化:基于velocity模板,生成静态网页
- velocity结构

Velocity主要分为app、context、runtime和一些辅助util几个部分。
- app模块:主要封装了一些接口,暴露给使用者使用。主要有两个类,分别是Velocity(单例)和VelocityEngine。
- Context模块:主要封装了模板渲染需要的变量
- Velocity主要分为app、context、runtime和一些辅助util几个部分。
- Runtime模块:整个Velocity的核心模块,Runtime模块会将加载的模板解析成语法树,Velocity调用mergeTemplate方法时会渲染整棵树,并输出最终的渲染结果。
- RuntimeInstance类为整个velocity渲染提供了一个单例模式,拿到了这个实例就可以完成渲染过程了。
快速入门
1.需求分析
使用velocity定义html模板,将动态数据填充到模板中,形成一个html
2. 实现步骤
- 创建maven项目

- 引入依赖
<dependency> <groupId>org.apache.velocity
groupId> <artifactId>velocity-engine-core
artifactId> <version>2.2
version>
dependency> <dependency> <groupId>junit
groupId> <artifactId>junit
artifactId> <version>4.13.2
version> <scope>test
scope>
dependency>
- 新建目录vms,然后新建html模板后缀名重名为vm

DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>velocity_01
title>
head> <body> hello,${name}
body>
html>
- 编写测试类生成模板文件
import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.Velocity; import org.junit.Test; import java.io.FileWriter; import java.io.IOException; import java.util.Properties; / * @Author Joker DJ * @Date 2021/7/17 20:32 * @Version 1.0 */ public class velocity01 {
@Test public void test01() throws IOException {
//1.设置velocity的资源加载类 Properties prop = new Properties(); prop.put("file.resource.loader.class","org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); //2.加载velocity引擎 Velocity.init(prop); //3.加载velocity容器 VelocityContext velocityContext = new VelocityContext(); velocityContext.put("name","velocity"); //4.加载velocity模板 Template template = Velocity.getTemplate("vms/01-quikstart.vm", "utf-8"); //5.合并数据 FileWriter fileWriter = new FileWriter("D:\\soft\\software\\work\\学习练习\\velocity\\velocity_01\\src\\main\\resources\\html\\01-quikstart.html"); template.merge(velocityContext,fileWriter); //6.释放资源 fileWriter.close(); } }

基础语法
VTL介绍
Velocity Template Language(VTL),是Velocity中提供的一种模版语言,旨在提供最简单和最干净的方法来将动态内容合并到网页中。简单来说VTL可以将程序中的动态数展示到网页中
VTL的语句分为4大类:注释,非解析内容,引用和指令。
VTL注释
语法
- 行注释
行注释内容
- 块注释
#* 块注释内容1 块注释内容2 *#
- 文档注释
# 文档注释内容1 文档注释内容2 #
示例
DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>velocity_01
title>
head> <body> 行注释内容 #* 块注释内容1 块注释内容2 *# # 文档注释内容1 文档注释内容2 #
body>
html>
非解析内容
所谓非解析内容也就是不会被引擎解析的内容。
语法
#[[ 非解析内容1 非解析内容2 ]]#
示例
DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>velocity_01
title>
head> <body> #[[ 非解析内容1 非解析内容2 ]]#
body>
html>
引用
变量引用
语法
引用语句就是对引擎上下文对象中的属性进行操作。语法方面分为常规语法( 属 性 ) 和 正 规 语 法 ( 属性)和正规语法( 属性)和正规语法({属性})。
$变量名,若上下文中没有对应的变量,则输出字符串"$变量名" ${变量名},若上下文中没有对应的变量,则输出字符串""${变量名}" $!变量名,若上下文中没有对应的变量,则输出空字符串"" $!{变量名},若上下文中没有对应的变量,则输出空字符串""
示例
变量引用 常规语法:$name 正规语法:${name} $变量名,若上下文中没有对应的变量,则输出字符串"$变量名" ${变量名},若上下文中没有对应的变量,则输出字符串""${变量名}" $!变量名,若上下文中没有对应的变量,则输出空字符串"" $!{变量名},若上下文中没有对应的变量,则输出空字符串"" 常规语法:$!name 正规语法:$!{name}
package com.JokerDJ.VelocityTest;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.junit.Test;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;
/
* @Author Joker DJ
* @Date 2021/7/17 20:32
* @Version 1.0
*/
public class velocity02 {
@Test
public void test01() throws IOException {
//1.设置velocity的资源加载类
Properties prop = new Properties();
prop.put("file.resource.loader.class","org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
//2.加载velocity引擎
Velocity.init(prop);
//3.加载velocity容器
VelocityContext velocityContext = new VelocityContext();
// velocityContext.put("name","velocity");
//4.加载velocity模板
Template template = Velocity.getTemplate("vms/02-cite-变量引用.vm", "utf-8");
//5.合并数据
FileWriter fileWriter = new FileWriter("D:\\soft\\software\\work\\学习练习\\velocity\\velocity_01\\src\\main\\resources\\html\\02-cite-变量引用.html");
template.merge(velocityContext,fileWriter);
//6.释放资源
fileWriter.close();
}
}
属性引用
语法
$变量名.属性,若上下文中米有对应的变量,则输出字符串"$变量名.属性" ${变量名.属性}若上下文中没有对应的变量,则输出字符串"${变量名.属性}" $!变量名.病性若上下文中没有对应的变量,则输出字符串"" $!{变量名.属性}若上下文中没有对应的变量,则输出字符串""
示例
变量引用 常规语法:$user.username 正规语法:${user.username} 常规语法:$!user.username 正规语法:$!{user.username}
package com.JokerDJ.VelocityTest; import com.JokerDJ.VelocityTest.Pojo.user; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.Velocity; import org.junit.Test; import java.io.FileWriter; import java.io.IOException; import java.util.Properties; / * @Author Joker DJ * @Date 2021/7/17 20:32 * @Version 1.0 */ public class velocity03 {
@Test public void test01() throws IOException {
//1.设置velocity的资源加载类 Properties prop = new Properties(); prop.put("file.resource.loader.class","org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); //2.加载velocity引擎 Velocity.init(prop); //3.加载velocity容器 user user = new user(); user.setUsername("张三"); VelocityContext velocityContext = new VelocityContext(); velocityContext.put("user",user); //4.加载velocity模板 Template template = Velocity.getTemplate("vms/03-cite-属性引用.vm", "utf-8"); //5.合并数据 FileWriter fileWriter = new FileWriter("D:\\soft\\software\\work\\学习练习\\velocity\\velocity_01\\src\\main\\resources\\html\\03-cite-属性引用.html"); template.merge(velocityContext,fileWriter); //6.释放资源 fileWriter.close(); } }

方法引用
方法引用实际就是指方法调用操作,关注点返回值和参数,方法的返回值将输出到最终结果中
语法
$变量名.方法([入参1[,入参2]*]?),常规写法 ${变量名.方法([入参1[,入参2]*]?)},正规写法 $!变量名.方法([入参1[,入参2]*?),常规写法 $!{变量名.方法([入参1[,入参2]*]?)},正规写法
示例
方法引用 常规语法:$str.split(",")-------$now.getTime() 正规语法:${str.split(",")}-------${now.getTime()} 常规语法:$!str.split(",")-------$!now.getTime() 正规语法:$!{str.split(",")}-------$!{now.getTime()}
package com.JokerDJ.VelocityTest; import com.JokerDJ.VelocityTest.Pojo.user; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.Velocity; import org.junit.Test; import java.io.FileWriter; import java.io.IOException; import java.util.Date; import java.util.Properties; / * @Author Joker DJ * @Date 2021/7/17 20:32 * @Version 1.0 */ public class velocity04 {
@Test public void test01() throws IOException {
//1.设置velocity的资源加载类 Properties prop = new Properties(); prop.put("file.resource.loader.class","org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); //2.加载velocity引擎 Velocity.init(prop); //3.加载velocity容器 VelocityContext velocityContext = new VelocityContext(); velocityContext.put("str","hello,Velocity"); velocityContext.put("now",new Date()); //4.加载velocity模板 Template template = Velocity.getTemplate("vms/04-cite-方法引用.vm", "utf-8"); //5.合并数据 FileWriter fileWriter = new FileWriter("D:\\soft\\software\\work\\学习练习\\velocity\\velocity_01\\src\\main\\resources\\html\\04-cite-方法引用.html"); template.merge(velocityContext,fileWriter); //6.释放资源 fileWriter.close(); } }
指令
set
方法引用 #set($str="hello word") #set($int=10) #set($arr=[1,2,3]) #set($boolean=true) #set($maps={"key1":"value1","key2":"value2"}) 再声明变量的时候 也可以引用变量 #set($name="JokerDJ") #set($map={"key1":$!{name},"key2":"value2"}) 引用变量 获取 字符串:$!{str} 数值型:$!{int} 布尔型:$!{boolean} 数组型:$!{arr} map.key1:$!{map.key1} map.key2:$!{map.key2}
package com.JokerDJ.VelocityTest; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.Velocity; import org.junit.Test; import java.io.FileWriter; import java.io.IOException; import java.util.Date; import java.util.Properties; / * @Author Joker DJ * @Date 2021/7/17 20:32 * @Version 1.0 */ public class velocity05 {
@Test public void test01() throws IOException {
//1.设置velocity的资源加载类 Properties prop = new Properties(); prop.put("file.resource.loader.class","org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); //2.加载velocity引擎 Velocity.init(prop); //3.加载velocity容器 VelocityContext velocityContext = new VelocityContext(); //4.加载velocity模板 Template template = Velocity.getTemplate("vms/05-set指令.vm", "utf-8"); //5.合并数据 FileWriter fileWriter = new FileWriter("D:\\soft\\software\\work\\学习练习\\velocity\\velocity_01\\src\\main\\resources\\html\\05-set指令.html"); template.merge(velocityContext,fileWriter); //6.释放资源 fileWriter.close(); } }

if/elseif/else
#if(判断条件) .... #elseif(判断条件) .... #else .... #end
示例
方法引用 #set($lag="Java") #if($lag.equals("Java")) java开发工程师 #elseif($lag.equals("PHP")) PHP开发工程师 #else 开发工程师 #end
package com.JokerDJ.VelocityTest; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.Velocity; import org.junit.Test; import java.io.FileWriter; import java.io.IOException; import java.util.Properties; / * @Author Joker DJ * @Date 2021/7/17 20:32 * @Version 1.0 */ public class velocity06 {
@Test public void test01() throws IOException {
//1.设置velocity的资源加载类 Properties prop = new Properties(); prop.put("file.resource.loader.class","org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); //2.加载velocity引擎 Velocity.init(prop); //3.加载velocity容器 VelocityContext velocityContext = new VelocityContext(); //4.加载velocity模板 Template template = Velocity.getTemplate("vms/06-if指令.vm", "utf-8"); //5.合并数据 FileWriter fileWriter = new FileWriter("D:\\soft\\software\\work\\学习练习\\velocity\\velocity_01\\src\\main\\resources\\html\\06-if指令.html"); template.merge(velocityContext,fileWriter); //6.释放资源 fileWriter.close(); } }
foreach
#foreach($item in $items) ... [#break] #end
- $items:需要变量的对象或集合
- $item:变量名称,变量的每一项
- [#break]:退出循环
- 内置属性
- f o r e a c h . i n d e x : 获 取 便 利 的 索 引 , 从 0 开 始 2. foreach.index:获取便利的索引,从0开始 2. foreach.index:获取便利的索引,从0开始2.foreach.count:获取遍历的次数,从1开始
示例
#foreach($item in $strs) $item #end #foreach($item in $users) $item.username #end
package com.JokerDJ.VelocityTest; import com.JokerDJ.VelocityTest.Pojo.user; import org.apache.velocity.Template; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.Velocity; import org.junit.Test; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Properties; / * @Author Joker DJ * @Date 2021/7/17 20:32 * @Version 1.0 */ public class velocity07 {
@Test public void test01() throws IOException {
//1.设置velocity的资源加载类 Properties prop = new Properties(); prop.put("file.resource.loader.class","org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); //2.加载velocity引擎 Velocity.init(prop); //3.加载velocity容器 VelocityContext velocityContext = new VelocityContext(); String[] strs = {
"苹果", "三星", "小米", "华为"}; List<user> users = new ArrayList<>(); users.add(new user("小明")); users.add(new user("小蓝")); users.add(new user("小红")); velocityContext.put("strs",strs); velocityContext.put("users",users); //4.加载velocity模板 Template template = Velocity.getTemplate("vms/07-foreach指令.vm", "utf-8"); //5.合并数据 FileWriter fileWriter = new FileWriter("D:\\soft\\software\\work\\学习练习\\velocity\\velocity_01\\src\\main\\resources\\html\\07-foreach指令.html"); template.merge(velocityContext,fileWriter); //6.释放资源 fileWriter.close(); } }

引入资源
include
示例
Title #include("demo8 . vm")
parse
Title #parse("demo8 . vm")
define
#define($模块名称) 模块内容 #end
示例
#define($table)
...
#end 引用定义好的模块 $table
evaluate
< ! DOCTYPE htm1>
Title body>
动态计算
#set($name = "over") #evaluate("#if($name== 'over' ) over #else not over #end") #if($name=='over') over #else not over #end
宏指令
#macro(宏名[$arg]?) ... #end
调用方法
$宏名([$arg]?)
示例
#macro($table $list)
$list
#end 引用定义好的模块 $table($list)
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/178734.html原文链接:https://javaforall.net
