Velocity模板引擎

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

velocity简介

  1. velocity介绍
    Velocity是一个基于Java的模板引擎,可以通过特定的语法获取在java对象的数据,填充到模板中,从而实现界面和java代码的分离
    image.png




  2. 应用场景
  • Web应用程序:作为为应用程序的视图,展示数据。
  • 源代码生成 :velocity可用于基于模板生成Java源代码
  • 自动电子邮件:网站注册,认证等的电子邮件模板
  • 网页静态化:基于velocity模板,生成静态网页
  1. velocity结构
    image.png

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. 实现步骤

  1. 创建maven项目
    image.png

  2. 引入依赖
 <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> 
  1. 新建目录vms,然后新建html模板后缀名重名为vm
    image.png

 
    DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>velocity_01 
      title>  
       head> <body> hello,${name}  
        body>  
         html> 
  1. 编写测试类生成模板文件
 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(); } } 

image.png

基础语法

VTL介绍

Velocity Template Language(VTL),是Velocity中提供的一种模版语言,旨在提供最简单和最干净的方法来将动态内容合并到网页中。简单来说VTL可以将程序中的动态数展示到网页中

VTL的语句分为4大类:注释非解析内容引用和指令

VTL注释

语法
  1. 行注释
 行注释内容 
  1. 块注释
#* 块注释内容1 块注释内容2 *# 
  1. 文档注释
# 文档注释内容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(); } } 

image.png

方法引用

方法引用实际就是指方法调用操作,关注点返回值和参数,方法的返回值将输出到最终结果中

语法
$变量名.方法([入参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(); } } 

image.png

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]:退出循环
  • 内置属性
    1. f o r e a c h . i n d e x : 获 取 便 利 的 索 引 , 从 0 开 始 2. foreach.index:获取便利的索引,从0开始 2. foreach.index便02.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(); } } 

image.png

引入资源

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

(0)
上一篇 2026年3月26日 下午4:36
下一篇 2026年3月26日 下午4:36


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号