首页 > 其他分享 >Velocity模板引擎

Velocity模板引擎

时间:2023-05-30 16:34:14浏览次数:32  
标签:输出 引擎 模块 velocity Velocity 变量名 模板

一、什么是Velocity

  Velocity是一个基于Java的模板引擎,其提供了一个Context容器,在java代码里面我们可以往容器中存值,然后在vm文件中使用特定的语法获取。通过Context数据容器+模板内容进行合并,可以输出html、java、sql、xml等一切需要的文本类文件。

  作为一个模块引擎,除了作为前后端分离的MVC视图层,Velocity还可以用于源代码生成、自动email、xml转换等。

  Velocity主要分为app、context、runtime、util等部分,作用如下:

  • app模块:封装了一些接口,暴露给使用者使用。主要有两个类,分别是Velocity(单例)和VelocityEngine。
  • Context模块:封装了模板渲染需要的变量。
  • Runtime模块:整个Velocity的核心模块,Runtime模块会将加载的模板解析成语法树,Velocity调用mergeTemplate方法时会渲染整棵树,并输出最终的渲染结果。
  • RuntimeInstance类:为整个velocity渲染提供了一个单例模式,拿到了这个实例就可以完成渲染过程。

二、Velocity的使用步骤

  1、引入依赖:

<!--velocity核心包-->
<dependency>
    <groupId>org.apache.velocity</groupId>
    <artifactId>velocity-engine-core</artifactId>        
    <version>2.2</version>
</dependency>

  2、编写模板:在resources/vm/下新建.vm文件,.vm文件就是velocity模板文件的扩展名。模板的内容根据你想要生成的文件的类型来决定,随你怎么写都可以。

  3、加载模板输出文件\流:根据如下步骤编写代码。

  • 设置velocity的资源加载器;
  • 初始化velocity引擎;
  • 创建velocity容器;
  • 加载velocity模板文件;
  • 合并数据到模板文件;
  • 输出合并后的结构流或者文件;
  • 释放资源。
 //实例化资源加载器
Properties p = new Properties();

 // 加载classpath目录下的vm文件
p.setProperty("resource.loader.file.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");

// 定义字符集
p.setProperty(Velocity.INPUT_ENCODING, Constants.UTF8);

// 初始化Velocity引擎,指定配置Properties
Velocity.init(p);

//创建容器,加入渲染模板需要的变量
VelocityContext velocityContext = new VelocityContext();
velocityContext .put("varName","varValue");

//根据模板名称装载模板对象
Template tpl = Velocity.getTemplate("templateName", Constants.UTF8);

// 渲染模板:输出为字符串时使用
StringWriter sw = new StringWriter();

// 渲染模板:输出到指定文件时使用
FileWriter  fw= new FileWriter("fileName");


//执行数据+模板合并,输出最终结果
  tpl.merge(velocityContext , sw);
  tpl.merge(velocityContext , fw);

//释放资源
sw.close();
fw.close();

三、Velocity的语法

  Velocity提供了一叫做VTL的模板语言,能够简单明了的进行数据和模板的整合,它有四大类语句,分别为注释、非解析内容、引用和指令。

1、注释:注释包括行注释、块注释、文档注释。这些注释只用于开发者阅读,不会被生成到输出文件/流中。

## 这是一个单行注释

#*
*
*  这是多行注释
*
* *#

#**
*
*  这是文档注释
*
* *#

 2、非解析内容:这部分内容将会被原样显示,即使包含变量占位符也不会被替换。

#[[
.....

这里面的内容将被原样输出,即使存在变量占位符${xxx}也不会被替换。
......

]]#

3、变量引用、属性引用、方法引用:引用是对引擎上下文对象中的属性进行调用,分为常规语法($xxx)和正规语法(${xxx})。

$变量名:若上下文中没有对应的变量,则输出字符串"$变量名"
${变量名}:若上下文中没有对应的变量,则输出字符串"${变量名}"
$!变量名:若上下文中没有对应的变量,则输出空字符串""
$!{变量名}:若上下文中没有对应的变量,则输出空字符串""

$变量名.属性:若上下文中没有对应的变量,则输出字符串"$变量名.属性"
${变量名.属性}:若上下文中没有对应的变量,则输出字符串"${变量名.属性}"
$!变量名.属性:若上下文中没有对应的变量,则输出空字符串""
$!{变量名.属性}:若上下文中没有对应的变量,则输出空字符串""

$变量名.方法([入参1[,入参2]*]?)
${变量名.方法([入参1[,入参2]*]?)}
$!变量名.方法([入参1[,入参2]*]?)
$!{变量名.方法([入参1[,入参2]*]?)}

4、指令:主要用于定义重用模块、引入外部资源、流程控制。指令以#作为起始字符。

/**
*#set指令用于定义一个变量
**/
#set($变量=值) 

/**
*#if #else 用于条件判断,#end表示结束
**/
#if(判断条件)
..............
#elseif(判断条件)
..............
#else
..............
#end

