- 定义
Velocity是一个基于java的模板引擎,它允许任何人仅仅使用模板语言来引用由java代码定义的对象. 它还可以从模板中生成SQL语句或其它脚本提供给web pages. 它也可以独立使用---做为一个工具类(utility class)用来生成源代码、报表、邮件模板等.
- VTL语法
- 注释
- 单行注释 “##”
- 注释
## 页面对变量赋值
-
-
- 多行注释 “#**#”
-
#*页面对变量赋值*#
-
- 引用(Reference)
- 变量
- 引用(Reference)
格式:$ VTL标识符
VTL标识符:字母、数字、”_”、”-“组成
#set($company = "merit") $monn = $company
一般方式:$mud-Slinger_9
静态(输出原始字面):$!mud-Slinger_9
正规格式:${mud-Slinger_9}
-
-
- 属性
-
格式:$VTL标识符.VTL标识符
$monn.Address $monn.getAddress()(getter()方法)
-
-
- 方法
-
格式:$VTL标识符(参数列表)
$monn.getAddress() $page.setTitile("My Home") $person.setAttributes(["page1","page2","page3"])
-
- 指令(Directives)
- #set 变量的定义
- 指令(Directives)
格式:#set(LHS = RHS)
LHS:变量引用、属性引用、简单算术表达式
RHS:引用、字符串、数字、ArralList、Map,如果RHS的结果为null,是不会赋值给LHS。
String:
双引号:原样输出
单引号:会被替换成相应的值
#set($monkey = $bill) ##变量引用 #set($monkey.Friend = "cat") ##字符串 #set($monkey.Blame = $cat.Blame) ##属性应用 #set($monkey.Number = 123) ##数字 #set($monkry.say = ["Not",$my,"$ga"]) ##集合 #set($value = $foo+1) ##加法运算 #set($root = "www") #set($tem = "index.vm") #set($template = $root/$tem)##引用的拼接,输出结果为www/index.vm
-
-
- #if #else if #else 条件判断
-
#if($foo) Velocity #end
#if中的关系和逻辑符号:
<、<=、==、>=、>、$$、||、!
-
-
- #foreach 条件循环
-
#foreach($product in $allProducts) $product #end
$allProducts:变量的内容,Vector,Hashtable、ArrayList
$product:被显示的值
默认的循环次数引用变量名为#velocityCount,可以在配置文件velocity.properties中修改你想要的:
directive.foreach.counter.name = velocityCount
directive.foreach.counter.initial.value = 1
#可以对所有可循环次数加一个最大值来控制,默认的是-1,表示无限制
directive.foreach.maxloops = -1
-
-
- #include 引入本地文件
-
- 导入的文件内容不会被模板引擎解析
- 出于安全考虑,导入文件引该放到TEMPLATE_ROOT目录下
- 一次可以导入多个文件,文件名之间用逗号隔开
- 通常使用变量引用替代文件名
#include("aaa.txt",aata)
-
-
- #parse 引入其他模板
-
模板引擎会解析导入的模板引擎的VTL语句。
#parse("parse.vm")
-
-
- #stop 停止模板引擎的执行并返回,在Debug时很有用
- #macro VTL的宏指令
-
- 允许定义一段重复使用的VTL模板(Velocimacros)
- 默认情况下,宏保存在VM_global_library.vm文件中
- Velocimacros可以有0或多个参数
- ##创建VTL宏showTree #macro(showTree) #if($treeList) #foreach($e in $value) $e #end #end #end ##调用 #showTree() ##创建VTL带参数的宏 #macro(showList $val) #if($value) #foreach($e in $val) $e #end #end #end ##调用 $showList($treeList)
- VTL的实际应用
- 初始化Velocity
- 创建Context对象
- 添加数据到Context
- 选择模板合并模板和数据产生输出页面
public static void main(String args) throws IOException { //1)初始化 Velocity.init(); //2)创建Context VelocityContext velocityContext = new VelocityContext(); //3)添加数据到Context velocityContext.put("name","Velocity"); BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(System.out)); Template template = Velocity.getTemplate("src/com/me/velocity/index.vm"); //4)合并模板和数据输出到页面 template.merge(velocityContext,bufferedWriter); bufferedWriter.flush(); bufferedWriter.close(); }
index.vm
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> </head> <body> <!-- 页面对变量赋值 --> #set( $current = "Velocity22") <!-- 输出 --> $current is great! <br/><br> <!-- 输出后台context设置的参数 --> $name <br/> <!--String循环--> #foreach( $elem in $arrList) $elem</br> #end <!--对象循环--> #foreach( $elem in $userList) 名字:$elem.name 性别:$elem.sex 地址:$elem.address</br> #end hello $name </body> </html>
- Velocity与MVC架构的关系
- Velocity与JSP
与JSP相比,作为一种完全自包含的模板引擎和脚本解释器,Velocity拥有完全封闭的模型。任何针对系统或Java编程语言的访问都必须明确地启用。默认情况下,Velocity模板不能访问Java编程语言的任何方面。这种封闭的模型使Velocity能够提供分离的模板表示层,与任何应用程序业务逻辑或者数据管理代码清晰地划分开,实现真正的MVC。
-
- Velocity与Struts
对于Velocity在View层的实际应用,只要在Struts-config.XML里配置好后,就可以在ACTION中直接将其mapping.forward(“success”)即可。
<action path=”/logoff”
type=”org.apache.struts.webapp.example.LOgoffAction”>
<forward name=”success” path=”/index.vm”>
</action>
- 静态引用输出
Velocity遇到一个不能处理的引用时,一般他会直接输出这个引用$email的写法,页面上会看到的是$email,如下例,我们可以在$后面加上一个!号,那么就会输出空白:
- 方法
附:
velocity官网:http://velocity.apache.org/
velocity语法参考:http://velocity.apache.org/engine/devel/vtl-reference.html
源代码参考:https://github.com/xujijun/my-spring-boot