基本语法

在 hellovelocity.vm 里面可以看到很多以 # 和$符开头的内容,这些都是 Velocity 的语法,在 Velocity 中所有的关键字都是以 # 开头的,而所有的变量则是以$开头。

一、变量

变量定义

#set($name="velocity")

等号后面的字符串 Velocity 引擎将重新解析,例如出现以$开始的字符串时,将做变量的替换。以 "$" 开头,第一个字符必须为字母

变量可以包含的字符有以下内容:

  • alphabetic (a .. z, A .. Z)

  • numeric (0 .. 9)

  • hyphen ("-")

  • underscore ("_")

变量使用

${name}

或

$name

在模板文件中使用$name 或者${name} 来使用定义的变量。推荐使用${name} 这种格式,因为在模板中同时可能定义了类似$name 和$names 的两个变量,如果不选用大括号的话,引擎就没有办法正确

识别$names 这个变量。

对于一个复杂对象类型的变量,例如$person,可以使用${person.name} 来访问 person 的 name 属性。值得注意的是,这里的${person.name} 并不是直接访问 person 的 name 属性,而是访问 person 的

getName() 方法,所以${person.name} 和${person.getName()} 是一样的,即${person.name}=${person.getName()}【1】

变量赋值

在第一小点中,定义了一个变量,同时给这个变量赋了值。对于 Velocity 来说,变量是弱数据类型的,可以在赋了一个 String 给变量之后再赋一个数字或者数组给它。可以将以下六种数据类型赋给一

个 Velocity 变量:变量引用, 字面字符串, 属性引用, 方法引用, 字面数字, 数组列表。

  • #set($foo = $bar)

  • #set($foo =“hello”)

  • #set($foo.name = $bar.name)

  • #set($foo.name = $bar.getName($arg))

  • #set($foo = 123)

  • #set($foo = [“foo”,$bar])

注意

1、右值是null, 则左值不会被赋值,也就是说会保留以前的值。

#set( $monkey = "monica" )
#set( $monkey = $monkey_a ) $monkey 

结果输出:monica,因为右边的$monkey_a并没有定义过

2、velocity模板中不会将reference解释为对象的实例变量,详情见上方【1】

3、变量的作用域 是从上而下往后的都会有

A $monkey
<div class="list">
<div class="item">
<div class="inner-title”>
#set( $monkey = “jerry" )
<span class="color_bg point"></span>保障额度高
B $monkey
</div>
<div class="inner-list">
<p>年度基础免赔额:<span class="color bold">1万元</span>&nbsp;</p>
</div>
C
$monkey
</div>
<div class="item">
D
$monkey
<div class="inner-title">
<span class="color_bg point"></span>住院医疗金
</div>
<div class="inner-list">
<p>重症监护费用:不设单项最高年限额</p>
</div>
</div>
E
$monkey
</div> // 以上ABCDE的输出结果是
// 输出结果: 除了A是字符串显示$monkey , 其余的都是:jerry

二、循环

#foreach($element in $list)
This is $element
$velocityCount
#end

Velocity 引擎会将 list 中的值循环赋给 element 变量,同时会创建一个$velocityCount 的变量作为计数,从 1 开始,每次循环都会加 1.

#foreach循环得到的是值,和es6中的for...of相似

velocityCount变量在配置文件中定义:

# Default name of the loop counter

# variable reference.

directive.foreach.counter.name = velocityCount

# Default starting value of the loop

# counter variable reference.

directive.foreach.counter.initial.value = 1

自带方法:

$foreach.index //自带方法 : 计数从0开始 相当于index

$foreach.hasNext //自带方法 : 等于false代表是最后一个

$foreach.count //自带方法 : 计数 从1开始 相对于$velocityCount

$foreach.first //自带方法 : 是否是第一个

$foreach.last //自带方法 : 是否是最后一个

#break:

使用 #break指令在任何时候停止循环

#if( $foreach.count > 3 )
#break
#end

三、条件语句

形式一:#if #elseif #else #end

#if(condition)
...
#elseif(condition)
…
#else
…
#end

形式二:#if #else #end

#if(condition)
...
#else
…
#end

形式二:#if  #end

#if(condition)
…
#end

四、关系操作符

Velocity 引擎提供了 AND、OR 和 NOT 操作符,分别对应&&、||和!

#if($foo && $bar)
#end #if($foo || $bar)
#end #if(!$bar)
#end

五、宏

Velocity 中的宏可以理解为函数定义。

定义

#macro(macroName arg1 arg2 …)
...
#end

macroName:宏的名字

arg1 / arg2:宏的参数

调用

#macroName(arg1 arg2 …)

这里的参数之间使用空格隔开

宏的例子

#macro(sayHello $name)
hello $name
#end
#sayHello(“velocity”)
// 输出的结果为 hello velocity

⚠️不推荐在界面模板中大量使用,经过测试,宏不支持方法重载

六、#parse 和 #include

#parse 和 #include 指令的功能都是在外部引用文件,而两者的区别是,#parse 会将引用的内容当成类似于源码文件,会将内容在引入的地方进行解析,#include 是将引入文件当成资源文件,会将引

入内容原封不动地以文本输出。分别看以下例子:

// foo.vm 文件:
#set($name =“velocity”) // parse.vm:
#parse(“foo.vm”) // 输出结果为:velocity // include.vm:
#include(“foo.vm”) // 输出结果为:#set($name =“velocity”)

⚠️包含文件#inclue("模板文件名")或#parse("模板文件名"),主要用于处理具有相同内容的页面,比如每个网站的顶部或尾部内容。

七、注释

单行注释:##

多行注释:#*  *#

文档格式注释:#**  *#

八、单引号和双引号

#set ($var="helo")