/**
*#foreach 用于循环变量一个集合; #break用于结束循环,可选;在循环体内可以使用$foreach.index/$foreach.count获取遍历的索引和次数
**/
#foreach($item in $items)
     .............
     [#break]
     .............
#end

5、引用:用于引入资源。

/**
* #include用于引入一个外部资源,参数resourcePath指定资源的路径,该资源不会被解析器解析
*/
#include(resourcePath)

/**
* #parse用于引入一个外部资源,参数resourcePath指定资源的路径,该资源会被解析器解析
*/
#parse(resourcePath)

/**
* #define用于定义重用模块,不可携带参数。定义后可使用 $模块名称 来引用
*/
#define($模块名称)
.....模块内容.....
#end

/**
* #macro用于定义重用模块,可以携带参数。定义后可以使用 #宏名称(实数) 指令进行调用
*/
#macro(宏名称 [可选参数])
.....模块内容.....
#end

/**
* #evaluate用于动态计算,参数express为计算表达式字符串。evaluate方法可以把字符串当作代码进行运行并得出结果
*/
#evaluate(express)

 四、VelocityTools工具类

  VelocityTools是Velocity模板引擎的一个子项目,用于将Velocity 与 Web开发环境集成的工具包。该工具包包含GenericTools和VelocityView两部分。

  GenericTools是一组可以在模板中直接调用的工具类库,里面包含了很多工具类,常用的有DateTool、NumberTool、MathTool、DisplayTool、EscapeTool、FieldTool、ContextTool、RenderTool、SortTool、CollectionTool、XmlTool,使用时需要导入依赖:

<!-- velocityTools工具包-->
<dependency>
     <groupId>org.apache.velocity.tools</groupId> 
     <artifactId>velocity-tools-generic</artifactId> 
     <version>3.0</version>
</dependency>

  Velocityview包含所有cenericTools并添加了用于在Web应用程序(Java EE项目)的视图层中使用Velocity的基础结构和专用工具,里面包含了CookieTool、BrowswerTool、ParameterTool、ViewContextTool等工具类。使用时也需要导入:

<!-- velocityView工具包-->
<dependency>
     <groupId>org.apache.velocity.tools</groupId> 
     <artifactId>velocity-tools-generic</artifactId> 
     <version>3.0</version>
</dependency>
<dependency>
     <groupId>org.apache.velocity.tools</groupId> 
     <artifactId>velocity-tools-view</artifactId> 
     <version>3.0</version>
</dependency>

标签:输出,引擎,模块,velocity,Velocity,变量名,模板
From: https://www.cnblogs.com/zqhIndex/p/17442772.html

相关文章

  • 在线打印模板设计工具 - XMReport
    关于XMReportXMReport是一款在线打印模板设计工具,支持在浏览器中进行打印模板设计,预览等,无需安装本地插件。并提供Java后端生成引擎,JavaScript生成引擎。同时XMReport是一个很好的JasperReport/ActiveReport,水晶报表等产品替代。先简单你介绍一下XMReport的特性吧:国内首款基于......
  • 火山引擎DataLeap的Catalog系统搜索实践(一):背景与功能需求
    火山引擎DataLeap的DataCatalog系统通过汇总和组织各种元数据,解决了数据生产者梳理数据、数据消费者找数和理解数的业务场景,其中搜索是DataCatalog的主要功能之一。本文详细介绍了火山引擎DataLeap的Catalog系统搜索实践:功能的设计与实现。 DataCatalog能够帮助大公司更好......
  • 3D轻量化引擎工具助力Canvas GFX开发插图新产品,可视化视图更精准!
    增材制造和3D打印不乏创新技术,无论是硬件变得更加高效和准确,还是材料科学的巨大进步,都拓宽了3D打印部件的使用范围。然而,Techsoft3D作为软件组件供应商,关注点更多的是在将这两个元素结合在一起的效果,即驱动现代打印机发展并支持使用先进材料的软件平台。凭借超过26年开发工程专......
  • ByConity与主流开源OLAP引擎(Clickhouse、Doris、Presto)性能对比分析
    引言:随着数据量和数据复杂性的不断增加,越来越多的企业开始使用OLAP(联机分析处理)引擎来处理大规模数据并提供即时分析结果。在选择OLAP引擎时,性能是一个非常重要的因素。因此,本文将使用TPC-DS基准测试的99个查询语句来对比开源的ClickHouse、Doris、Presto以及ByConity这4个OLAP......
  • 微信小程序 WXSS模板样式,全局和页面配置,网络请求
    【黑马程序员前端微信小程序开发教程,微信小程序从基础到发布全流程_企业级商城实战(含uni-app项目多端部署)】https://www.bilibili.com/video/BV1834y1676P/?p=26&share_source=copy_web&vd_source=03c1dc52eeb3747825ecad0412c18ab1WXSS模板样式1.什么是WXSSWXSS(WeiXin......
  • 莉莉丝游戏与火山引擎 ByteHouse 达成合作,为实时数仓建设提速
    中国头部游戏公司莉莉丝游戏(Lilith)和火山引擎ByteHouse达成合作,共同致力于加速莉莉丝游戏的实时数仓建设。此次合作将利用ByteHouse的创新技术和功能,为广告运营分析业务提效提供全面支持和帮助。莉莉丝游戏是中国中生代游戏公司代表,在中国游戏市场保持领先地位。为了支持其日......
  • 模板模式:一种体现多态的设计模式
    0x01:模板模式模板模式(Template),又叫模板方法模式(TemplateMethod),在一个抽象类公开定义了执行它的方法的模板。它的子类可以按需重写方法实现,但调用将以抽象类中定义的方式进行。模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,......
  • Wpf基础入门——模板和样式(Template&Style)
    本篇文章学习于:刘铁猛老师《深入浅出WPF》什么是模板?在WPF中,通过引入模板(Template)微软将数据和算法的“内容”与“形式”解耦了。WPF中的Template分为两大类:ControlTemplate是算法内容的表现形式,一个控件怎样组织其内部结构才能让它更符合业务逻辑、让用户操作起来更舒服就......
  • super()在 Django 模板视图中使用
    Django模板视图用于呈现HTML模板并将数据传递给它们以供显示。super()您可以在Django模板视图中使用,轻松地从父模板视图继承属性和方法,并根据需要自定义或扩展它们。Django模板视图的一种常见用法super()是在get_context_data方法中,该方法用于将数据传递给模板以进行渲染。......
  • 关于模板方法设计:抽象类
       ......