test"$var" 返回testhello:双引号解析变量

test'$var' 返回test'$var':单引号不解析变量

可以通过设置 stringliterals.interpolate=false改变默认处理方式

补充

读取不同数据的方法:

.get()

.getString()

.getJSONArray()

.getJSONObject()

.getBooleanValue()

数组的常用方法操作:

$myarray.isEmpty()数组是否为空

$myarray.size()获取数组元素个数

$myarray.get(2)获取数组指定下标的元素

$myarray.add()增加元素

参考

官网

使用 Velocity 模板引擎快速生成代码

《Apache Velocity用户指南》官方文档

artTemplate之初印象的更多相关文章

  1. Vue.js之初印象

    一.背景 MVVM模式,很多人在说在用,好吧,我落后了,我目前的项目木有用到MVVM模式的框架,vuejs,reactjs,angularjs,nonono,自己去捣鼓过ng,项目木有用到.实在不敢称 ...

  2. Django初印象之视图(view)

    一.view的初印象 一个视图函数(类),简称视图.我们发起web请求时,返回的web响应.[大家约定成俗将视图放置在项目(project)或应用程序(app)目录中的名为views.py的文件中.] ...

  3. 初印象至Vue路由

    初印象系列为快速了解一门技术的内容,后续会推出本人应用这门技术时发现的一些认识. Vue路由和传统路由的区别: Vue路由主要是用来实现单页面应用内各个组件之间的切换,同样支持传递参数等功能.而传统路 ...

  4. OpenCL学习笔记(一):摩尔定律,异构计算与OpenCL初印象

    欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld.  技术交流QQ群:433250724,欢迎对算法.技术.应用感兴趣的同学加入. 关于摩尔定律: 摩尔定律19 ...

  5. [强化学习]Part1:强化学习初印象

    引入 智能 人工智能 强化学习初印象 强化学习的相关资料 经典书籍推荐:<Reinforcement Learning:An Introduction(强化学习导论)>(强化学习教父Ric ...

  6. Three 之 Animation 初印象

    Animation 初印象 动画效果 播放动画需要基本元素 AnimationMixer 一个对象所有动作的管理者 用于场景中特定对象的动画的播放器.一个对象可能有多个动作,Mixer 是用来管理所有 ...

  7. [置顶] Retrofit2 初印象?

    鄙人由于工作繁忙很久没写博客了还望大家谅解!之前csdn登不上,算了不说借口了,retrofit2相信已经很火了吧,而且上手也比较容易,之前可能大家都是用Volley,Okhttp.Okhttp3其实 ...

  8. AngularJS 初印象------对比 Asp.net MVC

    之前就早耳闻前端MVC的一些框架,微软自家的Knockout.js,google家的AngularJs,还有Backone.但未曾了解,也不解为什么前端也要这么分.这两天看了AngularJs的官方教 ...

  9. Web API初印象

    理解REST,RESTful和Web API 1.REST:Representational State Transfer表征状态转移,是Roy Fielding博士在2000年他的博士论文中提出来的 ...

随机推荐

  1. C# 隐藏最大化、最小化和关闭三个按钮

    在Windows的窗体编程中,基本上每一个窗体都是一个最小化.最大化和关闭按钮的. 一.禁用最大化和最小化 对于最大化和最小化按钮,在C#窗体开发时,各一个属性来启用或禁用这两个按钮. this.Ma ...

  2. 17秋 软件工程 团队第五次作业 Alpha

    题目:团队作业--Alpha冲刺 17秋 软件工程 团队第五次作业 Alpha 12次Scrum 第一次Scrum 第二次Scrum 第三次Scrum 第四次Scrum 第五次Scrum 第六次Scr ...

  3. Ant Design Pro的dva-loading

    loading为dva的插件,全局可用,它里面维护了一些布尔值,用于控制loading动画效果的显示与隐藏,通过@connect()来注入使用 官网介绍如下: https://dvajs.com/ 在 ...

  4. springboot常见写法

    访问html文件 对于aa.html页面,采用跳转到方式:放在templates目录下时,要加一个thymeleaf依赖,并在controller跳转. 不用跳转到方式: 将依赖去掉,将control ...

  5. C# Lambda 表达式学习之(四):动态构建类似于 c => c.Age == 2 || c.Age == 5 || c => c.Age == 17 等等一个或多个 OrElse 的表达式

    可能你还感兴趣: 1. C# Lambda 表达式学习之(一):得到一个类的字段(Field)或属性(Property)名,强类型得到 2. C# Lambda 表达式学习之(二):LambdaExp ...

  6. P1184 高手之在一起(字典树模板题,hash算法, map)

    哎,唯一值得说明的是,这道题的输入有bug 先把字典树的算法模板放一下 #include<iostream> #include<cstring> using namespace ...

  7. 13 python初学(函数)

    函数: 概念:函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可 创建: def 函数名命名规范: a. 必须以下划线或字母开头 b. 区分大小写 c.不能 ...

  8. Node.js读取文件内容并返回值(非异步)

    主要解决的问题的,以最近VsCode插件开发为例,每次请求都需要token,而vscode并不支持cookie这样的存储,所以就采用粗暴点办法,存到某个用户目录下并读取. 源码如下: var fs=r ...

  9. java可重入锁reentrantlock

    public class ReentrantDemo { //重入锁 保护临界区资源count,确保多线程对count操作的安全性 /*public static ReentrantLock rtlo ...

  10. Python脱产8期 Day10 2019/4/24

    一 函数 1.定义:完成 特定 功能的代码块,作为一个整体,对其进行特定的命名,该名字就代表函数>>工具. 2.函数的优点:1.避免代码的冗余:2.让程序结构代码更加清晰:3.让代码更加具 ...